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