Módulo 5: Hybrid Search — combinando keyword + semantic para queries que necesitan ambas
Cápsula 07: Decision framework — qué estrategia de hybrid search elegir
Descripción de la cápsula
Cubrimos los componentes individuales: BM25 (cápsula 03), RRF (04), weighted blending (05), Elasticsearch (06). La pregunta operativa que cierra el módulo: dado un proyecto nuevo, ¿qué combinación eliges?
Esta cápsula consolida lo aprendido en un decision framework reproducible. Vas a aprender a tomar la decisión en menos de 10 minutos: ¿semantic-only? ¿hybrid simple? ¿hybrid con weighted? ¿in-memory o Elasticsearch? Cada elección tiene trade-offs concretos que vas a poder defender con datos.
Al finalizar esta cápsula serás capaz de:
- ✅ Comparar las cuatro arquitecturas de retrieval sobre seis dimensiones
- ✅ Aplicar un flowchart de 5 preguntas para elegir estrategia
- ✅ Justificar la elección a un Tech Lead con argumentos numéricos
- ✅ Diseñar un plan de evolución (empezar simple, escalar gradualmente)
- ✅ Identificar los anti-patrones comunes al "elegir todo de una vez"
- ✅ Decidir cuándo migrar entre estrategias mientras tu producto crece
Tiempo estimado: 25-30 minutos
Las cuatro arquitecturas posibles
Arquitectura A: Semantic-only
Query → Embedding → Vector DB → Top-K → LLM
- Cuándo: queries puramente conceptuales, MVP, equipo sin recursos.
- Recall típico: 85-90% en queries semánticas, 50-70% en queries con identificadores.
- Latencia: 100-300ms.
- Costo: $0-50/mes para 100K queries (solo embeddings).
- Mantenimiento: mínimo.
Arquitectura B: BM25-only
Query → BM25 (rank_bm25 o ES) → Top-K → LLM
- Cuándo: corpus puramente exact-match (error codes, code search, SKUs).
- Recall típico: 90%+ en queries exactas, 40-50% en queries semánticas.
- Latencia: 5-30ms.
- Costo: $0-30/mes (compute mínimo).
- Mantenimiento: bajo (tokenizer cuidadoso).
Arquitectura C: Hybrid simple (semantic + BM25 + RRF)
Query ──┬→ Embedding → Vector DB → Top-30 ──┐
│ │→ RRF → Top-K → LLM
└→ BM25 → Top-30 ─────────────────────┘
- Cuándo: corpus mixto (técnico + narrativo), producción típica. Default razonable.
- Recall típico: 88-95%.
- Latencia: 150-400ms (paralelizable).
- Costo: $30-100/mes para 100K queries.
- Mantenimiento: medio (dos motores).
Arquitectura D: Hybrid avanzado (weighted + routing + ES)
Query → Detector tipo → α dinámico
├→ Elasticsearch BM25 (top-30) ──┐
└→ Vector DB (top-30) ──┼→ Weighted blending → Top-K → LLM
(después rerank opcional)
- Cuándo: corpus a escala (>1M docs), variedad de query types, producto crítico.
- Recall típico: 92-97%.
- Latencia: 200-500ms.
- Costo: $200-1000/mes.
- Mantenimiento: alto (ES cluster, tuning de α, routing).
Comparación cuantitativa
Arquitectura Recall@5 Latency p95 Setup time Costo/mes (100K queries)
─────────────────────────────────────────────────────────────────────────────────────────
A: Semantic-only 85% 200ms 1 día $20
B: BM25-only 82% 15ms 2 días $5
C: Hybrid simple 92% 320ms 3-5 días $50
D: Hybrid avanzado 95% 400ms 2-3 semanas $300
Lectura: las opciones C y D dan el mejor recall, pero el "salto" más grande es de A/B a C (+10 puntos). De C a D el salto es marginal (+3 puntos) por mucho más esfuerzo.
Regla práctica: la mayoría de proyectos pueden quedarse en arquitectura C. D solo se justifica con eval set robusto que demuestre que C no alcanza.
Decision framework de 5 preguntas
1. ¿Tu corpus es 100% texto narrativo (sin identificadores, errores, comandos)?
→ Sí: Arquitectura A (semantic-only). Ahorrate la complejidad.
→ No: continuar a 2.
2. ¿Las queries de tu producto son 95%+ con identificadores exactos?
→ Sí: Arquitectura B (BM25-only). Probable que sea code search o lookup.
→ No: continuar a 3 (necesitas hybrid).
3. ¿Tu corpus es <1M documentos?
→ Sí: continuar a 4 con `rank_bm25` in-memory.
→ No: vas a necesitar Elasticsearch (cápsula 06).
4. ¿Tienes eval set ≥50 queries con ground truth?
→ No: arquitectura C (hybrid simple con RRF). Sin eval set no puedes tunear α.
→ Sí: continuar a 5.
5. ¿Tu eval set muestra que una señal es notablemente mejor (>10 pts) para algún tipo de query?
→ No: arquitectura C es suficiente.
→ Sí: arquitectura D con weighted + routing.
Aplicado a casos reales
| Proyecto | Recomendación | Por qué |
|---|---|---|
| MVP de chatbot SaaS | A: semantic-only | Iterar rápido, ya optimizar después |
| Buscador de Stack Overflow | C: hybrid simple | Mezcla de identificadores + queries semánticas |
| Catálogo de productos con SKUs | B: BM25-only | Códigos exactos dominan |
| Sistema legal con queries técnicas | C: hybrid simple | Vocabulario específico + queries narrativas |
| Buscador interno enterprise (5M docs, equipo grande) | D: hybrid avanzado | Escala justifica complejidad |
| Asistente de papers académicos | A: semantic-only | Queries conceptuales puras |
| Help desk de empresa SaaS | C: hybrid simple | Mezcla típica |
Plan de evolución gradual
No empieces con arquitectura D. Construye progresivamente:
┌─────────────────────────────────────────────────────────────────┐
│ Fase 1: MVP │
│ Arquitectura A (semantic-only) │
│ Tiempo: 1 día │
│ Métricas a validar: ¿precision/recall son aceptables? │
└────────────────────────┬─────────────────────────────────────────┘
│ Si recall < 80% en queries técnicas
▼
┌─────────────────────────────────────────────────────────────────┐
│ Fase 2: Hybrid simple │
│ Arquitectura C (semantic + BM25 + RRF) │
│ Tiempo: 3-5 días adicionales │
│ Métricas a validar: ¿recall sube +10 pts? │
└────────────────────────┬─────────────────────────────────────────┘
│ Si necesitas más calidad o llegaste a 1M+ docs
▼
┌─────────────────────────────────────────────────────────────────┐
│ Fase 3: ES + tuning │
│ Arquitectura D parcial (ES + weighted blending) │
│ Tiempo: 2-3 semanas adicionales │
│ Métricas a validar: ¿recall sube otros +3-5 pts? │
└────────────────────────┬─────────────────────────────────────────┘
│ Si tienes tráfico variado y queries específicas
▼
┌─────────────────────────────────────────────────────────────────┐
│ Fase 4: Routing dinámico │
│ Arquitectura D completa (routing por tipo de query) │
│ Tiempo: 1 semana adicional │
│ Métricas a validar: ¿recall por tipo de query mejora? │
└─────────────────────────────────────────────────────────────────┘
Beneficio del plan gradual:
- Cada fase tiene una validación clara antes de pasar a la siguiente.
- Si fase 1 funciona, no gastas tiempo en fase 2.
- Cada fase es reversible (rollback con feature flag).
Anti-patrón: empezar con arquitectura D directamente. Triplicas el setup time, mantienes complejidad innecesaria, y a veces descubres que A o C eran suficientes.
Cuándo NO usar hybrid search
A pesar de los beneficios, hay casos donde hybrid search es overkill:
| Caso | ¿Hybrid? | Razón |
|---|---|---|
| Corpus puramente narrativo (literatura, periodismo) | ❌ No | Semantic alcanza, BM25 agrega ruido |
| MVP en stage early con <5K docs | ❌ No | El problema dominante es otro (probablemente chunking) |
| Latencia ultra-estricta (<100ms total) | ❌ No | Overhead de paralelización + fusión rompe SLA |
| Equipo de 1-2 personas sin DevOps | ⚠️ Tal vez | Mantener dos motores agrega operacional overhead |
| Producto donde "respuesta lenta pero perfecta" gana sobre "rápida y mediocre" | ⚠️ Considerar más profundo | El problema puede ser de generation, no retrieval |
Migrar entre arquitecturas
De A a C (agregar BM25 + RRF)
Trigger: recall@5 < 80% sobre queries con identificadores.
Esfuerzo: 3-5 días de ingeniería.
Riesgo: bajo. RRF funciona out-of-the-box, sin tuning.
Métrica de protección: precision (no debe caer >2% si BM25 está bien tokenizado).
De C a D (Elasticsearch + weighted + routing)
Trigger: recall@5 estancado en 90% y necesitas 95%+, O corpus pasó 1M docs.
Esfuerzo: 2-3 semanas de ingeniería + 1 semana de tuning.
Riesgo: medio. Requiere eval set robusto para tunear α y validar routing.
Métrica de protección: complejidad operacional. Si el equipo no tiene capacidad para mantener ES, retroceder a C.
Migrar HACIA ATRÁS (de C a A)
A veces lo correcto es simplificar. Casos:
- El producto pivoteó a corpus puramente narrativo. BM25 ya no aporta.
- El corpus se redujo a <50K docs. La complejidad no se justifica.
- Detectaste que el 95% de las queries son semánticas, BM25 dispara muy poco.
Migrar a arquitectura más simple es legítimo si los datos lo justifican.
Anti-patrones comunes
Anti-patrón 1: implementar todo de una vez
El error: primer sprint del proyecto, equipo decide "vamos con hybrid avanzado desde el inicio".
Síntoma: 3 semanas de setup antes de validar siquiera que el producto tiene encaje. Se descubre que la mitad del trabajo era innecesario.
Cómo prevenir: plan gradual. Cada fase con criterio de validación.
Anti-patrón 2: copiar arquitectura de otro producto
El error: "X empresa usa hybrid con weighted blending → nosotros también".
Síntoma: la complejidad no se justifica para tu caso. Tu corpus, tu volumen, tus queries son distintas.
Cómo prevenir: justificar cada componente con datos propios. Si X empresa hace algo, descubre por qué lo hace antes de copiarlo.
Anti-patrón 3: ignorar el costo operacional
El error: elegir arquitectura D sin considerar que el equipo de 3 personas no puede mantener ES en producción.
Síntoma: ES queda mal configurado, hay outages, alguien tiene que aprender ES de cero a las 3am cuando algo se rompe.
Cómo prevenir: evaluar capacidad operacional del equipo en la decisión, no solo calidad técnica.
Anti-patrón 4: tunear α sin eval set robusto
El error: weighted blending con α elegido por intuición.
Síntoma: después de cambios sutiles en el corpus, α óptimo cambió, pero nadie se entera. Calidad degrada lentamente.
Cómo prevenir: α debe ser determinado por grid search sobre eval set. Re-evaluar trimestralmente.
Anti-patrón 5: no medir precision al agregar BM25
El error: activas BM25, recall sube 10%, deployas. Nadie miró precision.
Síntoma: BM25 agregó ruido. Top-5 ahora tiene 1-2 docs irrelevantes que el LLM no ignora bien. Calidad de respuesta empeora.
Cómo prevenir: medir precision Y recall juntos. Si precision cae >3%, BM25 está mal calibrado (probablemente tokenizer).
Ejercicio aplicado
Escenario: evalúa tres proyectos y decide qué arquitectura recomendar.
Proyecto X: SaaS de soporte técnico. 80K artículos de documentación. Queries del log:
- 30% conceptuales ("how to deploy")
- 50% identificadores ("kubectl get pods")
- 20% mixtas
Stack actual: solo semantic. Recall@5 = 65%. Equipo: 4 ingenieros.
Proyecto Y: Plataforma de literatura. 500K novelas + análisis literarios. Queries: "novelas con narradores no confiables", "metáfora del agua en la literatura argentina".
Recall@5 actual con semantic = 87%. Equipo: 2 ingenieros.
Proyecto Z: E-commerce con 10M productos. Queries: 70% SKUs y modelos exactos, 30% descripciones de productos.
Recall@5 actual con semantic = 48%. Equipo: 8 ingenieros con DevOps dedicado.
Tu trabajo:
- Aplica el framework a cada proyecto.
- Justifica la decisión.
- Define plan de migración con orden de fases.
Solución
Proyecto X — Recomendación: Arquitectura C (hybrid simple con RRF)
Aplicación del framework:
- ¿Corpus 100% narrativo? No (50% son identificadores).
- ¿95%+ identificadores? No (solo 50%).
- ¿Corpus <1M? Sí (80K docs). →
rank_bm25alcanza. - ¿Eval set ≥50 queries? Asumir que pueden construirlo. → fase 4 dice arquitectura C.
Justificación:
- 50% del tráfico son queries con identificadores que semantic falla. Hybrid es necesario.
- Corpus chico (80K) → no necesitas ES.
- Equipo de 4 → puede mantener dos motores sin problema.
Plan:
- Fase 1 (3 días): implementar BM25 con
rank_bm25+ tokenizer técnico. - Fase 2 (1 día): integrar RRF (cápsula 04).
- Fase 3 (1 semana): validar sobre eval set de 80 queries (proporcional a las % del log).
- Fase 4 (1 semana): A/B test producción.
Mejora esperada: recall 65% → 85-90%.
Proyecto Y — Recomendación: Arquitectura A (semantic-only). NO migrar.
Aplicación del framework:
- ¿Corpus 100% narrativo? Sí (literatura). → arquitectura A.
Justificación:
- Recall ya está en 87% — alto. No hay problema de exactitud que BM25 solucione.
- Queries son puramente semánticas ("metáfora del agua") — BM25 agregaría ruido.
- Equipo de 2 → la complejidad de hybrid no se justifica.
Plan:
- No tocar la arquitectura. Si el equipo quiere mejorar, considerar:
- Mejorar embeddings (text-embedding-3-large): +3-5%
- Re-ranking con cross-encoder: +5-8%
- Chunking semántico (M02): +3-5%
Recall esperado con esas mejoras: 87% → 92-95%. Sin necesidad de hybrid.
Proyecto Z — Recomendación: Arquitectura D (ES + weighted + routing)
Aplicación del framework:
- ¿Corpus 100% narrativo? No (70% son SKUs).
- ¿95%+ identificadores? Casi (70%). → considerar arquitectura B, pero el 30% restante es semántico → necesitas hybrid.
- ¿Corpus <1M? No (10M docs). → necesitas Elasticsearch.
- ¿Eval set robusto? Asumir que sí (equipo grande puede construirlo).
- ¿Una señal claramente mejor? Sí — BM25 mucho mejor para SKUs (70% del tráfico). → weighted con α=0.3 para queries con SKU.
Justificación:
- Recall 48% es inaceptable. Necesita salto grande, no marginal.
- 10M docs justifica ES.
- Equipo de 8 con DevOps → puede mantener arquitectura compleja.
- 70% queries con SKUs explícitos → weighted con α dinámico mejora notablemente.
Plan:
- Fase 1 (1 semana): ES setup en cluster + indexar 10M docs.
- Fase 2 (1 semana): integrar ES con pipeline (paralelo a vector DB existente).
- Fase 3 (1 semana): RRF baseline + validar.
- Fase 4 (2 semanas): weighted blending con grid search de α + routing por tipo de query.
- Fase 5 (1 semana): A/B test producción.
Mejora esperada: recall 48% → 90%+. Costo extra: ~$300/mes (Elastic Cloud) + $50/mes incremental en costos de embeddings.
ROI: si el e-commerce procesa 1M queries/día, mejorar recall 40 puntos puede traducirse en mejora medible de conversión, justificando ampliamente el costo.
Resumen y siguiente paso
Lo que aprendiste:
- Cuatro arquitecturas: semantic-only (A), BM25-only (B), hybrid simple (C), hybrid avanzado (D).
- Decision framework de 5 preguntas resuelve la elección en <10 minutos.
- Plan de evolución gradual: empezar con A, escalar a C cuando el problema lo justifique, escalar a D solo con eval set robusto.
- La mayoría de proyectos pueden quedarse en arquitectura C. D solo cuando D > C es demostrable con datos.
- Migrar HACIA ATRÁS es legítimo si la complejidad no se justifica.
- Anti-patrones: implementar todo de una vez, copiar arquitecturas sin justificar, ignorar costo operacional, tunear sin eval set, no medir precision al agregar BM25.
Checkpoint: antes de cerrar el módulo, deberías poder:
- Aplicar el framework a un proyecto nuevo en <10 min.
- Justificar la elección con argumentos numéricos al Tech Lead.
- Diseñar plan de evolución gradual con criterios de validación.
Siguiente cápsula: 08 — Proyecto integrador hybrid search engine.
Cierre del módulo: vas a construir un sistema hybrid search end-to-end con BM25 (rank_bm25 o ES) + semantic + RRF, A/B testing contra baseline, y reporte comparativo. Es el proyecto que va a tu portfolio — y lo más cercano al patrón "estado del arte" en RAG production.
Recursos
- Pinecone — Hybrid Search Decision Guide — Patrones aplicados
- LangChain — EnsembleRetriever — Implementaciones de referencia
- LlamaIndex — Hybrid Retrieval — Patrón en LlamaIndex
- BEIR Benchmark — Comparaciones empíricas
- Elasticsearch Hybrid Search — Implementación nativa
- Anthropic — Contextual Retrieval — Técnica complementaria
Tiempo estimado: 25-30 minutos Siguiente: 08-project-hybrid-search-engine.md