- Este proyecto implementa un pipeline RAG para consultar cualquier PDF (en este caso solo texto) con embeddings de Hugging Face, almacenamiento y recuperación en Pinecone, compresión contextual (reranking) y generación con Gemini (Google Generative AI).
- El notebook
03_rag_pinecone_gemini.ipynbcontiene los bloques ejecutables del flujo (1–8).
- Extracción y partición: se extrae texto por página con
pypdfy se generan chunks conRecursiveCharacterTextSplitter. - Embeddings: se vectorizan los documentos y la consulta con
HuggingFaceEmbeddings(intfloat/multilingual-e5-base). - Índice vectorial: se crea/usa un índice Pinecone (serverless) alineado con la dimensión de los embeddings.
- Upsert: se suben los chunks con metadatos (
source,page) alnamespaceactivo. - Recuperación MMR: el retriever de LangChain consulta Pinecone (
index.query) y devuelve candidatos diversos y relevantes. - Compresor manual: se reordena/filtra localmente por similitud coseno con un umbral y
top_k. - Generación: se construye el contexto con citas
[p. N]y se invoca a Gemini con unSYSTEM_PROMPTclaro usando LCEL.
LangChain(LCEL) — orquestación declarativa de la cadena RAG.Pinecone— almacenamiento y recuperación vectorial escalable (serverless AWSus-east-1).Gemini 2.0 Flash— LLM para responder con base en el contexto recuperado.HuggingFaceEmbeddings— modelomultilingual-e5-basepara vectorizar texto y consultas.pypdf,langchain-text-splitters— extracción y chunking de PDF.NumPy— utilidades de similitud coseno en el compresor.python-dotenv— carga de variables desde.env.
GOOGLE_API_KEY— clave para Gemini.PINECONE_API_KEY— clave para Pinecone.PINECONE_REGION— región (por defectous-east-1).PC_INDEX_NAME— nombre del índice Pinecone (ej.prueba).PC_NAMESPACE— namespace; si no se define, se usadefaulto el vacío según el código.- Opcionales:
PDF_PATH,CHUNK_SIZE,CHUNK_OVERLAP,PC_RESET_IF_DIM_MISMATCH.
Important
Tras cambiar variables en .env, reinicia el kernel/notebook y ejecuta BLOQUES 1–7 en orden para que vectorstore/retriever/cretriever adopten el nuevo índice y namespace.
Note
Si prefieres INDEX_NAME en .env, ajusta el código para leer INDEX_NAME = os.getenv("INDEX_NAME", "prueba") o agrega PC_INDEX_NAME en el .env.
pip install -U langchain langchain-pinecone langchain-huggingface langchain-google-genai langchain-text-splitters pinecone pypdf python-dotenv numpy jupyterTip
Usa un entorno virtual para aislar dependencias: python -m venv .venv y actívalo (.venv\Scripts\Activate.ps1 en Windows PowerShell).
- BLOQUE 1 — Configuración y entorno.
- BLOQUE 2 — Embeddings locales (Hugging Face).
- BLOQUE 3 — Ingesta de PDF y chunking.
- BLOQUE 4 — Pinecone: creación/validación del índice.
- BLOQUE 5 — Upsert (subida de chunks a Pinecone).
- BLOQUE 6 — Retriever MMR y compresión contextual.
- BLOQUE 7 — Cadena RAG (LCEL) con Gemini.
- BLOQUE 8 — Consulta de ejemplo y páginas citadas.
Tip
Si saltas el BLOQUE 5, el BLOQUE 6 reconecta PineconeVectorStore al índice/namespace activo para poder consultar; si el namespace no tiene datos, verás pages = [].
stats = index.describe_index_stats()
ns = NAMESPACE or ""
vc = stats.get("namespaces", {}).get(ns, {}).get("vector_count", 0)
print(f"Namespace activo: '{ns}' · vector_count={vc}")- Cambia
PC_NAMESPACEa uno vacío o nuevo, reinicia y ejecuta BLOQUES 1–4 y 6–8 (sin upsert): deberías verpages = [].
Warning
Si el namespace activo no contiene vectores (no hiciste upsert), docs_used estará vacío y pages = []. El modelo debería indicar falta de información según el SYSTEM_PROMPT.
Important
La dimensión del índice debe coincidir con detected_dim del modelo de embeddings. Si hay discrepancia y defines PC_RESET_IF_DIM_MISMATCH=true, el índice se recreará para alinearse.
- Chunking:
CHUNK_SIZEyCHUNK_OVERLAPpara equilibrio de contexto y redundancia. - MMR:
k,fetch_k,lambda_multpara diversidad vs relevancia. - Compresor:
similarity_thresholdytop_kpara controlar el filtro. - Prompt: reforzar “no inventar” y exigir citas en
[p. N].
Note
En consultas multilingües, añade sinónimos en la pregunta (por ejemplo: "conclusión", "conclusiones", "conclusion") para mejorar el recall.
Caution
No subas .env al repositorio ni compartas claves en issues/PRs/notebooks. Evita incluir credenciales en capturas o logs.
Important
Si alguna clave se expuso, rótala de inmediato en Google y Pinecone y actualiza tu .env antes de continuar. Son cosas obvias pero todos empezamos de 0 alguna vez.