Inicio de la guía 1. Topología de la solución 2. Aspire como plano de control local 3. Configuración y contratos compartidos 4. Metadatos con SQLite y EF Core 5. API e interfaz de carga 6. Almacenamiento de objetos con MinIO 7. Pipeline de ingesta del worker 8. Extracción y división de texto 9. Artefactos literarios 10. Abstracciones de proveedores de IA 11. Almacenamiento vectorial con Qdrant 12. Flujo de preguntas y recuperación 13. Prompts y citas 14. Pruebas del pipeline 15. Notas de desarrollo local Todas las guías
Navegación de la guíaÍndice y capítulos
Capítulo 3

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.

Nota de traducción: Esta versión en español fue traducida con ayuda de un LLM y revisada para conservar los términos técnicos, el código y los nombres de archivos en inglés cuando corresponde.
Imagen decorativa del capítulo sobre Configuración y contratos compartidos
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:

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:

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.