Inicio / Artículos

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.

Editor: REACTAPP.TOP8 min de lectura1747 palabras

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

  • Incrustar un agente de LangChain en FastAPI: Herramientas, búsqueda manual, transmisión en tiempo real — Crea un asistente dentro de la aplicación con FastAPI y LangChain: un manual en PDF almacenado en ChromaDB que se expone como herramienta, contexto por usuario, historial con puntos de control y respuestas en transmisión.
  • Envolver RAG multimodal en una interfaz de chat de Gradio — Refactoriza un motor RAG multimodal basado en CLI en una aplicación de Gradio con interfaz arrastrar y soltar, que muestra progreso, citas y respuestas en transmisión.