ChatRAG/Models/VectorSearchResult.cs
2025-06-15 21:34:47 -03:00

145 lines
4.3 KiB
C#

namespace ChatRAG.Models
{
/// <summary>
/// Resultado padronizado de busca vetorial
/// Funciona com qualquer provider (MongoDB, Qdrant, etc.)
/// </summary>
public class VectorSearchResult
{
/// <summary>
/// ID único do documento
/// </summary>
public string Id { get; set; } = string.Empty;
/// <summary>
/// Título do documento
/// </summary>
public string Title { get; set; } = string.Empty;
/// <summary>
/// Conteúdo completo do documento
/// </summary>
public string Content { get; set; } = string.Empty;
/// <summary>
/// ID do projeto ao qual pertence
/// </summary>
public string ProjectId { get; set; } = string.Empty;
/// <summary>
/// Score de similaridade (0.0 a 1.0, onde 1.0 é idêntico)
/// </summary>
public double Score { get; set; }
/// <summary>
/// Embedding vetorial (opcional - nem sempre retornado por performance)
/// </summary>
public double[]? Embedding { get; set; }
/// <summary>
/// Metadados adicionais (tags, categoria, autor, etc.)
/// </summary>
public Dictionary<string, object>? Metadata { get; set; }
/// <summary>
/// Data de criação do documento
/// </summary>
public DateTime CreatedAt { get; set; }
/// <summary>
/// Data da última atualização
/// </summary>
public DateTime UpdatedAt { get; set; }
// ========================================
// INFORMAÇÕES DO PROVIDER
// ========================================
/// <summary>
/// Nome do provider que retornou este resultado (MongoDB, Qdrant, etc.)
/// </summary>
public string Provider { get; set; } = string.Empty;
/// <summary>
/// Informações específicas do provider (índices, shards, etc.)
/// </summary>
public Dictionary<string, object>? ProviderSpecific { get; set; }
// ========================================
// MÉTODOS DE CONVENIÊNCIA
// ========================================
/// <summary>
/// Preview do conteúdo (primeiros N caracteres)
/// </summary>
public string GetContentPreview(int maxLength = 200)
{
if (string.IsNullOrEmpty(Content))
return string.Empty;
if (Content.Length <= maxLength)
return Content;
return Content.Substring(0, maxLength) + "...";
}
/// <summary>
/// Score formatado como percentual
/// </summary>
public string GetScorePercentage()
{
return $"{Score:P1}"; // Ex: "85.3%"
}
/// <summary>
/// Indica se é um resultado relevante (score alto)
/// </summary>
public bool IsHighRelevance(double threshold = 0.7)
{
return Score >= threshold;
}
/// <summary>
/// Converte para o modelo atual do sistema (compatibilidade)
/// </summary>
public TextoComEmbedding ToTextoComEmbedding()
{
return new TextoComEmbedding
{
Id = Id,
Titulo = Title,
Conteudo = Content,
ProjetoId = ProjectId,
Embedding = Embedding
};
}
/// <summary>
/// Converte do modelo atual do sistema
/// </summary>
public static VectorSearchResult FromTextoComEmbedding(
TextoComEmbedding texto,
double score = 1.0,
string provider = "Unknown")
{
return new VectorSearchResult
{
Id = texto.Id,
Title = texto.Titulo,
Content = texto.Conteudo,
ProjectId = texto.ProjetoId,
Score = score,
Embedding = texto.Embedding,
Provider = provider,
CreatedAt = DateTime.UtcNow,
UpdatedAt = DateTime.UtcNow
};
}
public override string ToString()
{
return $"{Title} (Score: {GetScorePercentage()}, Provider: {Provider})";
}
}
}