Configuración y contratos compartidos
Cómo las opciones e interfaces compartidas mantienen proveedores de modelos y detalles de almacenamiento fuera del código del workflow.
Los contratos mantienen proveedores de modelos fuera del workflow
public interface IEmbeddingProvider
{
Task<float[]> GenerateEmbeddingAsync(string input, CancellationToken cancellationToken);
}
public interface IChatCompletionProvider
{
Task<string> GenerateAnswerAsync(string question, IReadOnlyList<RetrievedChunk> chunks, CancellationToken cancellationToken);
}RAG.Core/Configuration/RagOptions.cs define configuración fuertemente tipada:
StorageOptionsAiOptionsQdrantOptionsIngestionOptionsRequestOptions
Esto mantiene consistente el acceso a configuración. En lugar de leer strings sueltos por toda la app, los servicios reciben IOptions<RagOptions>.
Las interfaces clave viven en RAG.Core/Services/Contracts.cs.
Contratos importantes:
IObjectStorage: subir y leer archivos originales.ITextExtractor: extraer texto de PDFs y archivos TXT.ITextChunker: dividir texto extraído en chunks.ITokenEstimator: estimar tokens para chunking dejando explícita la aproximación.IEmbeddingProvider: convertir texto en vectores.IChatCompletionProvider: producir respuestas finales a partir de evidencia.ILiteraryAnalysisProvider: generar perfiles para club de lectura.IVectorStore: upsert, búsqueda y recuperación de chunks en Qdrant.IRetrievalReranker: convertir candidatos vectoriales más contexto de la pregunta en chunks ordenados con razones.IDocumentIngestionService: procesar documentos pendientes.IIngestionWorkSource: decidir qué IDs de documentos deben ingerirse después.IDocumentManagementService: borrar documentos y poner reindexación en cola.IChatAnswerService: responder preguntas de usuarios.
Estas interfaces son el punto didáctico principal del proyecto. El workflow de la aplicación depende de capacidades estables, no de un SDK específico de un proveedor.
Límites de seguridad para solicitudes
RequestOptions agrega límites alrededor de la ruta de preguntas: caracteres máximos de pregunta, documentos seleccionados máximos, consultas de recuperación generadas máximas y segundos de timeout del proveedor. Esos límites están respaldados por configuración a propósito porque costo y latencia en RAG son preocupaciones operativas, no solo de código.
public sealed class RequestOptions
{
public int MaxQuestionCharacters { get; set; } = 2000;
public int MaxSelectedDocuments { get; set; } = 20;
public int MaxRetrievalQueries { get; set; } = 12;
public int ProviderTimeoutSeconds { get; set; } = 90;
}
Este es un cambio pequeño pero importante: el ejemplo ya no trata las preguntas de usuario como strings inofensivos. La aplicación valida la forma de la solicitud antes de crear embeddings, buscar vectores o llamar a un modelo pagado/remoto.