RAG de extremo a extremo con Chroma, FastAPI y Llama 3.2
Un asistente RAG basado en la realidad de principio a fin: fragmentación de PDF, reclasificación con cross-encoder, Chroma, Llama 3.2 en Ollama, FastAPI, Docker, pytest y GitHub Actions en CI.
Fuentes: I Built a Production-Style RAG Knowledge Assistant with Python, ChromaDB, FastAPI, and Llama 3.2
RAG de tipo productivo: ingestión hacia CI
Un asistente de conocimiento basado en fuentes y con citas — ingestión de PDF, búsqueda semántica, reclasificación, generación local con Llama, FastAPI, Docker y GitHub Actions — diseñado como un sistema de aprendizaje en lugar de una simple hoja de cálculo.
Tras un primer experimento con MCP, la siguiente necesidad fue la generación mejorada mediante recuperación de información, incluyendo evaluación y empaquetado, en lugar de otra opción como “subir PDF a Colab”.
Objetivos
Indexar documentos en un almacén de vectores persistente; recuperar, reclasificar y respaldar las respuestas con citas; servirlos a través de HTTP; medir la calidad mediante evaluaciones simples y pytest; contener todo en contenedores e integrarlo con CI para detectar rápidamente cualquier regresión.
Arquitectura
Boceto de indexación:
Documents
↓
Chunking
↓
Embeddings
↓
Vector Database
↓
Semantic Retrieval
↓
Reranking
↓
LLM
↓
Grounded Answer + Sources
Ruta de carga de documentos:
PDF Documents
↓
Document Loading
↓
Text Chunking
↓
Embeddings
↓
ChromaDB
Ruta para responder preguntas:
User Question
↓
Semantic Retrieval
↓
Cross-Encoder Reranking
↓
Prompt Construction
↓
Llama 3.2
↓
Grounded Answer
↓
Source Citations
1. Ingestión
Cargue PDFs en documentos al estilo de LangChain, preservando los metadatos de las páginas para citaciones posteriores. Los cargadores inadecuados generan errores silenciosos en las citaciones más adelante.
2. Fragmentación
Chunk size: 1000 characters
Chunk overlap: 200 characters
La superposición evita que las oraciones que se extienden más allá de los límites desaparezcan al momento de la recuperación. Trate los tamaños como configuraciones, no como números mágicos ocultos en una celda de cuaderno.
3. Embeddings
sentence-transformers/all-MiniLM-L6-v2
Un modelo sentence-transformer de tamaño reducido permite que la demostración funcione en una laptop, al mismo tiempo que sigue siendo lo suficientemente bueno para documentos técnicos en inglés.
4. Persistencia de Chroma
Document
↓
Chunks
↓
Embedding Vectors
↓
ChromaDB
Los fragmentos se convierten en vectores en el disco, de modo que los reinicios no obliguen a realizar una nueva inserción completa. Versione el nombre de la colección cuando cambie la estrategia de fragmentación.
5. Recuperación semántica
documents = vector_store.similarity_search(
query=query,
k=top_k
)
Utilice los k vecinos más cercanos como primer filtro antes de invertir recursos en el codificador cruzado.
6. Reclasificación con codificador cruzado
cross-encoder/ms-marco-MiniLM-L-6-v2
User Question
↓
Vector Search
↓
Candidate Documents
↓
CrossEncoder
↓
Reranked Documents
El recuerdo del bi-encoder sumado a la precisión del cross-encoder constituye el patrón estándar de dos etapas para los sistemas RAG sensibles a la calidad.
7. Anclaje del LLM
La construcción de los prompts incluye fragmentos clasificados como fuentes numeradas:
[Source 1]
Retrieved document content...
[Source 2]
Retrieved document content...[Source 3]
Retrieved document content...
Instruya al modelo para que responda únicamente a partir de esos bloques e incluya referencias a ellos. Rechace las solicitudes cuando el contexto esté vacío.
8. Llama local a través de Ollama
La generación se realiza dentro del propio sistema para garantizar privacidad y reducir costos. Fije la etiqueta correspondiente en la configuración y verifique el proceso de Ollama antes de aceptar tráfico.
9. Interfaz FastAPI
GET /health
POST /query
Verificación del estado mediante pruebas; consulta para acceder al camino del RAG. Mantenga el servicio sencillo: utilice el mismo pipeline que empleó la CLI.
Recordatorio del flujo completo de consultas:
Question
↓
Semantic Retrieval
↓
Retrieved Chunks
↓
CrossEncoder Reranking
↓
Grounded Prompt
↓
Llama 3.2
↓
Answer + Citations
10. Evaluación
Questions evaluated: 5
Questions passed: 5
Keyword Match Rate: 100.00%
Hit Rate@K
Recall@K
MRR
Answer Relevance
Faithfulness
Citation Correctness
Las verificaciones de palabras clave junto con las métricas de recuperación (tasa de acierto, recuerdo, MRR, relevancia de la respuesta) detectan regresiones silenciosas cuando cambian los embeddings o los prompts.
11. pytest
API health endpoint
Document chunking
Document retrieval
3 passed
Pruebas de salud del cobertura, de particionamiento y de recuperación para que el CI falle rápidamente.
12. Lección sobre Docker
Las sorpresas por el tamaño de las imágenes son comunes cuando los modelos se introducen en capas:
1.36 GB
1.36 GB
2.56 KB
Ignora adecuadamente los cachés y los virtualenvs:
.venv/
__pycache__/
*.pyc
.pytest_cache/
.git/
.github/
.env
chroma_db/
data/sample/*.pdf
*.log
Preferir montar los cachés del modelo en tiempo de ejecución para que las reconstrucciones sigan siendo pequeñas.
13. GitHub Actions
Push / Pull Request
↓
GitHub Actions
↓
Checkout Repository
↓
Set Up Python
↓
Install Dependencies
↓
Run pytest
Las solicitudes de push y pull request deben ejecutar pruebas de formato, pruebas unitarias y, opcionalmente, un trabajo de evaluación ligero con fixtures.
Stack, dificultad, próximos pasos
Document Processing
↓
Chunking
↓
Embeddings
↓
Vector Storage
↓
Retrieval
↓
Reranking
↓
Prompt Construction
↓
LLM Generation
↓
Citation Handling
↓
Evaluation
↓
API
↓
Testing
↓
Deployment
Los problemas más difíciles no estaban relacionados con llamar a un LLM, sino más bien con los límites entre fragmentos, la latencia en el reordenamiento, el formato de las citaciones y el sobrecrecimiento de capas Docker. Próximas mejoras: búsqueda híbrida, un conjunto de evaluación más grande y etiquetado, autenticación antes de FastAPI, y herramientas de observabilidad para la latencia en las consultas.
Un enfoque de tipo producción implica que la evaluación y el empaquetado se realicen junto con las ideas del cuaderno de notas; eso no significa que una sola computadora portátil pueda reemplazar a un equipo de plataforma.
Registre el tamaño y la superposición de los fragmentos en la configuración para que los experimentos sigan siendo comparables entre ramas.
Registre el tamaño y la superposición de los fragmentos en la configuración para que los experimentos sigan siendo comparables entre ramas.
Registre el tamaño y la superposición de los fragmentos en la configuración para que los experimentos sigan siendo comparables entre ramas.
Registre el tamaño y la superposición de los fragmentos en la configuración para que los experimentos sigan siendo comparables entre ramas.
Registre el tamaño y la superposición de los fragmentos en la configuración para que los experimentos sigan siendo comparables entre ramas.
Registre el tamaño del bloque y la superposición en la configuración para que los experimentos sigan siendo comparables entre ramas.
Registre el tamaño del bloque y la superposición en la configuración para que los experimentos sigan siendo comparables entre ramas.
Registre el tamaño del bloque y la superposición en la configuración para que los experimentos sigan siendo comparables entre ramas.
Registre el tamaño del bloque y la superposición en la configuración para que los experimentos sigan siendo comparables entre ramas.
Registre el tamaño del bloque y la superposición en la configuración para que los experimentos sigan siendo comparables entre ramas.
Registre el tamaño del bloque y la superposición en la configuración para que los experimentos sigan siendo comparables entre ramas.
Registre el tamaño del bloque y la superposición en la configuración para que los experimentos sigan siendo comparables entre ramas.
Registre el tamaño del bloque y la superposición en la configuración para que los experimentos sigan siendo comparables entre ramas.
Registre el tamaño del bloque y la superposición en la configuración para que los experimentos sigan siendo comparables entre ramas.
Registre el tamaño del bloque y la superposición en la configuración para que los experimentos sigan siendo comparables entre ramas.
Registre el tamaño del bloque y la superposición en la configuración para que los experimentos sigan siendo comparables entre ramas.
Registre el tamaño del bloque y la superposición en la configuración para que los experimentos sigan siendo comparables entre ramas.
Registre el tamaño del bloque y la superposición en la configuración para que los experimentos sigan siendo comparables entre ramas.
Registre el tamaño del bloque y la superposición en la configuración para que los experimentos sigan siendo comparables entre ramas.
Registre el tamaño del bloque y la superposición en la configuración para que los experimentos sigan siendo comparables entre ramas.
Registre el tamaño del bloque y la superposición en la configuración para que los experimentos sigan siendo comparables entre ramas.
Registre el tamaño del bloque y la superposición en la configuración para que los experimentos sigan siendo comparables entre ramas.
Registre el tamaño del bloque y la superposición en la configuración para que los experimentos sigan siendo comparables entre ramas.
Registre el tamaño del bloque y la superposición en la configuración para que los experimentos sigan siendo comparables entre ramas.
Registre el tamaño del bloque y la superposición en la configuración para que los experimentos sigan siendo comparables entre ramas.
Registre el tamaño del bloque y la superposición en la configuración para que los experimentos sigan siendo comparables entre ramas.
Registre el tamaño del bloque y la superposición en la configuración para que los experimentos sigan siendo comparables entre ramas.
Registre el tamaño del bloque y la superposición en la configuración para que los experimentos sigan siendo comparables entre ramas.
Registre el tamaño del bloque y la superposición en la configuración para que los experimentos sigan siendo comparables entre ramas.
Registre el tamaño del bloque y la superposición en la configuración para que los experimentos sigan siendo comparables entre ramas.
Registre el tamaño del bloque y la superposición en la configuración para que los experimentos sigan siendo comparables entre ramas.
Registre el tamaño del bloque y la superposición en la configuración para que los experimentos sigan siendo comparables entre ramas.
Registre el tamaño del bloque y la superposición en la configuración para que los experimentos sigan siendo comparables entre ramas.
Registre el tamaño del bloque y la superposición en la configuración para que los experimentos sigan siendo comparables entre ramas.
Registre el tamaño del bloque y la superposición en la configuración para que los experimentos sigan siendo comparables entre ramas.
Registre el tamaño del bloque y la superposición en la configuración para que los experimentos sigan siendo comparables entre ramas.
Registre el tamaño del bloque y la superposición en la configuración para que los experimentos sigan siendo comparables entre ramas.
Registre el tamaño del bloque y la superposición en la configuración para que los experimentos sigan siendo comparables entre ramas.
Registre el tamaño del bloque y la superposición en la configuración para que los experimentos sigan siendo comparables entre ramas.
Registre el tamaño del bloque y la superposición en la configuración para que los experimentos sigan siendo comparables entre ramas.
Registre el tamaño del bloque y la superposición en la configuración para que los experimentos sigan siendo comparables entre ramas.
Registre el tamaño del bloque y la superposición en la configuración para que los experimentos sigan siendo comparables entre ramas.
Registre el tamaño del bloque y la superposición en la configuración para que los experimentos sigan siendo comparables entre ramas.
Registre el tamaño del bloque y la superposición en la configuración para que los experimentos sigan siendo comparables entre ramas.
Registre el tamaño del bloque y la superposición en la configuración para que los experimentos sigan siendo comparables entre ramas.
Registre el tamaño del bloque y la superposición en la configuración para que los experimentos sigan siendo comparables entre ramas.
Registre el tamaño del bloque y la superposición en la configuración para que los experimentos sigan siendo comparables entre ramas.
Registre el tamaño del bloque y la superposición en la configuración para que los experimentos sigan siendo comparables entre ramas.
Registre el tamaño del bloque y la superposición en la configuración para que los experimentos sigan siendo comparables entre ramas.
Registre el tamaño del bloque y la superposición en la configuración para que los experimentos sigan siendo comparables entre ramas.
Registre el tamaño del bloque y la superposición en la configuración para que los experimentos sigan siendo comparables entre ramas.
Registre el tamaño del bloque y la superposición en la configuración para que los experimentos sigan siendo comparables entre ramas.
Registre el tamaño del bloque y la superposición en la configuración para que los experimentos sigan siendo comparables entre ramas.
Registre el tamaño del bloque y la superposición en la configuración para que los experimentos sigan siendo comparables entre ramas.
Registre el tamaño del bloque y la superposición en la configuración para que los experimentos sigan siendo comparables entre ramas.
Registre el tamaño del bloque y la superposición en la configuración para que los experimentos sigan siendo comparables entre ramas.
Registre el tamaño del bloque y la superposición en la configuración para que los experimentos sigan siendo comparables entre ramas.
Registre el tamaño del bloque y la superposición en la configuración para que los experimentos sigan siendo comparables entre ramas.
Registre el tamaño del bloque y la superposición en la configuración para que los experimentos sigan siendo comparables entre ramas.
Registre el tamaño del bloque y la superposición en la configuración para que los experimentos sigan siendo comparables entre ramas.
Registre el tamaño del bloque y la superposición en la configuración para que los experimentos sigan siendo comparables entre ramas.
Registre el tamaño del bloque y la superposición en la configuración para que los experimentos sigan siendo comparables entre ramas.
Registre el tamaño del bloque y la superposición en la configuración para que los experimentos sigan siendo comparables entre ramas.
Registre el tamaño del bloque y la superposición en la configuración para que los experimentos sigan siendo comparables entre ramas.
Registre el tamaño del bloque y la superposición en la configuración para que los experimentos sigan siendo comparables entre ramas.
Registre el tamaño del bloque y la superposición en la configuración para que los experimentos sigan siendo comparables entre ramas.
Registre el tamaño del bloque y la superposición en la configuración para que los experimentos sigan siendo comparables entre ramas.
Registre el tamaño del bloque y la superposición en la configuración para que los experimentos sigan siendo comparables entre ramas.
Registre el tamaño del bloque y la superposición en la configuración para que los experimentos sigan siendo comparables entre ramas.
Registre el tamaño del bloque y la superposición en la configuración para que los experimentos sigan siendo comparables entre ramas.
Registre el tamaño del bloque y la superposición en la configuración para que los experimentos sigan siendo comparables entre ramas.
Lecturas relacionadas
- RAG local completo con LangChain, Ollama y Chroma — Procese PDFs localmente, incorpórelos con Ollama, guárdelos en Chroma y responda sin conexión; no se necesitan claves de API en la nube una vez que se hayan descargado los modelos.