Almacenamiento vectorial con Qdrant
RAG.Core/Services/QdrantVectorStore.cs controla la interacción con Qdrant.
Cada vector lleva payload de cita
new Dictionary<string, object?>
{
["documentId"] = chunk.Chunk.DocumentId.ToString(),
["fileName"] = chunk.Chunk.FileName,
["chunkIndex"] = chunk.Chunk.ChunkIndex,
["text"] = chunk.Chunk.Text,
["chunkType"] = chunk.Chunk.ChunkType
}RAG.Core/Services/QdrantVectorStore.cs controla la interacción con Qdrant.
Cada punto guarda:
- vector;
documentId;fileName;chunkIndex;pageNumber;sourceObjectKey;text;chunkType;title;- campos de procedencia de artefactos generados como
isGeneratedArtifact,artifactKind, proveedor, modelo, versión de prompt, hora de generación e índices de chunk/página fuente.
El endpoint de búsqueda vectorial devuelve chunks y payloads coincidentes. Los payloads se convierten en citas, diagnósticos y contexto para el LLM. Preservar la procedencia en Qdrant permite que un perfil generado de club de lectura sobreviva el recorrido de ingesta a recuperación y renderizado de citas sin confundirse con texto fuente.
El store también soporta dos helpers de recuperación no vectorial:
GetDocumentProfileChunksAsyncGetChunksContainingTextAsync
Existen porque la búsqueda vectorial no siempre alcanza. Si un usuario hace una pregunta comparativa con personajes nombrados, una búsqueda exacta por nombre puede asegurar que cada sujeto nombrado aporte evidencia.
Así es como el proyecto maneja preguntas como:
Can you find any similarities between Calpurnia and Hermione?
La recuperación semántica top-k pura puede enfocarse demasiado en un solo libro. La ruta mejorada de recuperación combina búsqueda semántica, chunks de perfiles y chunks con nombres exactos.
El almacén vectorial también tiene una operación de borrado por documento. Reindexación y eliminación llaman a DeleteDocumentAsync para que puntos vectoriales antiguos no permanezcan después de cambios en datos derivados o cuando un usuario elimina un documento.