DEV Community

Cover image for Búsqueda híbrida RAG: BM25, vectores y reranking sin complicar tu stack
Khavel
Khavel

Posted on • Originally published at devaisemanal.com

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.

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.

Arquitectura base

TL;DR

La keyword principal es búsqueda híbrida RAG. La intención de búsqueda en español es práctica: entender cuándo la búsqueda vectorial se queda corta, cómo combinar BM25 con vectores y cómo evaluar si el cambio mejora respuestas reales.

Mi postura: si tu RAG responde sobre documentación técnica, soporte, contratos, catálogos, logs o conocimiento interno con nombres propios, no deberías empezar por vector-only. Empieza híbrido o al menos deja el camino preparado para activarlo sin reindexar todo.

Briefing

Qué problema resuelve la búsqueda híbrida RAG

La búsqueda vectorial es buena capturando significado. Si alguien pregunta cómo revocar una clave, puede encontrar documentos que hablan de rotación, credenciales o secretos aunque no usen las mismas palabras. Ese es su valor.

Pero los embeddings tropiezan con lo exacto: ERR\_CONN\_RESET, invoice\_2026\_041, TenantIsolationPolicy, SKU-A17, una clase interna o un endpoint raro. Para un humano esos tokens son la pista principal. Para un vector pueden quedar diluidos como ruido.

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.

Diagrama de búsqueda híbrida RAG con consulta, recuperación BM25, recuperación vectorial, fusión RRF, reranking y contexto citado para el modelo

Una arquitectura híbrida separa recall léxico, recall semántico, fusión de rankings, reranking y evaluación. No mete más chunks por intuición: decide qué evidencia merece llegar al prompt.

Lectura práctica

La arquitectura mínima: dos recuperadores y una fusión

El patrón base tiene cuatro pasos. Primero normalizas la consulta y aplicas permisos o filtros duros. Segundo ejecutas BM25 o full-text search contra el texto indexado. Tercero ejecutas búsqueda vectorial contra embeddings de chunks. Cuarto fusionas ambos rankings con una regla estable, normalmente Reciprocal Rank Fusion cuando no quieres calibrar scores heterogéneos.

La clave es no mezclar puntuaciones crudas sin pensar. Un score BM25 no significa lo mismo que una similitud coseno o producto interno. RRF evita parte del problema porque trabaja con posiciones de ranking, no con escalas absolutas. Si un documento aparece arriba en dos listas, sube. Si solo aparece en una, todavía puede entrar, pero con menos fuerza.

Después puedes añadir reranking. Un cross-encoder o late-interaction reranker mira pares consulta-documento con más detalle y reordena un conjunto pequeño de candidatos. Es más caro, así que suele aplicarse después de recuperar 40-100 candidatos, no sobre todo el corpus.

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

rrf.py

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)
Enter fullscreen mode Exit fullscreen mode

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 gratis

Implementació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.

Lectura práctica

Implementación con motores dedicados

Azure AI Search documenta híbrida como ejecución paralela de full-text y vector queries, con RRF para devolver un único ranking. Es una buena lectura porque separa claramente BM25, HNSW/eKNN y fusión.

Weaviate expone búsqueda híbrida con BM25F y vector search, configurable por peso y método de fusión. Qdrant permite consultas híbridas con vectores densos, sparse y reranking; su documentación reciente empuja un patrón de ingestión con embeddings densos, sparse y late-interaction. Pinecone soporta patrones sparse-dense y enfoques con índice híbrido o combinación de señales según el tipo de índice.

La decisión no debería ser qué vector database está de moda. Pregunta: dónde viven tus permisos, cómo vas a versionar embeddings, cómo filtrarás por tenant, cómo depurarás un resultado malo, cuánto cuesta rerankear y quién operará el índice cuando falle.

Briefing

Tuning: alpha, top_k y reranking

Si tu proveedor ofrece un peso tipo alpha, no lo trates como una constante universal. Queries con IDs suelen necesitar más señal léxica. Queries conceptuales suelen necesitar más señal semántica. Puedes empezar con un valor medio, pero guarda métricas por tipo de consulta.

top\_k antes de fusionar y después de rerankear importa más de lo que parece. Si recuperas pocos candidatos, el documento correcto ni llega al reranker. Si recuperas demasiados, suben coste, latencia y ruido. Una configuración común es recuperar 30-100 por canal, fusionar, rerankear 40-100 y pasar 5-15 chunks finales al LLM.

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.

Lectura práctica

Seguridad, permisos y privacidad

El fallo peligroso en RAG no es solo responder mal. Es recuperar un documento correcto para el usuario equivocado. En híbrida hay más caminos para que un documento entre al candidate pool, así que los filtros de tenant, permisos, clasificación y fecha deben aplicarse antes de ranking o en cada subconsulta.

Evita indexar secretos, claves, dumps, prompts internos sensibles o datos personales que no necesites para la tarea. Si el corpus incluye contenido no confiable, como tickets, emails, páginas externas o docs subidas por usuarios, trata esos chunks como datos, no como instrucciones. Esto conecta directamente con defensas contra prompt injection indirecta.

Para observabilidad, registra IDs de documentos, scores, rankings, filtros aplicados y versión de índice. No necesitas guardar todo el texto recuperado en logs permanentes. Muchas veces basta con referencias y muestras controladas para depurar sin crear otra base de datos sensible.

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

  1. Crear baseline. Guarda preguntas reales, documentos esperados, candidatos vector-only, respuesta, citas, latencia y coste.
  2. Añadir índice léxico. Indexa texto y metadatos con BM25, full-text search o sparse vectors sin saltarte permisos.
  3. Ejecutar dos recuperadores. Lanza búsqueda léxica y vectorial con la misma query normalizada y filtros obligatorios.
  4. Fusionar rankings. Usa RRF o una combinación calibrada; evita sumar scores crudos sin normalización.
  5. Rerankear candidatos. Aplica reranking solo sobre el pool fusionado, no sobre todo el corpus.
  6. Construir contexto final. Deduplica chunks, conserva citas, limita ruido y ordena por utilidad para la respuesta.
  7. Medir regresiones. Compara contra baseline con recall@k, MRR, groundedness, coste y ejemplos fallidos.
  8. Desplegar gradualmente. Activa por cohortes o tipos de consulta y revisa trazas antes de subir tráfico.

Cierre editorial

Criterio técnico

Un buen chunk en tiempo real no es el más corto ni el más semántico: es el que conserva evidencia, tiempo y estado suficiente para responder sin inventar continuidad.

Fuentes y referencias

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 IA

Recibe 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

Top comments (0)