APP-RAG: asistente documental local
Asistente RAG local para consultar un corpus de PDFs técnicos con Ollama, LangChain y ChromaDB.
01 Problema y contexto
Consultar un corpus de PDFs técnicos implica buscar a mano; los buscadores por palabra clave fallan con preguntas en lenguaje natural y los LLM genéricos alucinan contenido que no está en el material.
Consulta documental sobre corpus cerrados: colecciones de PDF que una persona necesita interrogar en lenguaje natural sin que el modelo invente lo que no está escrito. El caso de uso son documentos que no pueden salir de la máquina (material interno, técnico o confidencial), lo que descarta las APIs de terceros y obliga a resolver todo el ciclo, desde el embedding hasta la generación, con modelos locales.
02 Solución
Pipeline RAG con LangChain (LCEL): carga de PDF con PyPDF, chunking recursivo (1000/200), embeddings FastEmbed (BAAI/bge-small-en-v1.5) y recuperación top-5 desde ChromaDB. La generación corre en LLMs locales vía Ollama (llama3:8b, mistral, phi) con un prompt que restringe la respuesta al contexto recuperado, cita la página fuente y responde explícitamente cuando la información no está en los documentos.
- Ingesta: carga de los PDF con PyPDFLoader, conservando el número de página de cada fragmento para poder citarlo después.
- Segmentación: división recursiva en chunks de 1.000 caracteres con 200 de solapamiento, de modo que una idea partida por el corte siga apareciendo entera en el fragmento vecino.
- Indexación: embeddings generados localmente con FastEmbed (BAAI/bge-small-en-v1.5) y persistidos en ChromaDB sobre un volumen mapeado.
- Recuperación: el retriever devuelve los cinco fragmentos más cercanos a la consulta, formateados con su página de origen.
- Generación restringida: una cadena en LangChain Expression Language arma el prompt con el contexto recuperado y obliga al modelo a responder solo desde ahí.
- Control en tiempo de ejecución: modelo (mistral, llama3, phi) y temperatura elegibles desde la interfaz, con 0,2 por defecto para inclinar la respuesta hacia la factualidad.
- Empaquetado: Docker Compose levanta Ollama y la aplicación como contenedores separados, con volúmenes persistentes.
03 Cómo está construido
Asistente conversacional basado en la arquitectura RAG (Retrieval-Augmented Generation) para consultar en lenguaje natural un corpus de PDFs técnicos. Indexa los documentos con embeddings locales (FastEmbed) en ChromaDB y responde usando LLMs locales servidos por Ollama, con una cadena LangChain que restringe las respuestas al contexto recuperado. Toda la solución (app Streamlit y servidor Ollama) se orquesta con Docker Compose, con persistencia de modelos y base vectorial.
04 Decisiones éticas
- El prompt obliga al modelo a abstenerse: si la respuesta no está en el contexto recuperado debe declararlo, en lugar de completar el vacío con conocimiento externo.
- Cada fragmento llega al modelo con su número de página, para que cualquier afirmación pueda contrastarse contra el documento original.
- Todo corre local sobre Ollama: los documentos indexados nunca salen de la máquina.
- La temperatura por defecto se fijó en 0,2, priorizando factualidad por sobre fluidez.
05 Aspectos destacados
- Pipeline RAG completo con LangChain (LCEL): PyPDF, chunking recursivo (1000/200), embeddings FastEmbed y recuperación top-5 desde ChromaDB.
- Ejecución 100% local y privada: LLMs servidos por Ollama en contenedor Docker, sin dependencia de APIs externas.
- Orquestación con Docker Compose de dos servicios (Ollama y app Streamlit) con red propia y volúmenes persistentes.
- Interfaz de chat en Streamlit con selección dinámica de modelo (llama3:8b, mistral, phi) y control de temperatura.
- Prompt de RAG restringido al contexto recuperado, con cita de página fuente y respuesta explícita cuando la información no está en los documentos.
06 Limitaciones
No hay dataset propio. El sistema indexa los PDF que se depositen en el directorio, así que la calidad de las respuestas depende del corpus cargado y de si la respuesta está realmente escrita en él. No se ejecutó una evaluación formal del recuperador, de modo que el proyecto no reporta métricas: la restricción anti-alucinación es de diseño, no está medida. Dos limitaciones conocidas: la segmentación es fija y no se ajustó por tipo de documento, y el modelo de embeddings está optimizado para inglés mientras que las consultas son en español.