Scoring de pertinence dans la recherche hybride en utilisant la fusion de classement réciproque (RRF, Reciprocal Rank Fusion)

La fusion de classement réciproque (RRF) est un algorithme qui évalue les scores de recherche de plusieurs résultats classés précédemment pour produire un jeu de résultats unifié. Dans Recherche Azure AI, RRF est utilisé chaque fois qu’il existe deux requêtes ou plus qui s’exécutent en parallèle. Chaque requête produit un jeu de résultats classé, et RRF est utilisé pour fusionner et homogénéiser les classements en un seul jeu de résultats, retourné dans la réponse de la requête. Les exemples de scénarios où RRF est toujours utilisé incluent la recherche hybride et plusieurs requêtes vectorielles s’exécutant simultanément.

RRF est basé sur le concept de classement réciproque, qui est l’inverse du rang du premier document pertinent dans une liste de résultats de recherche. L’objectif de la technique est de prendre en compte la position des éléments dans les classements originaux et de donner une importance plus élevée aux éléments classés plus hauts dans plusieurs listes. Cela peut aider à améliorer la qualité et la fiabilité globale du classement final, ce qui le rend plus utile pour la tâche de fusionner plusieurs résultats de recherche triés.

Fonctionnement du classement RRF

RRF fonctionne en prenant les résultats de recherche à partir de plusieurs méthodes, en attribuant un score de classement réciproque à chaque document dans les résultats, puis en combinant les scores pour créer un classement. Le concept est que les documents apparaissant dans les positions supérieures dans plusieurs méthodes de recherche sont susceptibles d’être plus pertinents et doivent être classés plus hauts dans le résultat combiné.

Voici une explication simple du processus RRF :

  1. Obtenez les résultats de recherche classés à partir de plusieurs requêtes s’exécutant en parallèle.

  2. Attribuez des scores de classement réciproques pour les résultats dans chacune des listes classées. RRF génère une nouvelle @search.score pour chaque correspondance dans chaque jeu de résultats. Pour chaque document dans les résultats de recherche, le moteur attribue un score de classement réciproque en fonction de sa position dans la liste. Le score est calculé en tant que 1/(rank + k), où rank est la position du document dans la liste et k est une constante, dont on a observé expérimentalement qu’elle donnait de meilleurs résultats si elle était fixée à une petite valeur comme 60. Notez que cette valeur k est une constante dans l’algorithme RRF et entièrement distincte du k qui contrôle le nombre de voisins les plus proches.

  3. Combinez les scores. Pour chaque document, le moteur additionne les scores de classement réciproques obtenus à partir de chaque système de recherche, produisant un score combiné pour chaque document. 

  4. Le moteur classe les documents en fonction des scores combinés et les trie. La liste résultante est le classement fusionné.

Seuls les champs marqués comme searchable dans l’index ou searchFields dans la requête sont utilisés pour le scoring. Seuls les champs marqués comme retrievable, ou les champs spécifiés dans select dans la requête, sont retournés dans les résultats de recherche, ainsi que leur score de recherche.

Exécution de requêtes parallèles

RRF est utilisé chaque fois qu’il existe plusieurs exécutions de requête. Les exemples suivants illustrent les modèles de requête où l’exécution de requête parallèle se produit :

  • Une requête de texte intégral, ainsi qu’une requête vectorielle (scénario hybride simple), est égale à deux exécutions de requête.
  • Une requête de texte intégral, ainsi qu’une requête vectorielle ciblant deux champs vectoriels, est égale à trois exécutions de requête.
  • Une requête de texte intégral, ainsi que deux requêtes vectorielles ciblant cinq champs vectoriels, est égale à 11 exécutions de requête

Scores dans les résultats de recherche hybride

Chaque fois que les résultats sont classés, la propriété @search.score contient la valeur utilisée pour classer les résultats. Les scores sont générés par des algorithmes de classement qui varient pour chaque méthode. Chaque algorithme a sa propre portée et son ampleur.

Le graphique suivant identifie la propriété de scoring retournée sur chaque correspondance, algorithme et plage de scores pour chaque algorithme de classement de pertinence.

Méthode de recherche Paramètre Algorithme de scoring Plage
recherche en texte intégral @search.score Algorithme BM25 Pas de limite supérieure.
recherche vectorielle @search.score Algorithme HNSW, à l’aide de la métrique de similarité spécifiée dans la configuration HNSW. 0.333 - 1.00 (Cosinus), 0 à 1 pour Euclidean et DotProduct.
recherche hybride @search.score Algorithme RRF La limite supérieure est limitée par le nombre de requêtes fusionnées, chaque requête contribuant à un maximum d’environ 1 au score RRF. Par exemple, la fusion de trois requêtes produira des scores RRF plus élevés que la fusion de deux résultats de recherche seulement.
classement sémantique @search.rerankerScore Classement sémantique 0.00 - 4.00

Le classement sémantique ne participe pas au RRF. Son score (@search.rerankerScore) est toujours signalé séparément dans la réponse de requête. Le classement sémantique peut reclasser du texte intégral et des résultats de recherche hybride, en supposant que ces résultats incluent des champs ayant du contenu riche sémantiquement.

Nombre de résultats classés dans une réponse de requête hybride

Par défaut, si vous n’utilisez pas la pagination, le moteur de recherche retourne les 50 correspondances de classement les plus élevées pour la recherche en texte intégral et les correspondances k les plus similaires pour la recherche vectorielle. Dans une requête hybride, top détermine le nombre de résultats dans la réponse. En fonction des valeurs par défaut, les 50 correspondances classées les plus élevées du jeu de résultats unifié sont retournées.

Souvent, le moteur de recherche trouve plus de résultats que top et k. Pour retourner d’autres résultats, utilisez les paramètres de pagination top, skipet next. La pagination est la façon dont vous déterminez le nombre de résultats sur chaque page logique et parcourez la charge utile complète.

La recherche en texte intégral est soumise à une limite maximale de 1 000 correspondances (voir limites de réponse de l’API). Une fois que 1 000 correspondances sont trouvées, le moteur de recherche ne recherche plus d’informations.

Pour plus d’informations, consultez Comment travailler avec des résultats de la recherche.

Diagramme d’un flux de travail de scoring de recherche

Le diagramme suivant illustre une requête hybride qui appelle la recherche de mots clés et de vecteurs, avec un renforcement par le biais de profils de score et de classement sémantique.

Diagram of prefilters.

Une requête qui génère le flux de travail précédent peut ressembler à ceci :

POST https://{{search-service-name}}.search.windows.net/indexes/{{index-name}}/docs/search?api-version=2023-11-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"
}

Voir aussi