Módulo 8: Proyecto Final Integrador
4. Etapa 3: Decisiones Técnicas Detalladas
Descripción
En esta etapa justificas decisiones técnicas específicas: parámetros de chunking, top-K, RRF k, MMR λ, índice ANN, etc. Cada decisión debe estar fundamentada en requisitos o trade-offs.
Decisión 1: Chunk size y overlap
Decisión:
- Chunk size: 600 tokens
- Overlap: 100 tokens (16.7%)
- Estrategia: Hierarchical (por secciones de paper)
Justificación:
¿Por qué 600 tokens?
Papers académicos tienen secciones típicas:
- Abstract: ~200 tokens
- Introduction: ~800 tokens (dividir en 2 chunks)
- Methods: ~1000 tokens (dividir en 2 chunks)
- Results: ~1200 tokens (dividir en 2 chunks)
- Conclusion: ~300 tokens
600 tokens = Balance entre:
- Contexto suficiente (sección completa o subsección)
- Precisión (no mezclar temas diferentes)
¿Por qué overlap 100 tokens?
Transiciones entre secciones:
"...conclusión de la sección anterior. La siguiente sección..."
→ Overlap captura contexto de transición
→ 100 tokens = ~2-3 oraciones
Alternativas consideradas:
- 400 tokens (menor contexto, mayor precisión) → Rechazado: Secciones quedarían fragmentadas
- 800 tokens (mayor contexto) → Rechazado: Mezclaría temas, menor precisión
Decisión 2: Embedding model
Decisión:
- Modelo: Sentence-BERT
all-mpnet-base-v2 - Dimensiones: 768D
- Inference: GPU local (NVIDIA T4)
Justificación:
¿Por qué Sentence-BERT?
Benchmark (MS MARCO dataset, recall@10):
- all-mpnet-base-v2: 0.69
- OpenAI ada-002: 0.72 (+3%)
- OpenAI text-embedding-3-small: 0.75 (+6%)
Trade-off:
- 6% menor recall vs OpenAI
- Pero: $0 costo + datos privados ✅
¿Por qué all-mpnet-base-v2 vs otras variantes?
all-mpnet-base-v2: 768D, 420M params
all-MiniLM-L6-v2: 384D, 22M params (más rápido pero -10% calidad)
→ all-mpnet-base-v2 mejor balance calidad/velocidad
Throughput esperado:
GPU: NVIDIA T4 (16GB)
Batch size: 32
Latencia: 50ms/batch
→ ~640 chunks/segundo (suficiente para 50K queries/mes)
Decisión 3: Vector database e índice ANN
Decisión:
- Vector DB: Weaviate
- Índice: HNSW
- Parámetros:
efConstruction: 256(indexación)maxConnections: 64ef: 128(query time)
Justificación:
¿Por qué HNSW vs IVF?
Dataset: 500K chunks
HNSW:
- Recall@10: 0.95
- Latency: 50-100ms
- Memory: ~4GB (768D × 500K × 8 bytes + graph)
IVF (nlist=1000):
- Recall@10: 0.90 (menor)
- Latency: 30-60ms (más rápido)
- Memory: ~2GB
→ HNSW: Mejor recall (+5%), latencia aceptable
¿Por qué ef=128?
ef = Número de candidatos evaluados durante búsqueda
Benchmark interno (esperado):
- ef=64: recall@10 = 0.92, latency = 40ms
- ef=128: recall@10 = 0.95, latency = 80ms
- ef=256: recall@10 = 0.96, latency = 150ms
→ ef=128: Balance óptimo (recall alto, latencia < 100ms)
Decisión 4: Top-K y reranking
Decisión:
- Top-K inicial (kNN): 100
- Reranking: NO (para mantener latencia baja)
- Top-K final (después de MMR): 20
Justificación:
¿Por qué top-K=100?
MMR requiere suficientes candidatos para diversificar:
- top-K=50 → MMR tiene poco margen de diversidad
- top-K=100 → MMR puede elegir 20 diversos de 100
- top-K=200 → Latencia aumenta sin ganancia significativa
→ 100 es sweet spot
¿Por qué NO reranking?
Reranking (cross-encoder) agrega 200-300ms
→ Latencia total: 230ms + 300ms = 530ms (búsqueda)
→ RAG total: 1440ms + 300ms = 1740ms ✅ (aún < 2s)
Pero: Reranking no es crítico si HNSW ya tiene recall@10 = 0.95
Decisión: Omitir reranking inicialmente
→ Si precision@10 < 0.75 en producción → Agregar reranking
Decisión 5: Hybrid search (RRF k)
Decisión:
- Método: RRF (Reciprocal Rank Fusion)
- Parámetro k: 60
Justificación:
¿Por qué RRF vs weighted sum?
Weighted sum requiere ajustar α:
score = α × semantic + (1-α) × keyword
→ α difícil de ajustar (depende de query)
RRF:
RRF(doc) = 1/(k + rank_semantic) + 1/(k + rank_keyword)
→ No requiere ajustar α ✅
→ Documentos en ambos rankings automáticamente boosted
¿Por qué k=60?
Benchmark típico (literatura):
- k=10: Favorece rankings altos (top-5) demasiado
- k=60: Balance estándar (usado en Weaviate, Elasticsearch)
- k=100: Flattens scores (menos diferenciación)
→ k=60 es valor estándar probado
Decisión 6: MMR (diversidad)
Decisión:
- λ (lambda): 0.6
- Diversificar por: Department (CS, Physics, Biology, etc.)
Justificación:
¿Por qué λ=0.6?
λ = Balance entre relevancia y diversidad
λ=0.0: Solo diversidad (no recomendado)
λ=0.5: Balance 50/50
λ=0.6: 60% relevancia, 40% diversidad ← Recomendado
λ=1.0: Solo relevancia (sin diversidad)
→ λ=0.6: Prioriza relevancia pero garantiza diversidad
¿Por qué diversificar por department?
RF4: Sugerir papers relacionados de múltiples áreas
Usuario busca: "optimization algorithms"
Sin MMR:
- 20 papers todos de CS (mismo departamento)
Con MMR (diversidad por department):
- 12 papers de CS (optimization)
- 5 papers de Math (theory)
- 3 papers de Physics (applications)
→ Mayor cobertura ✅
Decisión 7: Metadata boost
Decisión:
- Papers < 2 años: 1.2x boost
- Papers 2-5 años: 1.0x (sin boost)
- Papers > 5 años: 0.9x (penalización leve)
Justificación:
¿Por qué favorecer papers recientes?
Usuarios (especialmente estudiantes) prefieren papers recientes:
- Métodos más actuales
- Datasets más grandes
- Estado del arte actual
Pero: No eliminar papers antiguos (pueden ser foundational)
→ Boost moderado (1.2x, no 2x)
Fórmula:
if year >= 2022:
boost = 1.2
elif year >= 2019:
boost = 1.0
else:
boost = 0.9
final_score = base_score × boost
Decisión 8: LLM para Q&A
Decisión:
- Modelo: GPT-3.5 Turbo
- Temperature: 0.1 (baja)
- Max tokens output: 500
- Streaming: Activado
Justificación:
¿Por qué GPT-3.5 vs GPT-4?
Costo/query:
- GPT-3.5: $0.0011 (2500 input + 300 output)
- GPT-4: $0.022 (20x más caro)
Latencia:
- GPT-3.5: 1-2s
- GPT-4: 2-5s
Trade-off:
- GPT-4 es mejor, pero GPT-3.5 es suficiente para Q&A académico
- Presupuesto limitado → GPT-3.5
¿Por qué temperature=0.1?
Temperature controla "creatividad":
- 0.0: Determinístico (siempre misma respuesta)
- 0.1: Casi determinístico, mínima variación
- 0.7: Default (más creativo)
Para Q&A académico:
→ Queremos respuestas consistentes y precisas
→ temperature=0.1 ✅
¿Por qué streaming?
Sin streaming:
- Usuario espera 1.5s en blanco → Respuesta aparece completa
Con streaming:
- Usuario ve respuesta mientras genera (palabra por palabra)
- Percepción de latencia menor
- Mejor UX ✅
Decisión 9: Evaluation metrics
Decisión:
- Precision@10: Target > 0.75
- NDCG@20: Target > 0.70
- Diversity (departments en top-20): Target ≥ 3
- Latency (p95): Target < 2000ms
Justificación:
¿Por qué Precision@10 (no @5)?
Usuarios típicamente revisan top-10 resultados (primera "página")
→ Precision@10 mide qué % de esos 10 son relevantes
¿Por qué NDCG@20?
NDCG penaliza resultados relevantes en posiciones bajas
→ NDCG@20 mide calidad del ranking completo (primera página)
¿Por qué diversity ≥ 3 departments?
RF4: Sugerir papers de múltiples áreas
→ Al menos 3 departamentos diferentes en top-20
Resumen de decisiones técnicas
| Componente | Decisión | Justificación |
|---|---|---|
| Chunk size | 600 tokens | Balance contexto/precisión |
| Overlap | 100 tokens | Captura transiciones |
| Embedding | Sentence-BERT (768D) | Datos privados, $0 costo |
| Vector DB | Weaviate HNSW | Recall alto, latencia baja |
| Top-K | 100 → MMR → 20 | Suficiente para diversidad |
| Hybrid | RRF (k=60) | Balance keyword+semantic |
| MMR | λ=0.6 | 60% relevancia, 40% diversidad |
| Boost | < 2 años: 1.2x | Favorecer papers recientes |
| LLM | GPT-3.5 (temp=0.1) | Costo/latencia aceptables |
| Metrics | P@10, NDCG@20, diversity | Medir calidad y diversidad |
Próxima etapa: 05-cost-estimation.md — Calcular costo mensual completo.