Una pregunta que el generador no resuelve solo
Un asistente busca el procedimiento correcto en un archivo técnico. La búsqueda por palabras sitúa primero un documento con el código exacto del componente; la semántica prefiere una explicación con otros términos. Ambas parecen plausibles, pero sus puntuaciones usan escalas distintas. Sumarlas puede dejar que decida la escala numérica en lugar de la relevancia. Explicaremos cómo Reciprocal Rank Fusion, RRF, combina posiciones y qué información descarta. La pregunta final no es si podemos obtener un orden, sino si hay motivos para confiar en él.
Resumen. Construimos dos listas sintéticas de cinco documentos y calculamos RRF con fracciones exactas. Con el mismo contenido, k cambia la posición relativa de A y C al superar un umbral derivado de aproximadamente 4,4641. Limitar cada lista a dos resultados vuelve a cambiar el orden; contar cuatro veces el mismo motor coloca primero un documento irrelevante según las etiquetas declaradas. Medimos precisión media en este caso único, no en un benchmark. RRF evita comparar directamente escalas, pero no elimina decisiones sobre candidatos, correlación entre motores y evaluación.
Qué contiene realmente una clasificación
Un documento es un objeto identificable, no solo un texto parecido a otro. A, B, C, D y E representan cinco objetos distintos. Una clasificación es una lista ordenada cuya posición 1 es la mejor. Repetir un identificador no debe darle dos votos dentro de una lista: el código rechaza esa entrada. Deduplicar identificadores no elimina documentos distintos que dicen lo mismo. Esa otra redundancia exige una decisión de contenido ajena a la fórmula.
L1 es A-B-C-D-E y L2 es B-C-D-E-A. Podemos imaginarlas como resultados léxicos y semánticos, pero no ejecutamos esos motores: construimos las entradas para aislar el mecanismo. Para evaluar declaramos relevantes solo B y C. Las etiquetas no se deducen de las posiciones; se fijan por separado, como en un protocolo de juicios independientes. En un archivo real habría que explicar quién define relevancia, para qué pregunta y qué documentos faltan en la muestra juzgada.
En generación aumentada por recuperación, RAG, el generador recibe documentos o fragmentos seleccionados antes de responder. La fusión actúa antes: decide candidatos y prioridades. No comprueba si una frase generada está respaldada ni si la versión documental sigue vigente. Separar estas funciones importa: mejorar la recuperación puede enriquecer el contexto, pero un orden convincente no prueba la corrección de la respuesta final.
Una suma de posiciones, no de confianzas
Si un motor asigna 12 y otro 0,8, sumarlos no crea automáticamente un significado común. Reescalar todos los valores del primero sin cambiar su orden puede alterar el ganador de una fusión ingenua. RRF descarta distancias entre puntuaciones y usa posiciones. Así es invariante ante transformaciones estrictamente crecientes dentro de cada motor, si candidatos y orden permanecen fijos. El precio es perder distancias informativas: una victoria abrumadora y una mínima producen el mismo primer puesto.
S(d) es la puntuación fusionada de d. j recorre listas, r_j(d) es su posición en la lista j y k es una constante no negativa sin unidades. Solo suman listas que contienen d: según nuestro protocolo, una ausencia contribuye cero, no una posición estimada. Las puntuaciones no son probabilidades de relevancia. Los rangos empiezan en 1; empezar en cero cambia denominadores y, con k=0, causa división por cero.
La referencia fundacional es el trabajo de Cormack, Clarke y Büttcher en SIGIR 2009, páginas 758–759. Leímos fórmula, protocolo, tablas y discusión, no solo el resumen. Los autores fijan k=60 tras una investigación piloto y comparan fusiones en TREC y LETOR 3. Sus tablas contienen excepciones a una superioridad absoluta, incluidos resultados de CombMNZ. No reproducimos esos experimentos ni usamos sus datos o trasladamos su rendimiento al archivo hipotético: analizamos la regla con entradas nuevas.
Cinco documentos, todas las contribuciones visibles
Empezamos con k=0 para ver los cálculos. B es segundo en L1 y primero en L2: 1/2+1=1,5. A es primero y quinto: 1+1/5=1,2. C es tercero y segundo: 1/3+1/2=5/6, aproximadamente 0,833333. D recibe 1/4+1/3=7/12 y E, 1/5+1/4=9/20. El orden es B-A-C-D-E. El apoyo fuerte de B en ambas listas vence la victoria aislada de A, pero C sigue detrás de A.
Repetimos el mismo experimento con k=60. B obtiene 1/62+1/61=0,032522475; C, 1/63+1/62=0,032002048; A, 1/61+1/65=0,031778058. D y E siguen con aproximadamente 0,031498016 y 0,031009615. Ahora el orden es B-C-A-D-E. No cambiaron documentos ni etiquetas, sino la función que convierte una posición en contribución. Por eso k forma parte del protocolo y debe registrarse, no ocultarse como detalle de implementación.
| Documento | r en L1 | r en L2 | S(k=0) | S(k=60) |
|---|---|---|---|---|
| A | 1 | 5 | 1.200000000 | 0.031778058 |
| B | 2 | 1 | 1.500000000 | 0.032522475 |
| C | 3 | 2 | 0.833333333 | 0.032002048 |
| D | 4 | 3 | 0.583333333 | 0.031498016 |
| E | 5 | 4 | 0.450000000 | 0.031009615 |
En la tabla conviene mirar C frente a A, no el tamaño absoluto del número. Pasar de aproximadamente 1 a 0,03 no indica menor relevancia. Son escalas de reglas distintas y el valor ordena candidatos bajo una regla fija. Añadir una lista eleva puntuaciones y puede reordenar incluso con k constante. Un umbral como «aceptar si S supera 0,03» no es transferible entre configuraciones sin validación específica.
Derivar dónde cambia la preferencia
Podemos explicar A frente a C sin limitarnos a probar valores. Restamos la puntuación de C de la de A. Para k no negativo todos los denominadores son positivos, por lo que el signo depende solo del numerador común. Al reunir las cuatro fracciones aparece un polinomio cuadrático. La sensibilidad se vuelve una propiedad comprensible, no una coincidencia gráfica. No derivamos un k óptimo universal, sino el cruce de dos perfiles concretos.
El numerador se anula en 1 más o menos raíz de 12. La raíz negativa queda fuera del dominio. Para 0≤k<4,4641 es positivo y A precede a C; por encima es negativo y C precede a A. El programa usa enteros: k=4 conserva la primera preferencia y k=5 la segunda. En el umbral exacto empatan y hace falta una regla explícita. Resolvemos empates por identificador: determinista, pero sin significado de relevancia.
La contribución del primer puesto respecto al quinto es (k+5)/(k+1): vale 5 con k=0 y aproximadamente 1,0656 con k=60. Al aumentar k, posiciones próximas aportan valores más parecidos. Para rangos pequeños frente a k, 1/(k+r) se aproxima por 1/k−r/k². Si un documento aparece en m listas, la contribución principal ronda m/k. Es intuición asintótica, no identidad: explica la importancia de presencias y profundidades; el programa usa siempre las fracciones completas.
Truncar la lista cambia el problema
Un sistema real rara vez devuelve todos los documentos. Repetimos k=60 usando solo A-B de L1 y B-C de L2. B conserva ambas contribuciones y su puntuación; A pierde su presencia quinta y queda con 1/61; C pierde su presencia tercera y queda con 1/62. El orden pasa a B-A-C. No aproximamos solo la cola: cambiamos la preferencia entre candidatos presentes. «Fusionar los dos primeros» es otro algoritmo operativo frente a fusionar listas completas.
La ausencia tiene dos sentidos distintos: el documento puede quedar fuera de la colección accesible o por debajo de la profundidad solicitada. Nuestro cero no los distingue ni equivale a un juicio negativo. Evita inventar un rango no observado, pero hace depender el resultado del presupuesto de recuperación. Hay que registrar profundidad por motor, filtros activos y si ambos veían la misma versión del corpus.
Si un documento relevante falta en todas las listas, ninguna fusión de esos candidatos lo recuperará. Es un límite de cobertura o recall, la proporción de relevantes presentes entre candidatos, previo al orden. En el caso truncado B y C siguen disponibles: el daño observado afecta a posición, no a recall. Distinguirlo orienta el remedio: ampliar candidatos si falta cobertura; cambiar la fusión o añadir reordenación si los documentos correctos están demasiado abajo.
Cuatro copias no son cuatro pruebas independientes
Mantenemos listas completas, pero introducimos cuatro copias de L1 y una de L2. Este caso extremo representa configuraciones casi idénticas o un error que cuenta repetidamente el mismo resultado. Con k=60, A recibe 4/61+1/65=0,080958386 y B, 4/62+1/61=0,080909572. A vence por un margen pequeño pero positivo y el orden vuelve a A-B-C-D-E. La duplicación no añadió información documental: aumentó el peso de una preferencia existente.
RRF no exige independencia estadística para calcularse. El problema está en interpretar el consenso: cinco contribuciones no equivalen a cinco comprobaciones independientes. Una fusión ponderada puede explicitar la decisión, dando un peso total a una familia en vez de un peso completo a cada variante. No demostramos que mejore calidad: es una alternativa que comparar. Pesos y familias no deben elegirse oportunistamente tras ver el test final, porque eso vaciaría la evaluación.
Los pesos w_j son números no negativos sin unidades; la versión ponderada se discute, pero no es el sistema de los resultados presentados. Dar peso 1/4 a cada una de cuatro copias idénticas restauraría exactamente una L1: consecuencia algebraica, no nuevo experimento real. Si las listas fueran distintas, no valdría esa equivalencia. La diversidad útil no es el número de servicios llamados: hay que observar sus errores y documentos adicionales.
Medir qué ha mejorado realmente
Evaluamos con average precision, precisión media para una consulta. Al encontrar un relevante calculamos precisión hasta esa posición: aciertos relevantes acumulados divididos por posiciones leídas. Sumamos esos valores y dividimos por el total de relevantes declarado, aquí dos. Los ausentes aportan cero. Premia disponibilidad temprana de documentos útiles, no corrección de frases generadas. Declarar el denominador evita premiar artificialmente una lista que perdió un relevante.
En B-C-A-D-E los relevantes están en posiciones 1 y 2: AP=(1+1)/2=1. En B-A-C-D-E están en 1 y 3: AP=(1+2/3)/2=5/6, aproximadamente 0,833333. Las copias de L1 ponen A primero y desplazan relevantes a 2 y 3: AP=(1/2+2/3)/2=7/12, aproximadamente 0,583333. Las etiquetas permanecen fijas. No son porcentajes de fiabilidad del asistente, sino mediciones de orden para una consulta construida.
Es imprescindible comparar con listas originales. L1 tiene AP=7/12, pero L2 ya alcanza AP=1. La fusión completa con k=60 iguala L2, no la mejora; con k=0 es peor. Omitir esa baseline permitiría afirmar engañosamente que la fusión eleva precisión de 0,583 a 1, eligiendo a escondidas la comparación favorable con L1. Una evaluación real necesita muchas consultas, juicios documentados y variación entre preguntas. Un caso demuestra mecanismos y posibilidades, no superioridad media.

Una implementación pequeña con hipótesis explícitas
La función fuse recibe listas ordenadas y un entero k no negativo. Acumula 1/(k+r) por identificador mediante Fraction de Python, preservando cocientes enteros exactos. Solo el JSON de presentación convierte a decimales y conserva también fracciones como texto. Ordenar fracciones evita que el redondeo decida un casi empate en el ejemplo. No significa que todo servicio deba usar aritmética racional: puede ser costosa a escala y cada implementación requiere comprobar su comportamiento numérico.
Con M posiciones totales y U documentos distintos, acumular en un mapa requiere M actualizaciones y O(U) memoria. Ordenar todo exige O(U log U) comparaciones. Son operaciones y comparaciones, no latencia medida: las fracciones dependen también del tamaño de enteros. Una selección parcial puede obtener solo los K primeros, pero ordenamos todo para mostrar cada puntuación. No ejecutamos un benchmark de velocidad.
experiment.py reconstruye entradas, comprueba unicidad por lista, verifica órdenes esperados y calcula sensibilidad para k de 0 a 100. Al ser determinista no aplica una semilla. El fragmento siguiente llama las mismas funciones adjuntas, no un algoritmo abreviado con otras reglas. Python basta para la tabla; Matplotlib para gráficos. Se conservan versiones y salidas. Ningún motor ni modelo generativo fue entrenado o consultado para producir estas cifras.
Trasladar el razonamiento a un archivo real
Una evaluación útil separa tres preguntas: ¿los candidatos contienen documentos necesarios con iguales permisos y versión del corpus? ¿la fusión los ofrece dentro del presupuesto de contexto, considerando longitud y redundancia? ¿el generador usa bien esa evidencia? Nuestra AP solo cubre parte de la segunda y trata documentos como unidades comparables. Uno muy largo puede agotar contexto: ordenar documentos no equivale a seleccionar tokens.
Entre alternativas, normalizar puntuaciones conserva distancias pero supone comparabilidad; un reordenador reevalúa candidatos con recursos y protocolo propios; ponderar familias trata redundancia explícitamente, pero requiere validar pesos. No les atribuimos rendimiento porque no fueron implementadas y medidas sobre las mismas consultas. Comparar honestamente exige declarar primero qué información usan y qué costes o hipótesis añaden, antes de ordenar su calidad.
La respuesta: fusión sencilla, decisiones relevantes
Las posiciones y una regla como RRF permiten combinar búsquedas sin sumar puntuaciones incompatibles. Pero un cálculo sencillo no es neutral. Aquí un parámetro cambia una preferencia en un umbral demostrable, la profundidad altera contribuciones y copiar un motor cambia el ganador sin añadir conocimiento. La mejor fusión ejecutada solo iguala una lista original: no hay milagro numérico. La confianza requiere procedencia, parámetros, candidatos y juicios independientes, además de verificar por separado las afirmaciones generadas.
from experiment import fuse, ap, L1, L2
for name, lists, k in [('full', [L1,L2],60),('top2',[L1[:2],L2[:2]],60),('duplicates',[L1]*4+[L2],60)]:
result = fuse(lists,k)
print(name,result['order'],ap(result['order']))
Código, datos e instrucciones · JSON. Cálculos didácticos ejecutados con Python 3.14.0; figuras con Matplotlib 3.11.2. Análisis asistido por IA, sin afirmar revisión por pares ni humana. Portada original ImageGen ilustrativa: no documenta personas, sedes ni instalaciones de EL-AI. Fuentes consultadas el 16 de octubre de 2026.

