Búsqueda híbrida: densa, BM25 y fusión recíproca de rangos

Por qué las palabras clave siguen ganando en referencias, códigos y nombres propios, y cómo se combinan los dos rankings.

Búsqueda híbrida: densa, BM25 y fusión recíproca de rangos
Foto de Dhirendra Singh en Pexels

Segunda entrega del bloque sobre técnicas de recuperación. La búsqueda vectorial se presentó durante años como el sustituto natural de las palabras clave. En la práctica, los sistemas que mejor recuperan usan las dos a la vez, y el detalle interesante está en cómo se combinan dos listas de resultados que hablan idiomas distintos.

Dos formas de estar cerca

Un sistema RAG estándar recupera por similitud vectorial: convierte pregunta y fragmentos en vectores y devuelve los fragmentos cuyo vector queda más próximo. Es lo que llamamos búsqueda densa, porque el vector es una lista compacta de unos cientos o miles de números, todos distintos de cero, en la que ninguna posición corresponde a una palabra concreta.

Esa representación captura muy bien una cosa: la equivalencia de significado entre expresiones que no comparten ninguna palabra. «¿Cuánto tarda en llegar el pedido?» y «los plazos de entrega habituales son de tres a cinco días laborables» no tienen términos en común y aun así quedan próximos en el espacio vectorial. Ninguna búsqueda por palabras clave encuentra eso.

Y captura mal otra cosa: lo que es puro identificador. Un vector de 1.024 dimensiones que resume un párrafo entero no puede reservar capacidad para la secuencia exacta de caracteres RD 1619/2012 o ref. XK-4471-B. Lo que el modelo hace con esas cadenas es representarlas por su contexto —«esto parece una referencia normativa española»—, con lo cual dos referencias normativas distintas acaban razonablemente cerca la una de la otra. Para el usuario que busca una en concreto, eso es un fallo.

La búsqueda léxica hace lo contrario. Representa cada documento por los términos que contiene y su frecuencia, en un vector disperso con una dimensión por término del vocabulario y casi todo ceros. No entiende nada de significado. Pero si buscas XK-4471-B, encuentra exactamente los fragmentos en los que aparece XK-4471-B, y sólo esos.

BM25, que no ha envejecido

El algoritmo de referencia para la búsqueda léxica es BM25 (Best Matching 25), una función de puntuación de los años noventa que sigue siendo la línea base seria en recuperación de información. Su lógica se resume en tres reglas:

  • Un término vale más si es raro. Que un fragmento contenga «de» no informa; que contenga «vitalicio» sí. Es la componente IDF, frecuencia inversa de documento.
  • Repetir un término suma, pero con rendimientos decrecientes. Un fragmento que menciona «garantía» ocho veces es más relevante que uno que la menciona una vez, pero no ocho veces más. BM25 satura esa curva con un parámetro, habitualmente llamado k1.
  • Los fragmentos largos se penalizan. Un texto largo contiene más términos por puro azar. El parámetro b normaliza por longitud.

Las familias de consultas en las que BM25 gana de forma consistente a la búsqueda densa son fáciles de enumerar, y conviene tenerlas presentes porque suelen coincidir con las consultas de mayor valor en un entorno profesional:

  • Códigos y referencias: normativa, artículos de un reglamento, números de pieza, SKU, identificadores de incidencia, cláusulas contractuales numeradas.
  • Nombres propios: personas, empresas, productos, topónimos. Especialmente los poco frecuentes, que son justamente los que el modelo de embeddings ha visto menos veces.
  • Siglas y acrónimos: en un corpus corporativo abundan las siglas internas que ningún modelo preentrenado conoce. Para la búsqueda densa son ruido; para BM25 son términos rarísimos y por tanto muy informativos.
  • Terminología de dominio muy específica y jerga que no aparecía en el corpus de entrenamiento del modelo de embeddings.

Hay además una razón práctica que se menciona poco: BM25 es explicable. Cuando un resultado sale primero, se puede señalar qué términos lo pusieron ahí. Con un vector no hay nada que señalar, y eso pesa en un sistema que habrá que depurar meses después.

El problema de sumar peras y manzanas

Ejecutar las dos búsquedas es lo fácil: se lanzan en paralelo y cada una devuelve su lista ordenada. El problema es fusionarlas, porque sus puntuaciones no son comparables.

La similitud coseno vive acotada entre −1 y 1, y en la práctica los buenos resultados se agolpan entre 0,6 y 0,9. La puntuación de BM25 no tiene techo: depende del número de términos de la consulta, de su rareza y del tamaño del corpus, y puede valer 3 en una consulta y 40 en otra. Sumar 0,82 con 17,3 no significa nada.

Vía 1: normalizar y combinar linealmente

La solución evidente es llevar ambas puntuaciones a una escala común, típicamente [0, 1] mediante normalización min-max sobre los resultados devueltos, y combinarlas con un peso:

final = α · norm(denso) + (1 − α) · norm(bm25)

Con α = 0,5 se ponderan igual; con α = 0,7 se favorece lo semántico. Es el esquema que ofrecen muchos motores bajo el nombre de búsqueda híbrida ponderada, y funciona. Tiene dos inconvenientes reales. El primero es que α es un parámetro que hay que ajustar contra un conjunto de preguntas propio, y el valor óptimo cambia con el corpus. El segundo, más sutil: la normalización min-max depende del conjunto devuelto en esa consulta. Si en una consulta el mejor resultado de BM25 puntúa 40 y en otra puntúa 4, ambos se normalizan a 1,0 y la fusión pierde la información de que la segunda consulta no tenía ninguna buena coincidencia léxica.

Vía 2: olvidarse de las puntuaciones y usar los rangos

La fusión recíproca de rangos (Reciprocal Rank Fusion, RRF) resuelve el problema por eliminación: descarta las puntuaciones y se queda sólo con la posición de cada documento en cada lista. Una posición es comparable entre sistemas por definición.

La fórmula, para un documento d y un conjunto de rankings R:

RRF(d) = Σ  1 / (k + rango_r(d))
        r∈R

donde rango_r(d) es la posición de d en el ranking r empezando en 1, y k es una constante de amortiguación que suele fijarse en 60. Si un documento no aparece en un ranking, ese sumando simplemente no se cuenta.

La constante k hace un trabajo concreto: aplana la diferencia entre las primeras posiciones. Con k = 60, la primera posición aporta 1/61 = 0,0164 y la segunda 1/62 = 0,0161, apenas un 2 % menos. Sin k, la primera aportaría 1,0 y la segunda 0,5, la mitad. Amortiguar así evita que un único sistema muy seguro de sí mismo imponga su primer resultado, y premia en cambio a los documentos que aparecen arriba en las dos listas. Ese es el comportamiento deseado: el consenso entre dos métodos independientes es mejor señal que la confianza de uno solo.

Un ejemplo con números

Consulta: «requisitos de la factura simplificada según el RD 1619/2012». Cada motor devuelve su top-5, con fragmentos identificados de A a G.

Rango Densa BM25
1AC
2BA
3CF
4DG
5EB

Con k = 60, la puntuación de cada fragmento:

  • A: 1/61 + 1/62 = 0,01639 + 0,01613 = 0,03252
  • C: 1/63 + 1/61 = 0,01587 + 0,01639 = 0,03226
  • B: 1/62 + 1/65 = 0,01613 + 0,01538 = 0,03151
  • F: 1/63 = 0,01587
  • D: 1/64 = 0,01563
  • G: 1/64 = 0,01563
  • E: 1/65 = 0,01538

El orden fusionado es A, C, B, F, D, G, E. Merece la pena leer lo que ha pasado. Los tres primeros son los tres únicos fragmentos que aparecían en ambas listas, y quedan agrupados muy por delante del resto: la diferencia entre A y C es de un 0,8 %, mientras que entre C y el cuarto clasificado hay un salto del 51 %. C, que era primero para BM25 —probablemente porque contiene la cadena literal «1619/2012»— no gana, porque la búsqueda densa sólo lo situaba tercero; pero adelanta a B, que era segundo en denso pero quinto en léxico. F, primerísimo candidato léxico en tercera posición, cae al cuarto puesto global por no tener respaldo semántico alguno.

Ese es exactamente el efecto que se busca: el acuerdo entre dos métodos independientes manda sobre la confianza de uno solo. Y se consigue sin ajustar ningún α, sin normalizar nada y sin que importe que un motor devuelva puntuaciones en una escala y el otro en otra. Por eso RRF es la opción por defecto razonable, y por eso es lo que implementan de serie la mayoría de los motores que ofrecen híbrido.

Límites y contraindicaciones

La búsqueda híbrida no es gratis ni es universalmente mejor. Cuatro reservas.

Coste operativo. Hay que mantener dos índices, y no todos los motores traen el léxico incorporado. Si el tuyo no lo trae, la alternativa es un servicio aparte, con su despliegue y su sincronización, que puede quedar desfasado respecto al índice vectorial y producir fallos difíciles de diagnosticar.

RRF descarta información. Al quedarse sólo con las posiciones, pierde la magnitud de la similitud. Un fragmento que era primero con similitud 0,93 y otro que era primero con similitud 0,41 puntúan igual. Si necesitas un umbral absoluto para decidir «aquí no hay nada relevante, mejor responder que no lo sé», tendrás que conservar las puntuaciones originales aparte, porque la puntuación RRF no sirve para eso: es un número relativo a la consulta, sin significado propio.

El léxico depende del idioma. BM25 necesita tokenización, y en español hay que revisar acentos, stemming y palabras vacías. Un índice léxico configurado para inglés sobre un corpus español rinde mucho peor de lo que su presencia sugiere.

No siempre aporta. Si tu corpus es prosa homogénea sin códigos, siglas ni nombres propios raros, la componente léxica añadirá poco y estarás pagando infraestructura por un margen mínimo. Mídelo antes de montarlo.

Qué viene ahora

La fusión mejora la lista de candidatos, pero sigue ordenándola con métodos que nunca han leído la pregunta y el fragmento juntos. La siguiente entrega entra en el reranking con cross-encoders: la diferencia real entre codificar por separado y codificar en pareja, el patrón de recuperar muchos candidatos y reordenar unos pocos, cómo se elige el tamaño de esa lista inicial y en qué casos el reranking no aporta nada que justifique su latencia.

Si prefieres leerlo todo de golpe y en orden, los tres libros gratuitos de los que nace esta serie están disponibles en PDF y EPUB: RAG para tu negocio (nivel básico), RAG por dentro (intermedio) y RAG en producción (avanzado).


Aviso de contenido generado con inteligencia artificial.
Este artículo ha sido redactado con la asistencia de sistemas de inteligencia artificial y revisado antes de su publicación. Se informa de ello de forma expresa en cumplimiento de la normativa vigente sobre transparencia en el uso de IA.