Búsqueda híbrida RAG: BM25, vectores y reranking sin complicar tu stack
La búsqueda vectorial pura falla justo en consultas con IDs, nombres propios y términos raros. La búsqueda híbrida RAG combina BM25, embeddings y reranking para recuperar mejor evidencia antes de llamar al modelo.
La búsqueda vectorial pura falla justo en consultas con IDs, nombres propios y términos raros. La búsqueda híbrida RAG combina BM25, embeddings y reranking para recuperar mejor evidencia antes de llamar al modelo.
Búsqueda híbrida RAG significa ejecutar recuperación léxica, normalmente BM25 o full-text search, junto a recuperación semántica por embeddings, fusionar rankings y pasar al LLM un contexto ordenado con evidencias citables.
BM25 y full-text search hacen lo contrario: premian coincidencias léxicas, frecuencia de términos y rareza de palabras. La búsqueda híbrida combina ambas señales para que el sistema no tenga que elegir entre significado y precisión.
Checklist
Cuándo usar híbrida y cuándo no
Usa búsqueda híbrida si tus usuarios preguntan con nombres exactos, errores, siglas, IDs, versiones, rutas, clases, productos, tickets o fragmentos copiados de una interfaz. Es el caso normal en RAG para developers y soporte técnico.
También encaja cuando el corpus mezcla lenguaje natural con tablas, documentos largos, documentación API, changelogs, incidencias y preguntas con permisos. En esos entornos, el vector-only suele parecer convincente en demo y fallar en producción cuando aparece terminología específica.
No la añadas por moda si tu corpus es pequeño, homogéneo y semánticamente simple. Si tienes 200 documentos y las consultas son abiertas, una búsqueda vectorial bien evaluada puede bastar. La regla pragmática es medir: si pierdes consultas exactas o tienes respuestas sin citas fuertes, híbrida deja de ser complejidad extra y pasa a ser higiene.
Código: RRF simple para unir BM25 y vectores
<div style="margin:28px 0;border:1px solid #dbe3ef;border-radius:12px;overflow:hidden;background:#0f172a;"> <div style="padding:10px 14px;background:#111827;color:#cbd5e1;font:13px Consolas,monospace;">rrf.py</div> <pre style="margin:0;padding:18px;overflow:auto;color:#e5e7eb;font:13px/1.55 Consolas,monospace;"><code>from collections import defaultdict def reciprocal_rank_fusion(result_lists, k=60): scores = defaultdict(float) docs = {} for results in result_lists: for rank, item in enumerate(results, start=1): doc_id = item["id"] docs[doc_id] = item scores[doc_id] += 1.0 / (k + rank) ranked_ids = sorted(scores, key=scores.get, reverse=True) return [{**docs[doc_id], "rrf_score": scores[doc_id]} for doc_id in ranked_ids] query = "ERR_CONN_RESET al refrescar token OAuth" bm25_hits = bm25_search(query, limit=50) vector_hits = vector_search(embed(query), limit=50) candidates = reciprocal_rank_fusion([bm25_hits, vector_hits]) context = rerank(query, candidates[:80])[:12] answer = generate_with_citations(query, context)</code></pre> </div>
Puntos a revisar
Lo que conviene comprobar
Este ejemplo no depende de un proveedor concreto. La idea es deliberadamente simple: recupera dos listas, fusiona por posición, rerankea pocos candidatos y genera solo con contexto citado. Después puedes sustituir `bm25_search`, `vector_search` y `rerank` por PostgreSQL, Azure AI Search, Qdrant, Weaviate, Pinecone, Elasticsearch o tu stack actual.
¿Te está sirviendo? Hay una dosis cada semana
Te resumo herramientas de IA para devs, agentes, MCP, seguridad y workflows en un email de 5 minutos. En español y sin ruido.
Suscribirme gratisImplementación con PostgreSQL y pgvector
PostgreSQL es una opción muy razonable cuando tu corpus vive cerca de datos transaccionales, permisos por tenant o joins que no quieres duplicar en otro sistema. `tsvector` y `tsquery` cubren full-text search; pgvector añade almacenamiento y búsqueda de embeddings. Para muchos productos internos, esa combinación reduce sincronización y fugas entre sistemas.
El diseño típico guarda `content`, `metadata`, `tenant_id`, `tsv` y `embedding` en la misma tabla. La query aplica primero filtros obligatorios, ejecuta full-text y vector search por separado, calcula posiciones y fusiona con RRF en SQL o en aplicación. Lo importante es que los permisos no sean un filtro posterior decorativo: deben aplicarse antes de recuperar candidatos.
Postgres no siempre será el buscador más rápido para corpus enormes o requisitos avanzados de relevancia. Pero como baseline operable es fuerte: transacciones, backups, permisos, SQL, joins y menos piezas móviles. Si el equipo no puede operar dos índices con disciplina, una arquitectura más simple puede ganar aunque no sea la más glamourosa.
El reranking solo compensa si el candidato correcto está en el pool. Si context recall es bajo, no arregles con un reranker caro. Arregla chunking, filtros, normalización de query, sinónimos, indexación de campos o combinación sparse/dense.
Evaluación: no publiques híbrida sin comparar contra baseline
Antes de activar búsqueda híbrida, congela un dataset pequeño: preguntas reales, documentos esperados cuando existan, categoría de query y riesgo. Ejecuta vector-only, BM25-only e híbrida con el mismo corpus. Mide recall@k, MRR, nDCG si tienes qrels, groundedness de respuesta y coste por consulta.
La mejora que busco no es solo más score agregado. Quiero ver casos concretos: errores exactos que BM25 rescata, preguntas conceptuales que el vector mantiene, documentos irrelevantes que el reranker expulsa y respuestas que citan mejor evidencia.
No cambies embeddings, chunking, prompt, reranker y fusión en el mismo experimento. Si lo haces, no sabrás qué ayudó. La búsqueda híbrida es un cambio suficientemente grande como para merecer baseline propio.
Errores comunes que veo en RAG híbrido
- Fusionar scores BM25 y vectoriales como si estuvieran en la misma escala.
- Aplicar filtros de permisos después de recuperar, cuando el ranking ya fue contaminado.
- Usar `top_k` pequeño y culpar al reranker de no encontrar documentos que nunca recibió.
- Indexar chunks sin títulos, rutas, fechas, producto, versión o metadatos útiles para desempatar.
- No separar consultas exactas, conceptuales, negativas y multi-hop en la evaluación.
- Medir solo la respuesta final y no guardar los candidatos que llegaron al prompt.
- Añadir híbrida para tapar un problema de chunking obvio.
Plan de adopción en una semana
- Día 1: etiqueta 40-60 preguntas reales y separa consultas con IDs, errores, nombres propios, conceptos generales, permisos y preguntas sin respuesta.
- Día 2: ejecuta tu pipeline vector-only y guarda candidatos, respuesta, citas, latencia y coste.
- Día 3: añade recuperación BM25 o full-text con los mismos filtros de permisos.
- Día 4: fusiona con RRF y compara candidate pools antes de tocar prompts.
- Día 5: añade reranking solo sobre candidatos fusionados y mide si mejora precisión sin romper latencia.
- Día 6: ajusta top_k por tipo de consulta y crea un gate mínimo de regression retrieval.
- Día 7: despliega para un porcentaje pequeño de tráfico y revisa ejemplos, no solo promedios.
Conclusión
La búsqueda híbrida RAG no es una capa elegante para presumir de arquitectura. Es una corrección práctica a un defecto real de vector-only: confundir parecido semántico con evidencia suficiente.
Mi recomendación es empezar por el pipeline más aburrido que puedas operar: filtros duros, BM25, vectores, RRF, reranking opcional, citas y evaluación. Si eso mejora recall y groundedness en preguntas reales, ya tendrás permiso técnico para invertir en motores más sofisticados. Si no lo mide, es solo otro índice caro.
Preguntas frecuentes
¿Qué es búsqueda híbrida RAG?
Es un enfoque de recuperación para RAG que combina búsqueda léxica como BM25 o full-text search con búsqueda vectorial por embeddings, fusiona resultados y entrega al modelo un contexto más fiable.
¿Por qué BM25 sigue siendo útil con embeddings?
Porque BM25 captura coincidencias exactas, términos raros, IDs, errores, nombres propios y acrónimos que los embeddings pueden suavizar demasiado.
¿Qué es RRF en búsqueda híbrida?
Reciprocal Rank Fusion es una técnica para fusionar listas ordenadas usando la posición de cada documento en cada ranking, sin depender de que los scores tengan la misma escala.
¿Necesito reranking en un RAG híbrido?
No siempre. Añádelo cuando tengas suficientes candidatos, consultas ambiguas o requisitos altos de precisión. Primero mide si híbrida sin reranker ya resuelve el fallo.
¿PostgreSQL con pgvector basta para búsqueda híbrida?
Para muchos productos internos sí, especialmente si necesitas joins, permisos y transacciones cerca del corpus. Para escalas grandes o relevancia avanzada, puede convenir un motor dedicado.
¿Cómo evalúo una búsqueda híbrida RAG?
Compara BM25-only, vector-only e híbrida con preguntas reales. Mide recall@k, MRR o nDCG, groundedness, calidad de citas, latencia y coste por consulta.
Cómo implementar búsqueda híbrida RAG sin rehacer todo el sistema
- Crear baseline. Guarda preguntas reales, documentos esperados, candidatos vector-only, respuesta, citas, latencia y coste.
- Añadir índice léxico. Indexa texto y metadatos con BM25, full-text search o sparse vectors sin saltarte permisos.
- Ejecutar dos recuperadores. Lanza búsqueda léxica y vectorial con la misma query normalizada y filtros obligatorios.
- Fusionar rankings. Usa RRF o una combinación calibrada; evita sumar scores crudos sin normalización.
- Rerankear candidatos. Aplica reranking solo sobre el pool fusionado, no sobre todo el corpus.
- Construir contexto final. Deduplica chunks, conserva citas, limita ruido y ordena por utilidad para la respuesta.
- Medir regresiones. Compara contra baseline con recall@k, MRR, groundedness, coste y ejemplos fallidos.
- Desplegar gradualmente. Activa por cohortes o tipos de consulta y revisa trazas antes de subir tráfico.
Fuentes y referencias
- Azure AI Search: hybrid search overview
- Azure AI Search: RRF ranking
- Weaviate: hybrid search documentation
- Qdrant: hybrid search with reranking
- Qdrant: hybrid queries and RRF
- Pinecone: hybrid search
- PostgreSQL: controlling text search
- pgvector: vector similarity search for Postgres
- arXiv: An Analysis of Fusion Functions for Hybrid Retrieval
También te puede interesar
Real-time chunking para RAG y agentesEvaluación RAG en producciónOpenTelemetry GenAI para agentesLiteLLM Proxy: gateway IA, costes y modelosPrompt injection en agentes de IARecibe una lectura semanal de herramientas IA para devs
Cada semana te resumo herramientas de IA para devs, agentes, MCP, seguridad y workflows en un email de 5 minutos. En español y sin ruido.
Suscribirme gratis