Este repositorio implementa un sistema RAG (Retrieval-Augmented Generation o Generación Aumentada por Recuperación) sobre una colección de documentos. Su objetivo es responder preguntas usando contexto recuperado de una base documental, en lugar de depender únicamente del conocimiento paramétrico del modelo.
Un sistema RAG combina dos piezas principales:
- Retrieval: busca en una colección de documentos los fragmentos más relevantes para una pregunta.
- Generation: usa un modelo de lenguaje para generar una respuesta apoyándose en esos fragmentos recuperados.
La idea es simple:
- primero se cargan y transforman documentos,
- luego se convierten en embeddings,
- después se comparan con la consulta del usuario,
- y finalmente un LLM redacta la respuesta usando el contexto encontrado.
Esto permite:
- responder sobre documentos privados o específicos,
- reducir alucinaciones frente a un LLM sin contexto,
- mantener el conocimiento actualizable sin reentrenar el modelo.
En este repositorio el flujo general es el siguiente:
Los documentos fuente se cargan desde una carpeta de datos, en este caso data_cine, mediante un loader robusto. El objetivo es convertir archivos de entrada en una lista de documentos procesables.
Los documentos completos se dividen en fragmentos más pequeños o nodos. Esto mejora la recuperación porque comparar preguntas contra trozos más pequeños suele producir resultados más precisos que hacerlo contra documentos enteros.
Cada nodo se vectoriza con el modelo de embeddings nomic-embed-text ejecutado a través de Ollama. Así se obtiene una representación numérica de cada fragmento para poder medir similitud semántica.
Los nodos, embeddings y configuración se guardan en disco para no tener que recalcularlos en cada ejecución. Esto acelera mucho las consultas posteriores.
Cuando el usuario hace una pregunta:
- la consulta se compara con los embeddings almacenados,
- se recuperan los nodos más parecidos,
- esos nodos se usan como contexto,
- y el modelo generativo produce una respuesta final.
El repositorio también incluye utilidades de evaluación para medir aspectos como:
- exact match,
- similitud semántica,
- faithfulness respecto al contexto recuperado,
- conciseness de la respuesta.
Esto convierte el proyecto no solo en un prototipo de RAG, sino también en una base para experimentar con calidad de recuperación y generación.
A nivel conceptual, el repositorio está organizado en varias etapas del pipeline:
Loading/: carga de documentos fuente.Indexing/: transformación de documentos y generación de embeddings.Storer/: almacenamiento y recuperación desde disco.Querying/: búsqueda semántica y construcción de respuestas.- scripts principales en la raíz: orquestan indexación, consulta y evaluación.
El script principal para construir el índice es main_build_index_true.py. Su secuencia es:
- cargar el modelo de embeddings,
- leer los documentos desde
data_cine, - transformar documentos en nodos,
- generar embeddings de esos nodos,
- guardar todo en disco.
En otras palabras, esta fase prepara la base de conocimiento para poder consultar después.
El script main_respuesta.py representa la fase de inferencia:
- carga nodos, embeddings y configuración desde disco,
- crea un motor de consulta,
- lanza una pregunta,
- recupera los nodos más relevantes,
- envía pregunta + contexto al
AnswerEngine, - imprime la respuesta final.
Si la pregunta del usuario fuera:
"¿Cómo funciona el cine?"
el sistema seguiría esta lógica:
- convierte la pregunta en una representación semántica,
- busca los fragmentos del corpus sobre cine más cercanos a esa representación,
- selecciona, por ejemplo, los 3 mejores nodos,
- construye un prompt con esos fragmentos,
- genera una respuesta basada en ese contexto.
Por lo que se observa en el código, este proyecto usa principalmente:
- Python
- Ollama
llama_indexnumpy- un modelo de embeddings como
nomic-embed-text - un modelo generativo como
qwen2.5:1.5b
Además, para que funcione correctamente, debes tener disponibles en tu entorno los modelos de Ollama necesarios.
Ejecuta el script de indexación para generar nodos y embeddings persistidos:
python main_build_index_true.pyUna vez creado el índice, puedes generar una respuesta con:
python main_respuesta.pyEl repositorio contiene scripts adicionales para evaluar retrieval y respuestas, por ejemplo:
python main_eval_all.pyEste proyecto sirve para entender un RAG porque separa claramente las fases esenciales:
- ingesta de conocimiento,
- fragmentación en nodos,
- vectorización,
- almacenamiento,
- recuperación semántica,
- generación condicionada por contexto,
- evaluación del resultado.
Es decir, no se limita a “preguntar a un modelo”, sino que implementa la lógica completa de recuperación + generación.
A partir del código actual, parece haber varios puntos que podrías mejorar en el futuro:
- rutas absolutas que dificultan la portabilidad del proyecto,
- falta de instrucciones de instalación más detalladas,
- ausencia de ejemplos de salida documentados,
- falta de diagrama del pipeline,
- documentación escasa sobre las clases internas (
Loader_robusto,Transformer,Indexer_robusto,QueryEngine,AnswerEngine).
Algunas mejoras recomendables para este repositorio serían:
- añadir un
requirements.txtopyproject.toml, - documentar la estructura exacta de carpetas y clases,
- eliminar rutas absolutas y sustituirlas por rutas relativas o variables de entorno,
- añadir ejemplos reproducibles de preguntas y respuestas,
- incluir métricas de evaluación y cómo interpretarlas,
- explicar mejor el formato de los datos de entrada.
Sí: este repositorio implementa y deja entrever bastante bien qué es un RAG y cómo funciona, aunque no lo explica de forma clara en su documentación original.
En concreto, my_first_rag es el mejor candidato dentro de tus repositorios para documentar este tema porque:
- el propio nombre del repositorio lo indica,
- contiene scripts de indexación, consulta y evaluación,
- implementa las partes esenciales de un pipeline RAG real.
Este README.md deja el proyecto mucho más entendible para cualquier persona que llegue nueva al repositorio.