Módulo 7: RAG y Semantic Search
3. Arquitectura de RAG: Componentes y Flujos
Descripción
Aquí diseñas la arquitectura conceptual de RAG: componentes (vector DB, embeddings, LLM), flujos de datos (indexación, query), y cómo todo se integra.
Arquitectura completa de RAG
┌────────────────────────────────────────────────┐
│ RAG SYSTEM │
├────────────────────────────────────────────────┤
│ │
│ FASE 1: INDEXACIÓN (Offline) │
│ ┌──────────────────────────────────┐ │
│ │ Docs → Chunks → Embeddings → DB │ │
│ └──────────────────────────────────┘ │
│ │
│ FASE 2: RETRIEVAL (Online) │
│ ┌──────────────────────────────────┐ │
│ │ Query → Embedding → kNN → Chunks│ │
│ └──────────────────────────────────┘ │
│ │
│ FASE 3: AUGMENTATION (Online) │
│ ┌──────────────────────────────────┐ │
│ │ Query + Chunks → Prompt │ │
│ └──────────────────────────────────┘ │
│ │
│ FASE 4: GENERATION (Online) │
│ ┌──────────────────────────────────┐ │
│ │ Prompt → LLM → Response │ │
│ └──────────────────────────────────┘ │
│ │
└────────────────────────────────────────────────┘
Componentes de RAG
1. Vector Database
Función: Almacenar embeddings de documentos
Ejemplos:
- Pinecone (managed)
- Weaviate (open-source)
- Qdrant (open-source)
- FAISS (library)
Datos almacenados:
- Embeddings (vectores 1536D)
- Metadata (source, page, timestamp)
- Texto original (chunks)
2. Embedding Model
Función: Convertir texto a vectores
Ejemplos:
- OpenAI
text-embedding-3-small(1536D) - OpenAI
text-embedding-3-large(3072D) - Cohere
embed-v3(1024D) - Sentence-BERT (768D, local)
Uso:
- Indexación: Convertir documentos a embeddings
- Query: Convertir pregunta del usuario a embedding
3. LLM (Large Language Model)
Función: Generar respuesta basada en contexto
Ejemplos:
- GPT-4 Turbo (128K context)
- GPT-4o (128K context)
- Claude 3 Opus (200K context)
- Llama 3 (8K context, local)
Input: Prompt = Query + Retrieved chunks
Output: Respuesta generada
4. Orchestration Layer
Función: Coordinar flujo completo (retrieval → augmentation → generation)
Frameworks:
- LangChain (Python/JS)
- LlamaIndex (Python)
- Haystack (Python)
- Custom (FastAPI + OpenAI SDK)
Flujo detallado: De query a respuesta
Fase 1: Indexación (una vez, offline)
1. Ingestión de documentos
Input: 1000 PDFs
Output: Texto extraído
2. Chunking
Input: Texto largo
Output: 10K chunks (500 tokens cada uno)
3. Embedding
Input: 10K chunks
Output: 10K embeddings (1536D)
API: OpenAI text-embedding-3-small
4. Almacenamiento
Input: 10K embeddings + metadata + texto
Output: Índice en Pinecone
Costo: ~$0.10 (10K chunks × 500 tokens = 5M tokens; 5,000 × $0.00002/1K tokens)
Tiempo: 5-10 minutos
Fase 2: Retrieval (cada query)
User Query: "¿Cómo usar Pinecone con OpenAI?"
1. Query embedding
Input: "¿Cómo usar Pinecone con OpenAI?"
Output: [0.23, -0.45, ..., -0.34]
API: OpenAI text-embedding-3-small
Latencia: 50-200ms
2. kNN search
Input: Query embedding
Vector DB: Pinecone
Top-K: 5
Output: 5 chunks más relevantes
Latencia: 10-50ms
Ejemplo de chunks retornados:
- Chunk 1: "Guía de integración Pinecone con OpenAI..." (score: 0.92)
- Chunk 2: "Ejemplo de código: OpenAI embeddings..." (score: 0.88)
- Chunk 3: "FAQ: ¿Cómo conectar Pinecone?" (score: 0.85)
- Chunk 4: "Setup inicial de Pinecone..." (score: 0.82)
- Chunk 5: "Troubleshooting común..." (score: 0.80)
Fase 3: Augmentation (construcción de prompt)
Prompt construido:
"""
Eres un asistente experto en Pinecone y OpenAI.
Contexto (documentación oficial):
[Chunk 1]
Guía de integración Pinecone con OpenAI:
1. Generar embeddings con OpenAI API
2. Upsert embeddings a Pinecone
3. Query con cosine similarity
...
[Chunk 2]
Ejemplo de código: OpenAI embeddings
```python
embedding = openai.Embedding.create(
input="texto",
model="text-embedding-3-small"
)
...
[Chunk 3-5] ...
Pregunta del usuario: ¿Cómo usar Pinecone con OpenAI?
Instrucciones:
- Responde basándote SOLO en el contexto provisto
- Si el contexto no contiene la respuesta, di "No tengo información suficiente"
- Cita las fuentes cuando sea relevante """
**Tamaño del prompt:** ~2500 tokens (5 chunks × 500 tokens)
---
### **Fase 4: Generation (LLM genera respuesta)**
Input: Prompt completo (2500 tokens) LLM: GPT-4 Turbo Output:
"Para usar Pinecone con OpenAI, sigue estos pasos:
-
Generar embeddings con OpenAI: Usa el modelo
text-embedding-3-smallpara convertir tu texto en vectores de 1536 dimensiones.embedding = openai.Embedding.create( input="tu texto aquí", model="text-embedding-3-small" ) -
Upsert a Pinecone: Almacena los embeddings en tu índice de Pinecone:
index.upsert(vectors=[(id, embedding, metadata)]) -
Query con similaridad coseno: Busca vectores similares usando cosine similarity (por defecto en Pinecone).
Para más detalles, consulta la guía oficial de integración."
Latencia: 2-5 segundos (generación)
---
## Latencia total del flujo
- Query embedding: 50-200ms
- kNN search: 10-50ms
- Prompt construction: <10ms
- LLM generation: 2-5 segundos
Total: 2.1-5.3 segundos
**Optimizaciones:**
- Cache query embeddings frecuentes
- Streaming LLM (usuario ve respuesta mientras genera)
- Modelo más rápido (GPT-3.5 vs GPT-4)
---
## Diagrama de flujo completo
User Query ↓ [Embed Query] (OpenAI) ↓ [kNN Search] (Pinecone) ↓ [Top-K Chunks] ↓ [Build Prompt] (Query + Chunks) ↓ [LLM Generate] (GPT-4) ↓ Response to User
---
## Resumen
**Puntos clave:**
- **Arquitectura:** Vector DB + Embeddings + LLM + Orchestration
- **Flujo:** Indexación (offline) → Retrieval → Augmentation → Generation
- **Componentes:** Pinecone, OpenAI embeddings, GPT-4, LangChain
- **Latencia:** 2-5 segundos típica (con LLM generation)
---
**Próxima cápsula:** `04-the-rag-flow-step-by-step.md` — Ejemplo detallado con datos reales.