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.