Sistema completo de Retrieval Augmented Generation (RAG) construido sobre un corpus de +333 documentos ambientales de Greenpeace. El proyecto implementa el pipeline end-to-end: ingesta de documentos, fragmentación, embeddings, almacenamiento vectorial, recuperación y generación de respuestas, junto con un framework de evaluación riguroso.
PDF Documents ──► Markdown ──► Chunks ──► Embeddings ──► ChromaDB
│
User Query ──► Retrieval (MMR) ──► LLM ──► Respuesta
| Componente | Tecnología |
|---|---|
| Embedding Model | bge-m3:567m (via Ollama) |
| LLM Local | gemma3:4b (via Ollama) |
| LLM Evaluación | Gemini 2.5 Flash Lite (Google GenAI) |
| Vector Store | ChromaDB |
| Framework | LangChain |
| Entorno | Google Colab (GPU) |
├── Base de Conocimiento (Fragmentación).ipynb # Conversión PDF → Markdown → Chunks
├── Base de Conocimiento (Ingesta).ipynb # Carga de chunks en SQLite con metadata
├── Evaluación (Datos de Prueba).ipynb # Generación de dataset de evaluación (Q&A)
├── RAG (Completo).ipynb # Pipeline RAG completo con evaluación
├── Retrieval y Generación (RG).ipynb # Componentes de retrieval y generación
├── greenpeace/ # Datos del corpus
│ ├── greenpeace.csv # Metadata de documentos (id, categoría, fecha, url)
│ ├── greenpeace_database.db # Base SQLite con chunks indexados
│ ├── docs/ # PDFs originales (333 documentos)
│ ├── mds/ # Documentos convertidos a Markdown
│ ├── chunks/ # Fragmentos JSON por documento
│ ├── *.json # Datasets de evaluación (Q&A pairs)
├── chroma_db/ # Base de datos vectorial ChromaDB
├── Test/ # Experimentos y ablaciones
│ ├── Base-Line/ # Configuración base de referencia
│ ├── Combinaciones/ # Combinaciones de técnicas
│ ├── Fragmentacion/ # Variaciones de chunk size (200_0, 400_20)
│ ├── Hyperparametros/ # Tuning de MMR y Similarity Threshold
│ ├── Recuperacion/ # Re-ranking con distintos k
│ ├── Ruteo/ # Routing lógico y semántico
│ └── Transformacion/ # Step-back, descomposición, reescritura, HyDE
- Fragmentación: Convierte PDFs a Markdown usando
PyMuPDF+marker. Fragmenta conMarkdownHeaderTextSplitteryRecursiveCharacterTextSplitter(chunk_size=800, overlap=100). - Ingesta: Carga chunks con metadata (categoría, fecha, URL) en SQLite.
- Genera embeddings con
bge-m3:567mvia Ollama. - Almacena vectores en ChromaDB (colección:
loader_embeddings).
- Retrieval: MMR (Maximal Marginal Relevance) con
k=3,fetch_k=20. - Generación: Prompt contextualizado enviado a
gemma3:4bvia Ollama.
- Genera pares Q&A con ground truth desde los chunks usando Gemini.
- Métricas: Correctness (vs ground truth), Relevance (respuesta pertinente), Grounding (anclaje en documentos).
El directorio Test/ contiene ablaciones sistemáticas sobre el pipeline RAG:
| Categoría | Variaciones |
|---|---|
| Fragmentación | Chunk sizes: (200, 0), (400, 20) |
| Hyperparámetros | MMR λ={0.5, 1.0}, k={3, 10}, Similarity Threshold=0.7 |
| Recuperación | Re-ranking con k medio y k menor |
| Ruteo | Lógico, Semántico (temp=1, temp=2) |
| Transformación | Multi-query, Fusion RAG, Step-back, HyDE, Sub-preguntas (individual/recursivo) |
| Combinaciones | 5 combinaciones de las mejores técnicas |
Cada experimento incluye un notebook y un archivo metrics_*.json con los resultados.
langchain
langchain-community
langchain-core
langchain-chroma
langchain-ollama
langchain-google-genai
chromadb
ollama
pymupdf
marker
pandas
pydantic
tqdm
Además se requiere Ollama ejecutándose localmente con los modelos:
ollama pull bge-m3:567m
ollama pull gemma3:4bLas API keys de Google Generative AI se gestionan mediante google.colab.userdata (almacenamiento seguro de Colab). No hay credenciales hardcodeadas en el código.
Los notebooks están diseñados para ejecutarse en Google Colab con GPU. El flujo de ejecución es:
Base de Conocimiento (Fragmentación).ipynb→ Procesar PDFsBase de Conocimiento (Ingesta).ipynb→ Cargar en SQLiteRAG (Completo).ipynb→ Ejecutar pipeline completoEvaluación (Datos de Prueba).ipynb→ Generar y evaluar datos de prueba