Módulo 1: RAG Pipeline Completo (Architecture Overview)

Arquitectura Overview: Módulos 2-8

Descripción de la cápsula

Esta guía tiene 8 módulos. Módulo 1 (este) te dio el baseline: RAG pipeline completo, decisiones de arquitectura, métricas, casos reales. Módulos 2-8 te enseñan técnicas avanzadas que mejoran cada componente del pipeline.

Esta cápsula te muestra el roadmap completo: qué aprenderás en cada módulo, cómo se conectan entre sí, qué mejoras de performance esperar, y cómo el proyecto evolutivo integra todas las técnicas en un sistema RAG production-ready.

Sin este overview, módulos 2-8 parecerían desconectados. Con este overview, entenderás que chunking (M2) optimiza Indexing, re-ranking (M4) optimiza Retrieval, metadata filtering (M6) optimiza search space, y evaluation (M8) mide todo el sistema para identificar gaps y aplicar mejoras iterativamente.


🗺️ Roadmap de la Guía

Vista de alto nivel:

Módulo 1: RAG Pipeline Completo (Baseline)
   ↓
Phase 1: Fundamentos Avanzados
├─ Módulo 2: Chunking Strategies
├─ Módulo 3: Query Optimization
└─ Módulo 4: Re-ranking Techniques
   ↓
Phase 2: Técnicas de Retrieval
├─ Módulo 5: Hybrid Search (BM25 + Embeddings)
└─ Módulo 6: Metadata Filtering
   ↓
Phase 3: Production & Integration
├─ Módulo 7: Production Vector DBs (Pinecone)
└─ Módulo 8: RAG Evaluation & Testing (RAGAS)

📐 Arquitectura RAG Completa

Pipeline baseline (Módulo 1):

┌─────────────────────────────────────────┐
│          INDEXING (Offline)             │
├─────────────────────────────────────────┤
│ 1. Chunking: Fixed-size (naive)        │
│ 2. Embeddings: OpenAI ada-002          │
│ 3. Storage: ChromaDB (local)           │
└─────────────────────────────────────────┘
              ↓
┌─────────────────────────────────────────┐
│         RETRIEVAL (Query time)          │
├─────────────────────────────────────────┤
│ 1. Query: Direct (sin optimización)    │
│ 2. Search: Semantic (embeddings)       │
│ 3. Ranking: Cosine similarity           │
└─────────────────────────────────────────┘
              ↓
┌─────────────────────────────────────────┐
│        GENERATION (Query time)          │
├─────────────────────────────────────────┤
│ 1. Context: Top-K docs                 │
│ 2. LLM: GPT-3.5-turbo                  │
│ 3. Response: Text                       │
└─────────────────────────────────────────┘
              ↓
┌─────────────────────────────────────────┐
│          EVALUATION (Manual)            │
├─────────────────────────────────────────┤
│ 1. Métricas: Latency, Precision (manual)│
│ 2. Testing: Ad-hoc queries              │
└─────────────────────────────────────────┘

Performance baseline:

  • Latency P95: 800ms
  • Precision@5: 68%
  • Recall@50: 52%
  • Faithfulness: N/A (sin framework)

Pipeline avanzado (Módulos 2-8):

┌─────────────────────────────────────────┐
│          INDEXING (Offline)             │
├─────────────────────────────────────────┤
│ 1. Chunking: Recursive + Semantic (M2) │ ← +15% precision
│ 2. Embeddings: OpenAI ada-002          │
│ 3. Storage: Pinecone (production) (M7) │ ← Scalability
│ 4. Metadata: date, type, source (M6)   │ ← Filtering
└─────────────────────────────────────────┘
              ↓
┌─────────────────────────────────────────┐
│         RETRIEVAL (Query time)          │
├─────────────────────────────────────────┤
│ 1. Query Optimization: Expansion (M3)  │ ← +25% recall
│ 2. Hybrid Search: BM25 + Semantic (M5) │ ← +18% precision
│ 3. Metadata Filter: Pre-filtering (M6) │ ← -90% search space
│ 4. Re-ranking: Cross-encoder (M4)      │ ← +20% precision
└─────────────────────────────────────────┘
              ↓
┌─────────────────────────────────────────┐
│        GENERATION (Query time)          │
├─────────────────────────────────────────┤
│ 1. Context: Top-K re-ranked docs       │
│ 2. LLM: GPT-3.5-turbo                  │
│ 3. Response: Text + Sources             │
└─────────────────────────────────────────┘
              ↓
┌─────────────────────────────────────────┐
│       EVALUATION (Automated) (M8)       │
├─────────────────────────────────────────┤
│ 1. RAGAS: faithfulness, relevancy      │ ← Automated metrics
│ 2. Golden Dataset: 50 test queries     │ ← Regression testing
│ 3. CI/CD: Auto-eval en cada deploy     │ ← Continuous quality
└─────────────────────────────────────────┘

Performance avanzado (target Módulo 8):

  • Latency P95: 1,200ms (+400ms por optimizations)
  • Precision@5: 88% (+20% vs baseline)
  • Recall@50: 77% (+25% vs baseline)
  • Faithfulness: 0.92 (automated con RAGAS)

Trade-off aceptado: +400ms latency por +20-25% accuracy (vale la pena para most cases).


📦 Módulo 2: Chunking Strategies

Objetivo:

Optimizar cómo divides documentos largos en chunks para maximizar retrieval quality.

Problema del baseline:

# Fixed-size chunking (naive)
chunks = [document[i:i+500] for i in range(0, len(document), 500)]

# Problema 1: Corta en medio de oración
# "FastAPI es un framework web. Fue crea..." ← Oración cortada

# Problema 2: Pierde contexto semántico
# Chunk 1: "Python es..."
# Chunk 2: "...un lenguaje interpretado"
# Problema: "Python" y "lenguaje" están en chunks diferentes

Técnicas que aprenderás:

1. Recursive Chunking (LangChain):

from langchain.text_splitter import RecursiveCharacterTextSplitter

splitter = RecursiveCharacterTextSplitter(
    chunk_size=500,
    chunk_overlap=50,  # Overlap preserva contexto
    separators=["\n\n", "\n", ". ", " ", ""]
)

chunks = splitter.split_text(document)

# Beneficio: Respeta párrafos y oraciones

Mejora esperada: +10-15% precision (chunks más coherentes)


2. Semantic Chunking (Embeddings-based):

from langchain.text_splitter import SemanticChunker
from langchain_openai import OpenAIEmbeddings

splitter = SemanticChunker(OpenAIEmbeddings())
chunks = splitter.split_text(document)

# Beneficio: Divide por temas (coherencia semántica)

Mejora esperada: +15-20% precision (best quality)
Trade-off: +costo embeddings, +latency en indexing


3. Structural Chunking (Code, HTML, Markdown):

# Para código: Chunking por funciones
import ast

def chunk_by_functions(python_code):
    tree = ast.parse(python_code)
    return [ast.get_source_segment(python_code, node) 
            for node in ast.walk(tree) 
            if isinstance(node, ast.FunctionDef)]

# Para HTML: Chunking por secciones
from bs4 import BeautifulSoup

def chunk_by_sections(html):
    soup = BeautifulSoup(html, 'html.parser')
    return [section.get_text() for section in soup.find_all('section')]

Mejora esperada: +20-25% precision para código/HTML (respeta estructura)


Proyecto Módulo 2:

Implementar 3 chunking strategies en baseline RAG, comparar performance:

# Comparación de chunking
baseline_fixed = benchmark_rag(chunking="fixed")
# Precision@5: 68%

recursive = benchmark_rag(chunking="recursive")
# Precision@5: 78% (+10%)

semantic = benchmark_rag(chunking="semantic")
# Precision@5: 83% (+15%)

🔍 Módulo 3: Query Optimization

Objetivo:

Optimizar la query del usuario antes de buscar para aumentar recall y precision.

Problema del baseline:

# Query directa sin optimización
user_query = "¿Qué es FastAPI?"

# Problema: Query puede ser ambigua, incompleta, o mal formulada
# "FastAPI" → ¿El usuario busca qué es, cómo instalarlo, o ejemplos?

Técnicas que aprenderás:

1. Query Expansion (Aumentar recall):

# Generar múltiples queries similares
expanded_queries = [
    "¿Qué es FastAPI?",
    "FastAPI framework explicación",
    "Características de FastAPI",
    "FastAPI vs Flask"
]

# Buscar con todas y merge resultados

Mejora esperada: +20-30% recall (encuentras más docs relevantes)


2. Query Rewriting (Claridad):

# Reformular query para claridad
user_query = "fastapi auth"  # Ambiguo

rewritten_query = llm.invoke(f"""
Reformula esta query para búsqueda en documentación:
Query: {user_query}
Reformulada:
""")

# Output: "How to implement authentication in FastAPI using OAuth2"

Mejora esperada: +10-15% precision (queries más claras)


3. Query Decomposition (Multi-hop):

# Query compleja → Sub-queries simples
user_query = "Compare FastAPI and Flask authentication approaches"

decomposed = [
    "FastAPI authentication methods",
    "Flask authentication methods",
    "Compare FastAPI vs Flask"
]

# Buscar cada sub-query y agregar resultados

Mejora esperada: +15-20% precision para queries complejas


4. HyDE (Hypothetical Document Embeddings):

# Generar documento hipotético que respondería la query
hypothetical_doc = llm.invoke(f"""
Write a document that would answer: {user_query}
""")

# Buscar con embedding del documento hipotético (no query)
hyde_embedding = create_embedding(hypothetical_doc)
results = collection.query(query_embeddings=[hyde_embedding])

Mejora esperada: +15-25% recall (embeddings de docs > embeddings de queries)


Proyecto Módulo 3:

Implementar query optimization en baseline RAG:

baseline = benchmark_rag(query_optimization=None)
# Recall@50: 52%

expansion = benchmark_rag(query_optimization="expansion")
# Recall@50: 67% (+15%)

hyde = benchmark_rag(query_optimization="hyde")
# Recall@50: 72% (+20%)

🎯 Módulo 4: Re-ranking Techniques

Objetivo:

Mejorar precision de retrieval re-ordenando top-K documentos con modelos más sofisticados.

Problema del baseline:

# Similarity search devuelve top-5
results = collection.query(query_embeddings=[...], n_results=5)

# Problema: Cosine similarity no es perfecto
# Algunos docs con similarity alta son false positives
# Precision@5: 68% (32% son irrelevantes)

Técnicas que aprenderás:

1. Cross-Encoder Re-ranking:

from sentence_transformers import CrossEncoder

# 1. Retrieval amplio (top-20)
results = collection.query(query_embeddings=[...], n_results=20)

# 2. Re-ranking con cross-encoder
model = CrossEncoder('cross-encoder/ms-marco-MiniLM-L-6-v2')
scores = model.predict([(user_query, doc) for doc in results['documents'][0]])

# 3. Seleccionar top-5 re-rankeados
top_5 = [results['documents'][0][i] for i in np.argsort(scores)[::-1][:5]]

Mejora esperada: +20-25% precision
Trade-off: +150-200ms latency


2. LLM-based Re-ranking:

# Re-rankear con LLM
reranking_prompt = f"""
Query: {user_query}

Documents:
1. {doc1}
2. {doc2}
3. {doc3}

Rank documents by relevance (output: 2,1,3 for example):
"""

ranking = llm.invoke(reranking_prompt)
# Output: "2,1,3" (doc2 más relevante, luego doc1, luego doc3)

Mejora esperada: +25-30% precision (best quality)
Trade-off: +500-800ms latency, +costo LLM


3. Cohere Rerank API:

import cohere

co = cohere.Client("api_key")

reranked = co.rerank(
    query=user_query,
    documents=[doc1, doc2, doc3],
    top_n=5,
    model="rerank-english-v2.0"
)

# Output: Documentos re-rankeados por Cohere

Mejora esperada: +22-27% precision
Trade-off: +100-150ms latency, $2/1K rerank calls


Proyecto Módulo 4:

Implementar re-ranking en baseline RAG:

baseline = benchmark_rag(reranking=None)
# Precision@5: 68%

cross_encoder = benchmark_rag(reranking="cross_encoder")
# Precision@5: 88% (+20%)
# Latency: +180ms

cohere = benchmark_rag(reranking="cohere")
# Precision@5: 90% (+22%)
# Latency: +120ms

🔀 Módulo 5: Hybrid Search (BM25 + Embeddings)

Objetivo:

Combinar keyword search (BM25) y semantic search (embeddings) para mejor cobertura.

Problema del baseline:

# Semantic search solo
query = "FastAPI OAuth2PasswordBearer"

# Problema 1: Miss exact match de "OAuth2PasswordBearer" (nombre de clase)
# Semantic puede confundir con "OAuth2AuthorizationCodeBearer"

# Problema 2: Miss keyword-heavy queries ("API endpoint /users/{id}")

Técnicas que aprenderás:

1. BM25 + Embeddings con RRF:

from rank_bm25 import BM25Okapi

# 1. BM25 keyword search
bm25_results = bm25.get_top_n(query.split(), corpus, n=50)

# 2. Semantic search
semantic_results = collection.query(query_embeddings=[...], n_results=50)

# 3. Reciprocal Rank Fusion
def rrf(bm25_results, semantic_results, k=60):
    scores = {}
    for rank, doc in enumerate(bm25_results, 1):
        scores[doc] = scores.get(doc, 0) + 1/(k + rank)
    for rank, doc in enumerate(semantic_results, 1):
        scores[doc] = scores.get(doc, 0) + 1/(k + rank)
    return sorted(scores.items(), key=lambda x: x[1], reverse=True)

merged = rrf(bm25_results, semantic_results)

Mejora esperada: +15-20% precision, +10-15% recall


2. Weighted Hybrid (α blending):

# Combinar scores con peso
alpha = 0.7  # 70% semantic, 30% BM25

hybrid_score = alpha * semantic_score + (1 - alpha) * bm25_score

Mejora esperada: +12-18% precision (tunable con α)


Proyecto Módulo 5:

Implementar hybrid search:

baseline_semantic = benchmark_rag(search="semantic")
# Precision@5: 68%, Recall@50: 52%

baseline_bm25 = benchmark_rag(search="bm25")
# Precision@5: 72%, Recall@50: 48%

hybrid_rrf = benchmark_rag(search="hybrid_rrf")
# Precision@5: 83% (+15%), Recall@50: 62% (+10%)

🏷️ Módulo 6: Metadata Filtering

Objetivo:

Filtrar search space con metadata (date, type, source) antes de semantic search.

Problema del baseline:

# Search sin filtering
results = collection.query(query_embeddings=[...], n_results=5)

# Problema: Busca en TODO el corpus (100K docs)
# Muchos docs irrelevantes por contexto (ej: docs de hace 5 años)

Técnicas que aprenderás:

1. Pre-filtering (Metadata WHERE):

# Filtrar ANTES de semantic search
results = collection.query(
    query_embeddings=[...],
    n_results=5,
    where={
        "date": {"$gte": "2024-01-01"},  # Solo docs de 2024
        "type": "tutorial",               # Solo tutorials
        "source": "official_docs"         # Solo docs oficiales
    }
)

# Beneficio: Search space reducido 95% (100K → 5K docs)

Mejora esperada: +10-15% precision, -90% search space


2. Post-filtering (Filter después):

# Retrieval primero, filtrar después
results = collection.query(query_embeddings=[...], n_results=50)

# Filtrar por metadata
filtered = [doc for doc in results['documents'][0] 
            if doc['metadata']['type'] == 'tutorial'][:5]

Trade-off: Pre-filtering > post-filtering (más eficiente)


3. Multi-tenant Filtering (Privacy):

# Cada usuario tiene workspace_id
results = collection.query(
    query_embeddings=[...],
    n_results=5,
    where={"workspace_id": user.workspace_id}  # Privacy-critical
)

# Beneficio: Zero cross-workspace leakage

Proyecto Módulo 6:

Implementar metadata filtering:

baseline = benchmark_rag(filtering=None)
# Precision@5: 68%, Search space: 100K docs

pre_filtering = benchmark_rag(filtering="pre", metadata=["date", "type"])
# Precision@5: 81% (+13%), Search space: 8K docs (-92%)

🚀 Módulo 7: Production Vector DBs (Pinecone)

Objetivo:

Migrar de ChromaDB (dev, local) a Pinecone (production, managed) para escalabilidad.

Problema del baseline:

# ChromaDB local
client = chromadb.Client()

# Problema 1: Performance degrada con >100K docs
# 10K docs: 30ms query ✅
# 100K docs: 300ms query ⚠️
# 1M docs: 3,000ms query ❌

# Problema 2: Single-machine (no distributed)
# Problema 3: No managed (tú administras backups, updates, etc.)

Técnicas que aprenderás:

1. Migrar ChromaDB → Pinecone:

from pinecone import Pinecone

# Setup Pinecone
pc = Pinecone(api_key="...")
index = pc.create_index(name="my-index", dimension=1536, metric="cosine")

# Migrar datos de ChromaDB
chroma_docs = chroma_collection.get()

# Batch upsert a Pinecone
index.upsert(
    vectors=[
        (id, embedding, metadata)
        for id, embedding, metadata in zip(
            chroma_docs['ids'],
            chroma_docs['embeddings'],
            chroma_docs['metadatas']
        )
    ],
    batch_size=100
)

2. Pinecone Features:

# Namespaces (multi-tenant)
index.upsert(vectors=[...], namespace="user_123")
index.query(vector=[...], namespace="user_123")

# Metadata filtering (pre-filtering)
index.query(
    vector=[...],
    filter={"type": {"$eq": "tutorial"}},
    top_k=5
)

# Sparse-dense vectors (hybrid search nativo)
index.upsert(
    vectors=[
        ("id1", dense_vector, sparse_vector, metadata)
    ]
)

Performance comparison:

Vector DB10K docs100K docs1M docsCosto
ChromaDB30ms300ms3,000msGratis
Pinecone40ms45ms50ms$70/mes

Decisión: Pinecone si dataset >100K docs o necesitas <100ms garantizado.


Proyecto Módulo 7:

Migrar baseline RAG a Pinecone:

# Antes (ChromaDB, 100K docs)
latency_p95 = 850ms

# Después (Pinecone, 100K docs)
latency_p95 = 520ms (-40%)

📊 Módulo 8: RAG Evaluation & Testing (RAGAS)

Objetivo:

Evaluar calidad del sistema RAG con métricas automatizadas (faithfulness, relevancy).

Problema del baseline:

# Evaluation manual
# 1. Generar respuesta
answer = rag_system.query("¿Qué es FastAPI?")

# 2. Leer respuesta y juzgar manualmente
# "¿Es correcta? ¿Está grounded en docs? ¿Responde la pregunta?"

# Problema: No escala, no es consistente, no es automatizado

Técnicas que aprenderás:

1. RAGAS Framework (Automated Metrics):

from ragas import evaluate
from ragas.metrics import faithfulness, answer_relevancy, context_recall

# Dataset de evaluación
dataset = {
    "question": ["¿Qué es FastAPI?"],
    "answer": ["FastAPI es un framework web..."],
    "contexts": [["FastAPI es un framework web moderno..."]],
    "ground_truth": ["FastAPI es un framework web de Python"]
}

# Evaluar
results = evaluate(
    dataset,
    metrics=[faithfulness, answer_relevancy, context_recall]
)

print(results)
# Output:
# {
#   'faithfulness': 0.92,      # ¿Grounded en contexto?
#   'answer_relevancy': 0.89,  # ¿Responde pregunta?
#   'context_recall': 0.75     # ¿Recuperamos docs relevantes?
# }

2. Golden Dataset (Regression Testing):

# Crear dataset de 50 test queries + ground truth
golden_dataset = [
    {
        "question": "¿Qué es FastAPI?",
        "ground_truth": "FastAPI es un framework web...",
        "relevant_docs": ["doc_123", "doc_456"]
    },
    # ... 49 más
]

# Evaluar cada deploy
def regression_test(rag_system):
    results = evaluate(rag_system, golden_dataset)
    assert results['faithfulness'] > 0.85, "Faithfulness degraded!"
    assert results['answer_relevancy'] > 0.80, "Relevancy degraded!"
    return results

3. CI/CD Integration (Continuous Evaluation):

# En cada PR/deploy, auto-eval
# .github/workflows/rag-eval.yml

steps:
  - name: Run RAG evaluation
    run: |
      python test_rag.py
      # Si metrics < threshold, fail CI

Proyecto Módulo 8:

Implementar evaluation completa:

# Baseline (manual)
faithfulness = "Unknown"
answer_relevancy = "Unknown"

# Con RAGAS (automated)
results = evaluate(rag_system, golden_dataset)
# faithfulness: 0.92
# answer_relevancy: 0.89
# context_recall: 0.75

# Identificar gaps y aplicar mejoras
if results['context_recall'] < 0.80:
    apply_improvement("query_expansion")  # Módulo 3

🔗 Cómo se Conectan los Módulos

Pipeline evolutivo:

Módulo 1: Baseline RAG
   ↓ (Precision 68%, Recall 52%)
   
Módulo 2: + Chunking optimizado
   ↓ (Precision 78%, Recall 52%) [+10% precision]
   
Módulo 3: + Query optimization
   ↓ (Precision 78%, Recall 67%) [+15% recall]
   
Módulo 4: + Re-ranking
   ↓ (Precision 88%, Recall 67%) [+10% precision]
   
Módulo 5: + Hybrid search
   ↓ (Precision 91%, Recall 77%) [+3% precision, +10% recall]
   
Módulo 6: + Metadata filtering
   ↓ (Precision 93%, Recall 77%) [+2% precision, -90% search space]
   
Módulo 7: + Pinecone migration
   ↓ (Latency -40%, Scalability ∞)
   
Módulo 8: + RAGAS evaluation
   ↓ (Automated quality gates, CI/CD integration)

Performance final:

  • Precision@5: 93% (baseline: 68%, mejora: +25%)
  • Recall@50: 77% (baseline: 52%, mejora: +25%)
  • Latency P95: 1,200ms (baseline: 800ms, trade-off: +400ms por calidad)
  • Faithfulness: 0.92 (baseline: N/A)
  • Cost per query: $0.003 (acceptable para production)

🎯 Proyecto Evolutivo (Módulo 8)

Objetivo final:

Sistema RAG production-ready que integra TODAS las técnicas:

# advanced_rag_system.py (Módulo 8 final)

class AdvancedRAGSystem:
    def __init__(self):
        # Módulo 2: Chunking
        self.chunker = RecursiveCharacterTextSplitter(...)
        
        # Módulo 3: Query optimization
        self.query_optimizer = QueryExpansionOptimizer(...)
        
        # Módulo 4: Re-ranking
        self.reranker = CrossEncoder('cross-encoder/...')
        
        # Módulo 5: Hybrid search
        self.bm25 = BM25Okapi(...)
        self.semantic_search = PineconeIndex(...)
        
        # Módulo 6: Metadata filtering
        self.metadata_filters = {...}
        
        # Módulo 7: Production vector DB
        self.vector_db = Pinecone(...)
        
        # Módulo 8: Evaluation
        self.evaluator = RAGASEvaluator(...)
    
    def query(self, user_query: str) -> dict:
        # 1. Query optimization (M3)
        optimized_queries = self.query_optimizer.expand(user_query)
        
        # 2. Hybrid retrieval (M5) con metadata filtering (M6)
        bm25_results = self.bm25.search(user_query)
        semantic_results = self.semantic_search.query(
            optimized_queries[0],
            filter=self.metadata_filters
        )
        merged = reciprocal_rank_fusion(bm25_results, semantic_results)
        
        # 3. Re-ranking (M4)
        reranked = self.reranker.predict([(user_query, doc) for doc in merged])
        top_k = select_top_k(reranked, k=5)
        
        # 4. Generation
        answer = self.llm.invoke(context=top_k, query=user_query)
        
        # 5. Evaluation (M8)
        metrics = self.evaluator.evaluate(
            question=user_query,
            answer=answer,
            contexts=top_k
        )
        
        return {
            "answer": answer,
            "sources": top_k,
            "metrics": metrics
        }

# Benchmarking final
rag_system = AdvancedRAGSystem()
final_results = benchmark(rag_system, golden_dataset)

print(f"""
Advanced RAG System Results:
- Precision@5: {final_results['precision']:.2%}
- Recall@50: {final_results['recall']:.2%}
- Faithfulness: {final_results['faithfulness']:.2f}
- Latency P95: {final_results['latency_p95']:.0f}ms
- Cost per query: ${final_results['cost_per_query']:.4f}
""")

Output esperado:

Advanced RAG System Results:
- Precision@5: 93%
- Recall@50: 77%
- Faithfulness: 0.92
- Latency P95: 1,200ms
- Cost per query: $0.0031

🎯 Resumen

Conceptos clave:

  • Módulo 1: Baseline RAG (68% precision, 52% recall)
  • Módulo 2: Chunking strategies → +10-15% precision
  • Módulo 3: Query optimization → +15-25% recall
  • Módulo 4: Re-ranking → +20-25% precision
  • Módulo 5: Hybrid search → +15-18% precision, +10-15% recall
  • Módulo 6: Metadata filtering → +10-13% precision, -90% search space
  • Módulo 7: Pinecone migration → -40% latency, ∞ scalability
  • Módulo 8: RAGAS evaluation → Automated quality gates
  • Pipeline evolutivo: Baseline → Avanzado (68% → 93% precision)
  • Trade-off aceptado: +400ms latency por +25% accuracy

Qué sigue:

Cápsula 08 te da el mini-proyecto de Módulo 1: implementar baseline RAG con ChromaDB + OpenAI, medir performance, y documentar decisiones para comparar con mejoras en módulos 2-8.


📚 Recursos Adicionales

  1. RAG Architecture Patterns - Patterns de LangChain
  2. Advanced RAG Techniques - Pinecone guide
  3. Production RAG Best Practices - LlamaIndex blog
  4. RAGAS Documentation - Framework de evaluation
  5. Hybrid Search Deep Dive - Elasticsearch guide
  6. Chunking Strategies Comparison - Análisis de chunk size

Creado: Febrero 6, 2026
Versión: 1.0