Este proyecto implementa un pipeline de Retrieval-Augmented Generation (RAG) modular y extensible orientado a entornos productivos. Se apoya en embeddings de SentenceTransformers, almacenamiento vectorial persistente con Chroma, re-ranking con CrossEncoder y un generador configurable que puede usar modelos locales o APIs externas.
- Ingesta multimodal: soporta ficheros
.txt,.mdy.pdf, con normalización y metadatos. - Chunking adaptativo: división configurable por tokens o caracteres, con solapamiento optimizado para preservar contexto.
- Embeddings de alta calidad: usa
sentence-transformers/all-MiniLM-L6-v2por defecto, con caché en disco. - Vector store persistente: almacenamiento incremental sobre ChromaDB, permite reindexado y refresco parcial.
- Re-ranking semántico: reranker basado en
cross-encoder/ms-marco-MiniLM-L-6-v2para mejorar la precisión de recuperación. - Generador flexible: interfaz común para
transformerslocales, OpenAI, Gemini, NVIDIA y otros proveedores (integración mediante configuración). - CLI unificada: comandos para ingestar, reconstruir el índice y ejecutar consultas con seguimiento en consola.
- Configuración centralizada: parámetros agrupados en
config/default.yaml, sobreescribibles mediante CLI.
- Python 3.10 o superior.
- Dependencias listadas en
requirements.txt. Se recomienda crear un entorno virtual:
python -m venv .venv
source .venv/bin/activate
pip install -r requirements.txtPara usar modelos de transformers se recomienda tener instalado git y una cuenta en Hugging Face si se quieren descargar modelos privados. El pipeline funciona sin GPU, pero aprovechará CUDA/Metal si está disponible.
-
Ingestar documentos (busca archivos en
data/rawpor defecto):python -m rag_advanced.cli ingest --source ./data/raw
-
Reconstruir el índice (embeddings + vector store + reranker):
python -m rag_advanced.cli build-index
-
Consultar:
python -m rag_advanced.cli query "¿Qué dice la documentación sobre el preprocesamiento?"
El comando query admite opciones como --top-k, --with-rerank/--no-rerank, --max-context-tokens y --config para cargar distintos perfiles.
Las pruebas básicas (carga de configuración) se ejecutan con pytest. Instala la dependencia (pip install pytest) y ejecuta:
pytest.
├── config/
│ └── default.yaml
├── data/
│ ├── processed/
│ └── raw/
├── src/
│ └── rag_advanced/
│ ├── __init__.py
│ ├── cli.py
│ ├── config.py
│ ├── ingestion.py
│ ├── preprocessing.py
│ ├── embeddings.py
│ ├── vector_store.py
│ ├── reranker.py
│ ├── generator.py
│ └── pipeline.py
└── tests/
└── ...
Los parámetros por defecto residen en config/default.yaml. Se pueden sobreescribir desde la CLI con --config otro_archivo.yaml o con flags individuales como --chunk-size 700. Entre los parámetros clave:
chunk_size,chunk_overlap: controlan el splitter.embedding_model.name: define el modelo de embeddings.vector_store.persist_path: ruta del índice persistente.generator.provider:transformers,openai,gemini,nvidiaomock.reranker.enabled: activa/desactiva el re-ranking semántico.
- Instala la dependencia (ya incluida en
requirements.txt):pip install google-generativeai. - Define la variable de entorno antes de ejecutar la CLI:
export GEMINI_API_KEY="tu_api_key_de_gemini"
- Asegúrate de que en
config/default.yaml(o tu archivo de configuración)generator.providerseageminiy ajustagenerator.gemini.modelsi deseas otro modelo (por ejemplomodels/gemini-1.5-pro). El valor por defecto usamodels/gemini-1.5-flash-latest; puedes listar tus opciones con:python - <<'PY' import google.generativeai as genai, os genai.configure(api_key=os.environ["GEMINI_API_KEY"]) for m in genai.list_models(): if "generateContent" in m.supported_generation_methods: print(m.name) PY
- Ejecuta los comandos habituales (
build-index,query).
Nota: nunca compartas tu API key en texto plano dentro del repositorio ni en archivos versionados.
- Instala dependencias (
pip install -r requirements.txt) para asegurarte de tenerrequests. - Exporta tu clave antes de usar la CLI:
export NVIDIA_API_KEY="tu_api_key_de_nvidia"
- En
config/default.yaml, colocagenerator.provider: nvidiay ajusta el bloquegenerator.nvidiasi deseas otro modelo o endpoint. Por ejemplo, puedes usarmeta/llama3-70b-instructo cualquier otro listado en NVIDIA API Catalog. - Ejecuta los comandos habituales (
build-index,query).
Si la API devuelve un error, la CLI mostrará el status_code y el cuerpo de la respuesta para que puedas diagnosticarlo (verifica cuotas, nombre del modelo y la validez de la API key).
- Añade nuevos loaders implementando
BaseLoadery registrándolos eningestion.py. - Sustituye el vector store creando otra implementación de
BaseVectorStore. - Integra un LLM distinto heredando de
BaseGenerator. - Para evaluación de retrieval se incluye un esqueleto en
tests/test_pipeline.pyque se puede ampliar con datasets controlados.
- Automatizar pipelines con
makeoinvoke. - Añadir un panel FastAPI + Streamlit para front interactivo.
- Incorporar métricas RAG (p.ej. Faithfulness con
ragas).
Este repositorio se publica sin licencia explícita. Ajusta este archivo según tus necesidades antes de distribuir.