📚

RAG con Documentos PDF

👨‍🍳👑 Master Chef⏱️ 45 minutos

📋 Prerequisitos sugeridos

  • Python
  • API de LLM (Gemini)

Lo que vas a construir

Un sistema RAG (Retrieval-Augmented Generation) que responde preguntas sobre tus propios documentos PDF.

Cargas tus PDFs (contratos, manuales, documentacion), y puedes preguntarle cosas como "Cual es la politica de devolucion?" o "Que dice el articulo 5?". El sistema busca en tus documentos, encuentra la informacion relevante, y genera una respuesta precisa usando IA.

Al terminar tendras un script en Python que procesa PDFs, crea embeddings con Gemini, los guarda en ChromaDB, y responde preguntas basandose en el contenido real de tus documentos.


El prompt para empezar

Crea un sistema RAG en Python que:

  1. Cargue PDFs de una carpeta
  2. Los divida en chunks de 500 caracteres
  3. Cree embeddings con Gemini
  4. Guarde en ChromaDB
  5. Permita hacer preguntas y obtenga contexto relevante
  6. Use Gemini para responder basándose en el contexto

Lo que la IA creará

from PyPDF2 import PdfReader
import chromadb
from chromadb.utils import embedding_functions
import google.generativeai as genai
import os

# Configurar
genai.configure(api_key=os.environ["GEMINI_API_KEY"])
model = genai.GenerativeModel("gemini-1.5-flash")

# ChromaDB con embeddings de Gemini
client = chromadb.Client()
gemini_ef = embedding_functions.GoogleGenerativeAiEmbeddingFunction(
    api_key=os.environ["GEMINI_API_KEY"]
)
collection = client.create_collection("docs", embedding_function=gemini_ef)

def load_pdfs(folder: str) -> list[str]:
    """Cargar todos los PDFs de una carpeta"""
    chunks = []
    for file in os.listdir(folder):
        if file.endswith(".pdf"):
            reader = PdfReader(os.path.join(folder, file))
            text = "".join(page.extract_text() for page in reader.pages)
            # Dividir en chunks
            for i in range(0, len(text), 500):
                chunks.append(text[i:i+500])
    return chunks

def index_documents(folder: str):
    """Indexar documentos en ChromaDB"""
    chunks = load_pdfs(folder)
    collection.add(
        documents=chunks,
        ids=[f"chunk_{i}" for i in range(len(chunks))]
    )
    print(f"Indexados {len(chunks)} chunks")

def ask(question: str) -> str:
    """Preguntar al RAG"""
    # Buscar contexto relevante
    results = collection.query(
        query_texts=[question],
        n_results=3
    )
    context = "\n---\n".join(results["documents"][0])

    # Generar respuesta con contexto
    prompt = f"""Responde usando SOLO la información del contexto.
Si no está en el contexto, di "No tengo esa información".

CONTEXTO:
{context}

PREGUNTA: {question}"""

    response = model.generate_content(prompt)
    return response.text

# Uso
index_documents("./mis_documentos")
respuesta = ask("¿Cuál es el proceso de onboarding?")
print(respuesta)

Instalación

pip install PyPDF2 chromadb google-generativeai

Mejoras sugeridas

MejoraDescripción
Chunks semánticosDividir por párrafos
MetadataGuardar nombre de archivo
RerankingReordenar resultados
StreamingRespuesta en tiempo real

Siguiente nivel

Búsqueda Vectorial