Saltar al contenido
← Cuaderno

RAG & Documentos

¿Búsqueda híbrida o vectorial para RAG en español? BM25, embeddings, fusión RRF y reranker medidos con preguntas reales

La fusión RRF suma 3,91 puntos de nDCG@10 en MLQA y resta 4,69 en MIRACL. Lo que gana en los dos es el reranker sobre el híbrido: +10,78 y +9,91 puntos, a 765–988 ms por consulta.

Fecha
28 oct 2026
Lectura
9 min
Resultado
RRF frente al denso: +3,91 puntos de nDCG@10 en MLQA y -4,69 en MIRACL • híbrido + reranker frente al denso: +9,91 y +10,78 • reranker: 765–988 ms por consulta

En un RAG en español, sumar BM25 a los embeddings con fusión RRF no es una mejora garantizada: subió el nDCG@10 3,91 puntos en MLQA y lo bajó 4,69 en MIRACL frente al buscador denso solo. Lo que mejoró en los dos conjuntos fue pasar un reranker por el top-20 del híbrido: +9,91 puntos en MLQA y +10,78 en MIRACL sobre el denso, a cambio de 765 a 988 ms por consulta en un portátil. Medido el 28 de octubre de 2026 con 1.000 preguntas de MLQA y 648 de MIRACL, en un Apple M1 Max.

Las guías de 2026 sobre RAG repiten que «la búsqueda híbrida siempre gana» y que «el reranking sube la precisión», casi siempre con cifras en inglés, de un proveedor o sin código. Aquí está la medida en español, con los datos, el código y la puntuación de cada pregunta publicados.

Definiciones

  • BM25: búsqueda por palabras. Puntúa los pasajes que comparten términos con la pregunta, con más peso a los términos raros. Aquí, con lematizador de español y sin palabras vacías.
  • Búsqueda densa (vectorial): la pregunta y los pasajes se convierten en vectores con un modelo de embeddings y se buscan los más parecidos. Encuentra paráfrasis, pero puede fallar con nombres o cifras exactas.
  • Búsqueda híbrida con RRF: se combinan las dos listas con Reciprocal Rank Fusion: cada pasaje suma 1/(60 + posición) en cada lista. Solo usa posiciones, no puntuaciones.
  • Reranker: un modelo (cross-encoder) que lee la pregunta y cada pasaje candidato juntos y los reordena. Es más preciso y mucho más lento: no busca en todo el corpus, solo reordena los primeros resultados.
  • nDCG@10: de 0 a 100, cuánto de arriba aparecen los pasajes relevantes entre los 10 primeros. Recall@10 / @100: qué parte de los relevantes está en los 10 o 100 primeros. MRR@10: lo arriba que sale el primer relevante.
  • Consulta literal: la que lleva cifras o nombres propios, donde se supone que BM25 ayuda.

Hipótesis

  1. La búsqueda híbrida supera a BM25 y al denso por separado.
  2. BM25 aporta sobre todo en las consultas con cifras y nombres propios.
  3. El reranker mejora el resultado, pero su coste en latencia es alto.

Montaje

  • Conjuntos: MIRACL en español (dev), en la versión reducida de MTEB con negativos difíciles: 146.750 pasajes de Wikipedia y 648 preguntas escritas por personas, con 4,61 pasajes relevantes de media. MLQA español-español (test): 4.761 pasajes y una muestra fija de 1.000 preguntas tipo SQuAD, redactadas a partir del propio pasaje y con 1 relevante.
  • Recuperadores: BM25 (bm25s 0.3.15, Snowball español); denso con multilingual-e5-small en los dos conjuntos y con bge-m3 (fp16) solo en MLQA; RRF (k = 60) del top-100 de BM25 y de cada denso; bge-reranker-v2-m3 (fp16) sobre el top-20 de BM25 y del híbrido con e5-small, en una muestra fija de 300 preguntas por conjunto.
  • Métricas: nDCG@10, Recall@10, Recall@100 y MRR@10 por pregunta. Diferencias de nDCG@10 con intervalo de confianza del 95 % por bootstrap pareado.
  • Latencia: una pregunta cada vez, 30 preguntas fijas × 5 repeticiones por conjunto (150 mediciones por paso). El índice BM25 se construyó 5 veces.
  • Equipo: portátil Apple M1 Max con 64 GB, macOS 26.6.2, Python 3.12.13; embeddings y reranker en la GPU (MPS).

Resultados

Calidad con todas las preguntas

Conjunto y método nDCG@10 Recall@10 Recall@100 MRR@10
MIRACL · BM25 26,02 30,63 % 76,72 % 38,26
MIRACL · e5-small 51,21 57,96 % 95,08 % 66,14
MIRACL · RRF BM25 + e5-small 46,52 53,10 % 94,92 % 60,52
MLQA · BM25 68,41 79,05 % 88,55 % 65,06
MLQA · e5-small 69,87 81,25 % 92,25 % 66,26
MLQA · bge-m3 71,05 81,75 % 93,05 % 67,67
MLQA · RRF BM25 + e5-small 73,78 84,75 % 93,75 % 70,33
MLQA · RRF BM25 + bge-m3 74,31 85,15 % 95,05 % 70,89
  • En MLQA, el híbrido gana. RRF con e5-small sube 3,91 puntos sobre e5-small solo (IC 95 %: de 2,45 a 5,39) y 5,37 sobre BM25. Con bge-m3, 3,26 puntos más que bge-m3 solo.
  • En MIRACL, el híbrido pierde. BM25 se queda en 26,02 y arrastra a la fusión: RRF queda 4,69 puntos por debajo de e5-small solo (IC 95 %: de -6,83 a -2,70). El Recall@100 es casi el mismo (94,92 % frente a 95,08 %): los pasajes buenos siguen entre los 100 primeros, pero más abajo.
  • La diferencia entre conjuntos es el tipo de pregunta. En MLQA la pregunta se escribió leyendo el pasaje y repite sus palabras; en MIRACL la escribió alguien sin verlo, y los negativos difíciles comparten vocabulario con ella.

Consultas con cifras o nombres propios

Conjunto y método nDCG@10 literal nDCG@10 no literal
MIRACL · BM25 26,40 25,47
MIRACL · e5-small 52,96 48,69
MIRACL · RRF BM25 + e5-small 46,71 46,25
MLQA · BM25 78,86 54,55
MLQA · e5-small 82,33 53,36
MLQA · RRF BM25 + e5-small 84,53 59,53

La hipótesis 2 no se cumple: en MIRACL el híbrido también pierde con cifras y nombres propios (46,71 frente a 52,96). En MLQA, BM25 gana a e5-small justo en las preguntas sin cifras ni nombres (54,55 frente a 53,36), y el híbrido gana en los dos grupos.

Con reranker (muestra de 300 preguntas por conjunto)

Conjunto y método nDCG@10 Recall@10 MRR@10
MIRACL · e5-small 52,80 57,94 % 69,25
MIRACL · RRF BM25 + e5-small 48,16 53,16 % 62,59
MIRACL · BM25 + reranker 43,92 40,87 % 66,83
MIRACL · RRF + reranker 63,58 65,16 % 81,45
MLQA · e5-small 69,97 79,33 % 67,04
MLQA · RRF BM25 + e5-small 73,66 83,67 % 70,57
MLQA · BM25 + reranker 78,42 82,67 % 77,04
MLQA · RRF + reranker 79,89 85,67 % 78,04
Comparación (nDCG@10, misma muestra) MIRACL MLQA
RRF + reranker frente a e5-small solo +10,78 (de 7,94 a 13,48) +9,91 (de 6,93 a 13,26)
RRF + reranker frente a RRF sin reranker +15,42 (de 13,03 a 17,96) +6,23 (de 3,87 a 8,67)
RRF + reranker frente a BM25 + reranker +19,66 (de 16,96 a 22,61) +1,46 (de -0,60 a 3,53)

Entre paréntesis, el intervalo de confianza del 95 %. El reranker mejora 211 de las 300 preguntas de MIRACL y empeora 47; en MLQA mejora 55, empeora 12 y deja igual 233 (muchas ya tenían el relevante en primer lugar).

Aquí sí sirve el híbrido: como entrada del reranker. RRF sin reranker pierde en MIRACL, pero su top-20 contiene más pasajes buenos que el de BM25, y el reranker los sube. Reordenar solo el top-20 de BM25 se queda 8,88 puntos por debajo del denso solo en MIRACL.

Latencia por consulta (mediana de 150 mediciones, una pregunta cada vez)

Paso MIRACL (146.750 pasajes) MLQA (4.761 pasajes)
BM25, top-100 1,03 ms 0,45 ms
e5-small: codificar la pregunta y buscar 14,84 ms 8,50 ms
bge-m3: codificar la pregunta y buscar — 18,56 ms
Fusión RRF 0,05 ms 0,05 ms
Reranker, 20 pasajes 765,12 ms 987,73 ms
Reranker, 20 pasajes (p90) 1200,51 ms 1254,16 ms

La dispersión entre repeticiones es baja: la mediana del reranker va de 759,20 a 765,29 ms entre las 5 repeticiones en MIRACL. El índice BM25 de MIRACL se construye en 6,57 s (mediana de 5); el de MLQA, en 0,26 s. Calcular los embeddings de los 146.750 pasajes con e5-small tardó 489,48 s, en una sola ejecución.

Qué significa

  • Hipótesis 1: depende de las preguntas. Si tus usuarios preguntan con las palabras del documento (soporte con códigos de error, catálogos, normativa citada), el híbrido suma unos puntos. Si preguntan con sus propias palabras, BM25 puede restar.
  • Hipótesis 2: no se cumple en estos datos. Las cifras y los nombres propios no fueron donde BM25 más ayudó.
  • Hipótesis 3: se cumple. El reranker es la pieza que más sube la calidad (de 9,91 a 10,78 puntos sobre el denso) y la que más cuesta: 765,12 ms por consulta en MIRACL frente a 14,84 ms de la búsqueda densa, en este equipo.

Cuándo usar cada opción

  • Solo denso: punto de partida. Con preguntas redactadas por usuarios, fue mejor que el híbrido sin reranker.
  • Híbrido sin reranker: cuando las preguntas comparten vocabulario con los documentos y no puedes añadir un segundo de latencia. Mídelo con tus preguntas antes de darlo por bueno.
  • Híbrido con reranker: cuando la calidad importa más que la latencia (asistentes internos, búsqueda documental, respuestas que se revisan). Fue la mejor opción en los dos conjuntos. En GPU de servidor o con un reranker más pequeño la latencia baja; no se midió aquí.
  • BM25 con reranker: solo si no tienes embeddings. En MLQA quedó cerca del mejor; en MIRACL, por debajo del denso solo.

Limitaciones

  • Dos conjuntos públicos de Wikipedia, no documentos de empresa. MLQA tiene 1 relevante por pregunta y mucho solapamiento léxico; MIRACL tiene juicios de relevancia incompletos (un pasaje bueno no marcado cuenta como fallo).
  • El corpus de MIRACL es la versión reducida de MTEB, formada por los pasajes que devolvían varios recuperadores para estas preguntas. Eso hace que todos los negativos se parezcan a la pregunta y puede penalizar a BM25 más que un corpus completo.
  • bge-m3 solo se midió en MLQA: calcular sus embeddings para MIRACL completo no cabía en el tiempo de cómputo. Tampoco se probaron sus vectores dispersos ni ColBERT, otros valores de k en RRF, fusión por puntuaciones ponderadas ni otros tamaños de top para el reranker.
  • El reranker se evaluó en 300 preguntas por conjunto; los intervalos de confianza lo reflejan.
  • Un solo portátil Apple Silicon, en batería y con otras apps abiertas. La latencia del reranker depende mucho de la GPU y de la longitud de los pasajes; sirve para el orden de magnitud. Todo el cómputo cupo en menos de 30 minutos.

Cómo repetirlo

Código, revisiones fijadas de datos y modelos, puntuación de cada pregunta y latencias en bruto: yeswelab-laboratorio/busqueda-hibrida-bm25-embeddings-rag-espanol en GitHub. Se ejecuta sin cuentas ni claves; descarga de Hugging Face los datos, los dos modelos de embeddings y el reranker (varios GB) la primera vez.

Relacionado

¿Tu RAG no encuentra lo que debería y no sabes si falta BM25, un reranker o mejores embeddings? Encárganos el experimento con tus documentos y las preguntas de tus usuarios.

#bm25s 0.3.15#multilingual-e5-small#bge-m3#bge-reranker-v2-m3#sentence-transformers 6.2.0#PyTorch 2.14.1