Compartir por


Puntuación por relevancia en la búsqueda híbrida mediante la fusión de clasificación recíproco (RRF)

La fusión de clasificación recíproca (RRF) es un algoritmo que evalúa las puntuaciones de búsqueda de varios resultados clasificados previamente para generar un conjunto de resultados unificado. En Azure AI Search, RRF se usa cada vez que hay dos o más consultas que se ejecutan en paralelo. Cada consulta genera un conjunto de resultados clasificado y RRF se usa para combinar y homogenizar las clasificaciones en un único conjunto de resultados, devuelto en la respuesta de la consulta. Algunos ejemplos de escenarios en los que RRF siempre se usa incluyen la búsqueda híbrida y varias consultas vectoriales que se ejecutan simultáneamente.

RRF se basa en el concepto de clasificación recíproca, que es el inverso de la clasificación del primer documento pertinente en una lista de resultados de búsqueda. El objetivo de la técnica es tener en cuenta la posición de los artículos en las clasificaciones originales y dar mayor importancia a los elementos mejor clasificados en varias listas. Esto puede ayudar a mejorar la calidad general y la fiabilidad de la clasificación final, haciéndola más útil para la tarea de fusionar múltiples resultados de búsqueda ordenados.

Nota:

Una novedad de 2024-09-01-preview es la capacidad de descomponer una puntuación de búsqueda clasificada por RRF en las subpuntuaciones que la componen. Esto le da transparencia en la composición de la puntuación total. Para obtener más información, consulte descomprimir resultados de búsqueda (versión preliminar) en este artículo.

Funcionamiento de la clasificación de RRF

La RRF funciona tomando los resultados de búsqueda de varios métodos, asignando una puntuación de rango recíproca a cada documento de los resultados y combinando después las puntuaciones para crear una nueva clasificación. El concepto es que los documentos que aparecen en las primeras posiciones a través de múltiples métodos de búsqueda tienen más probabilidades de ser más relevantes y deben clasificarse más arriba en el resultado combinado.

Esta es una explicación sencilla del proceso de RRF:

  1. Obtenga resultados de búsqueda clasificados a partir de múltiples consultas ejecutadas en paralelo.

  2. Asigne puntuaciones de clasificación recíprocas para el resultado en cada una de las listas clasificadas. La RRF genera un nuevo @search.score para cada coincidencia en cada conjunto de resultados. A cada documento de los resultados de la búsqueda, el motor le asigna una puntuación de rango recíproco en función de su posición en la lista. La puntuación se calcula como 1/(rank + k), donde rank es la posición del documento en la lista y k es una constante, que se observó experimentalmente para que funcione mejor si se establece en un valor pequeño como 60. Tenga en cuenta que este valor k es una constante en el algoritmo RRF y se separa completamente del valor k que controla el número de vecinos más cercanos.

  3. Combine las puntuaciones. Para cada documento, el motor suma las puntuaciones de rango recíprocas obtenidas de cada sistema de búsqueda, produciendo una puntuación combinada para cada documento. 

  4. El motor clasifica los documentos en función de las puntuaciones combinadas y los ordena. La lista resultante es la clasificación fusionada.

Solo se usan campos marcados como searchable en el índice o searchFields en la consulta para la puntuación. Solo los campos marcados como retrievable, o especificados en select la consulta, se devuelven en los resultados de búsqueda, junto con su puntuación de búsqueda.

Ejecución de consultas en paralelo

RRF se usa cada vez que hay más de una ejecución de consulta. Los siguientes ejemplos ilustran modelos de consulta en los que se produce una ejecución paralela de la consulta:

  • Una consulta de texto completo, más una consulta vectorial (escenario híbrido simple), equivale a dos ejecuciones de consulta.
  • Una consulta de texto completo, más una consulta vectorial dirigida a dos campos vectoriales, equivale a tres ejecuciones de consulta.
  • Una consulta de texto completo, más dos consultas vectoriales dirigidas a cinco campos vectoriales, equivale a 11 ejecuciones de consulta.

Puntuaciones en resultados de búsqueda híbrida

Cada vez que se clasifican los resultados, la propiedad @search.score contiene el valor usado para ordenar los resultados. Las puntuaciones se generan mediante algoritmos de clasificación que varían para cada método. Cada algoritmo tiene su propio rango y magnitud.

El siguiente cuadro identifica la propiedad de puntuación devuelta en cada coincidencia, algoritmo y rango de puntuaciones para cada algoritmo de clasificación de relevancia.

Método de búsqueda Parámetro Algoritmo de puntuación Range
búsqueda de texto completo @search.score Algoritmo BM25 No hay límite superior.
vector de búsqueda @search.score Algoritmo HNSW, mediante la métrica de similitud especificada en la configuración de HNSW. 0,333 - 1,00 (coseno), 0 a 1 para euclídeo y producto escalar.
búsqueda híbrida @search.score Algoritmo RRF El límite superior está delimitado por el número de consultas que se fusionan, y cada consulta contribuye con un máximo de aproximadamente 1 a la puntuación RRF. Por ejemplo, la fusión de tres consultas produciría puntuaciones RRF más altas que si solo se fusionan dos resultados de búsqueda.
clasificación semántica @search.rerankerScore Clasificación semántica 0,00 - 4,00

La clasificación semántica se produce después de la combinación de RRF de los resultados. Su puntuación (@search.rerankerScore) siempre se notifica por separado en la respuesta de la consulta. El clasificador semántico puede volver a generar texto completo y resultados de búsqueda híbrida, suponiendo que esos resultados incluyan campos que tengan contenido semánticamente enriquecido. Puede volver a generar consultas vectoriales puras si los documentos de búsqueda incluyen campos de texto que contienen contenido semánticamente relevante.

Descomprimir una puntuación de búsqueda en subpuntuaciones (versión preliminar)

Con 2024-09-01-preview, puede descomponer una puntuación de búsqueda para ver sus subpuntuaciones.

En el caso de las consultas vectoriales, esta información puede ayudarle a determinar un valor adecuado para la ponderación vectorial o el establecimiento de umbrales mínimos.

Para obtener subpuntuaciones:

Este es un ejemplo de consulta híbrida que devuelve subpuntuaciones en modo de depuración:

POST https://{{search-service-name}}.search.windows.net/indexes/{{index-name}}/docs/search?api-version=2024-09-01=preview

{
    "vectorQueries": [
        {
            "vector": [
                -0.009154141,
                0.018708462,
                . . . 
                -0.02178128,
                -0.00086512347
            ],
            "fields": "DescriptionVector",
            "kind": "vector",
            "exhaustive": true,
            "k": 10
        },
        {
            "vector": [
                -0.009154141,
                0.018708462,
                . . . 
                -0.02178128,
                -0.00086512347
            ],
            "fields": "DescriptionVector",
            "kind": "vector",
            "exhaustive": true,
            "k": 10
        }
    ],
    "search": "historic hotel walk to restaurants and shopping",
    "select": "HotelName, Description, Address/City",
    "debug": "vector",
    "top": 10
}

Puntuaciones ponderadas

Con 2024-07-01 y versiones preliminares más recientes de la API puede ponderar consultas vectoriales para aumentar o reducir su importancia en una consulta híbrida.

Recuerde que, al calcular la RRF de un determinado documento, el motor de búsqueda examina la clasificación de dicho documento en cada conjunto de resultados en el que aparece. Supongamos que un documento aparece en tres resultados de búsqueda independientes y los resultados proceden de dos consultas vectoriales y una consulta de texto de clasificación BM25. La posición del documento varía en cada resultado.

Se encontró una coincidencia Posición en los resultados @search.score Multiplicador de ponderación @search.score (ponderado)
resultados vectoriales uno posición 1 0,8383955 0.5 0,41919775
resultados vectoriales dos posición 5 0,81514114 2.0 1,63028228
Resultados de BM25 posición 10 0,8577363 N/D 0,8577363

La posición del documento en cada conjunto de resultados se corresponde con una puntuación inicial, que se agrega para crear la puntuación final de la RRF para ese documento.

Si agrega la ponderación vectorial, las puntuaciones iniciales están sujetas a un multiplicador de ponderación que aumenta o disminuye la puntuación. El valor predeterminado es 1,0, que significa que no hay ponderación y la puntuación inicial se usa tal cual en la puntuación de la RRF. Sin embargo, si agrega una ponderación de 0,5, la puntuación se reduce y ese resultado es menos importante en la clasificación combinada. Por el contrario, si agrega una ponderación de 2,0, la puntuación se convierte en un factor mayor en la puntuación general de la RRF.

En este ejemplo, los valores de @search.score (ponderados) se pasan al modelo de clasificación de la RRF.

Número de resultados clasificados en una respuesta de consulta híbrida

De manera predeterminada, si no utiliza la paginación, el motor de búsqueda devuelve las 50 coincidencias mejor clasificadas para la búsqueda de texto completo, y las k coincidencias más similares para el vector de búsqueda. En una consulta híbrida, top determina el número de resultados en la respuesta. Basándose en los valores predeterminados, se devuelven las 50 coincidencias mejor clasificadas del conjunto de resultados unificado.

A menudo, el motor de búsqueda encuentra más resultados que top y k. Para devolver más resultados, use los parámetros de paginación top, skip y next. La paginación es la forma de determinar el número de resultados en cada página lógica y de navegar por toda la carga útil. Puede establecer maxTextRecallSize en valores más grandes (el valor predeterminado es 1000) para devolver más resultados del lado de texto de la consulta híbrida.

De manera predeterminada, la búsqueda de texto completo está sujeta a un límite máximo de 1000 coincidencias (consulte Límites de respuesta de API). Una vez encontradas 1000 coincidencias, el motor de búsqueda deja de buscar más.

Para más información, consulte el artículo sobre el trabajo con los resultados de la búsqueda.

Diagrama de un flujo de trabajo de puntuación de búsqueda

El diagrama siguiente ilustra una consulta híbrida que invoca la búsqueda por palabras clave y por vectores, con potenciación mediante perfiles de puntuación y clasificación semántica.

Diagrama de prefiltros.

Una consulta que genera el flujo de trabajo anterior podría tener este aspecto:

POST https://{{search-service-name}}.search.windows.net/indexes/{{index-name}}/docs/search?api-version=2024-07-01
Content-Type: application/json
api-key: {{admin-api-key}}
{
   "queryType":"semantic",
   "search":"hello world",
   "searchFields":"field_a, field_b",
   "vectorQueries": [
       {
           "kind":"vector",
           "vector": [1.0, 2.0, 3.0],
           "fields": "field_c, field_d"
       },
       {
           "kind":"vector",
           "vector": [4.0, 5.0, 6.0],
           "fields": "field_d, field_e"
       }
   ],
   "scoringProfile":"my_scoring_profile"
}

Consulte también