Módulo 7: RAG y Semantic Search
4. Flujo RAG Paso a Paso con Ejemplo Real
Descripción
Esta cápsula te guía por un ejemplo completo de RAG: desde documentos crudos hasta respuesta generada, con datos reales y decisiones específicas en cada paso.
Escenario: Sistema de Q&A de Documentación
Contexto:
Startup con 50 documentos internos (guías de producto, tutoriales, FAQ). Quieren un chatbot que responda preguntas de empleados.
Documentos:
guia-setup.pdf(20 páginas)faq-soporte.pdf(15 páginas)arquitectura-producto.pdf(30 páginas)- ... (47 documentos más)
PASO 1: Indexación de documentos
1.1 Extracción de texto
guia-setup.pdf → Extraer texto (PyPDF2)
→ 10,000 palabras (~12,500 tokens)
faq-soporte.pdf → Extraer texto
→ 7,500 palabras (~9,375 tokens)
...
Total: 50 documentos → ~300K tokens
1.2 Chunking
Estrategia: Fixed-size (500 tokens, overlap 50)
guia-setup.pdf (12,500 tokens):
→ Chunk 1: tokens 0-500
→ Chunk 2: tokens 450-950 (overlap 50)
→ Chunk 3: tokens 900-1400
...
→ 26 chunks
faq-soporte.pdf (9,375 tokens):
→ 20 chunks
...
Total: 50 docs → ~620 chunks
1.3 Generación de embeddings
Modelo: OpenAI text-embedding-3-small (1536D)
Para cada chunk:
text = "Guía de setup: Para configurar..."
embedding = openai.embeddings.create(
input=text,
model="text-embedding-3-small"
)
→ [0.23, -0.45, 0.12, ..., -0.34]
Costo: 620 chunks × 500 tokens = 310K tokens
→ $0.00002/1K tokens × 310 = $0.0062 (~0.6 centavos)
1.4 Almacenamiento en Pinecone
pinecone.init(api_key="...", environment="us-west1-gcp")
index = pinecone.Index("documentacion-interna")
Para cada chunk:
index.upsert(vectors=[
{
"id": "guia-setup-chunk-1",
"values": [0.23, -0.45, ...],
"metadata": {
"source": "guia-setup.pdf",
"page": 1,
"text": "Guía de setup: Para configurar..."
}
}
])
Total: 620 upserts (batch de 100)
Tiempo: ~30 segundos
Indexación completa:
- Costo: $0.0062
- Tiempo: ~5 minutos (extracción + chunking + embedding + upsert)
PASO 2: Query del usuario
User query: "¿Cómo configurar el entorno de desarrollo?"
PASO 3: Retrieval (búsqueda)
3.1 Embedding de query
query = "¿Cómo configurar el entorno de desarrollo?"
query_embedding = openai.embeddings.create(
input=query,
model="text-embedding-3-small"
)
→ [0.24, -0.44, 0.13, ..., -0.33]
Latencia: 120ms
3.2 kNN search en Pinecone
results = index.query(
vector=query_embedding,
top_k=5,
include_metadata=True
)
Resultados:
1. id: guia-setup-chunk-3
score: 0.91
metadata:
source: guia-setup.pdf
page: 2
text: "Para configurar el entorno de desarrollo:
1. Instalar Node.js 18+
2. Clonar repositorio
3. npm install
4. Configurar .env con API keys..."
2. id: guia-setup-chunk-5
score: 0.88
metadata:
source: guia-setup.pdf
page: 3
text: "Variables de entorno necesarias:
- DATABASE_URL: URL de PostgreSQL
- OPENAI_API_KEY: Tu key de OpenAI
- PORT: Puerto del servidor (default: 3000)..."
3. id: faq-soporte-chunk-12
score: 0.85
metadata:
source: faq-soporte.pdf
page: 8
text: "Pregunta frecuente: ¿Cómo solucionar error 'module not found'?
Respuesta: Verifica que ejecutaste npm install..."
4. id: arquitectura-chunk-7
score: 0.79
metadata:
source: arquitectura-producto.pdf
page: 4
text: "Stack técnico: Node.js + PostgreSQL + Redis..."
5. id: guia-setup-chunk-1
score: 0.76
metadata:
source: guia-setup.pdf
page: 1
text: "Bienvenido a la guía de setup del producto..."
Latencia: 40ms
PASO 4: Augmentation (construcción de prompt)
# Construir contexto con top-5 chunks
context = ""
for i, result in enumerate(results, 1):
context += f"\n[Chunk {i}] ({result['metadata']['source']}, página {result['metadata']['page']})\n"
context += result['metadata']['text'] + "\n"
# Prompt completo
prompt = f"""
Eres un asistente interno de nuestra empresa. Responde basándote SOLO en la documentación provista.
DOCUMENTACIÓN:
{context}
---
PREGUNTA DEL USUARIO: {query}
INSTRUCCIONES:
- Responde de forma clara y concisa
- Si la respuesta no está en la documentación, di "No tengo información sobre esto"
- Cita la fuente cuando sea relevante (ej: "Según la guía de setup, página 2...")
"""
Prompt final (~2200 tokens):
Eres un asistente interno de nuestra empresa. Responde basándote SOLO en la documentación provista.
DOCUMENTACIÓN:
[Chunk 1] (guia-setup.pdf, página 2)
Para configurar el entorno de desarrollo:
1. Instalar Node.js 18+
2. Clonar repositorio
3. npm install
4. Configurar .env con API keys...
[Chunk 2] (guia-setup.pdf, página 3)
Variables de entorno necesarias:
- DATABASE_URL: URL de PostgreSQL
- OPENAI_API_KEY: Tu key de OpenAI
- PORT: Puerto del servidor (default: 3000)...
[Chunk 3] (faq-soporte.pdf, página 8)
Pregunta frecuente: ¿Cómo solucionar error 'module not found'?
Respuesta: Verifica que ejecutaste npm install...
[Chunk 4] (arquitectura-producto.pdf, página 4)
Stack técnico: Node.js + PostgreSQL + Redis...
[Chunk 5] (guia-setup.pdf, página 1)
Bienvenido a la guía de setup del producto...
---
PREGUNTA DEL USUARIO: ¿Cómo configurar el entorno de desarrollo?
INSTRUCCIONES:
- Responde de forma clara y concisa
- Si la respuesta no está en la documentación, di "No tengo información sobre esto"
- Cita la fuente cuando sea relevante
PASO 5: Generation (LLM genera respuesta)
response = openai.chat.completions.create(
model="gpt-4-turbo",
messages=[
{"role": "system", "content": "Eres un asistente interno."},
{"role": "user", "content": prompt}
],
temperature=0.1 # Baja temperatura para respuestas precisas
)
Latencia: 3.2 segundos
Respuesta generada:
Para configurar el entorno de desarrollo, sigue estos pasos (según la guía de setup, página 2):
1. **Instalar Node.js 18+**
Descarga desde nodejs.org
2. **Clonar el repositorio**
git clone https://github.com/empresa/proyecto.git cd proyecto
3. **Instalar dependencias**
npm install
4. **Configurar variables de entorno**
Crea un archivo `.env` con las siguientes variables (guía de setup, página 3):
- `DATABASE_URL`: URL de tu PostgreSQL
- `OPENAI_API_KEY`: Tu API key de OpenAI
- `PORT`: Puerto del servidor (default: 3000)
Si encuentras el error "module not found", verifica que ejecutaste `npm install` correctamente (FAQ de soporte, página 8).
¿Necesitas ayuda con algún paso específico?
PASO 6: Retornar respuesta al usuario
Output final:
{
"query": "¿Cómo configurar el entorno de desarrollo?",
"response": "Para configurar el entorno de desarrollo...",
"sources": [
{"file": "guia-setup.pdf", "page": 2},
{"file": "guia-setup.pdf", "page": 3},
{"file": "faq-soporte.pdf", "page": 8}
],
"latency_ms": 3360
}
Resumen de latencia y costo
Latencia:
- Query embedding: 120ms
- kNN search: 40ms
- Prompt construction: <10ms
- LLM generation: 3200ms
Total: 3360ms (~3.4 segundos)
Costo por query:
- Query embedding: $0.00000004 (2 tokens × $0.00002/1K)
- kNN search: Incluido en Pinecone (plan $70/mes)
- LLM generation: $0.022 (2200 tokens input × $0.01/1K)
Total: ~$0.022 por query
Optimizaciones posibles:
- Usar GPT-3.5 → 10x más barato, 2x más rápido
- Cache queries frecuentes
- Streaming de respuesta
Resumen
Puntos clave:
- Indexación: 50 docs → 620 chunks → $0.0062, 5 min
- Query: Embedding → kNN → Prompt → LLM → 3.4s, $0.022
- Fuentes: Respuesta cita fuentes específicas (explicable)
- Precisión: No hallucinations (respuesta basada en docs reales)
Próxima cápsula: 05-rag-vs-fine-tuning.md — Cuándo usar cada uno.