145 lines
4.3 KiB
C#
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})";
|
|
}
|
|
}
|
|
}
|