Partager via


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 IA Azure, RRF est utilisé lorsque deux requêtes ou plus s’exécutent en parallèle. À savoir, pour les requêtes hybrides et pour plusieurs requêtes vectorielles. Chaque requête individuelle produit un jeu de résultats classé, et RRF fusionne et homogénéise les classements en un seul jeu de résultats pour la réponse de la requête.

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 tenir compte de 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. Cette approche peut aider à améliorer la qualité globale et la fiabilité du classement final, ce qui en fait 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 exécutées 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. Les expériences montrent que l’algorithme fonctionne le mieux lorsque vous définissez k sur une petite valeur, telle que 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 renvoyés dans les résultats de recherche avec 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, sont égales à 11 exécutions de requête.

Scores dans les résultats de recherche hybride

Chaque fois que les résultats sont classés, la @search.score propriété 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. Pour plus d’informations et un diagramme du flux de travail d'évaluation, consultez Azure AI Search : Pertinence.

Méthode de recherche Parameter Algorithme de scoring Range
recherche en texte intégral @search.score Algorithme BM25 Pas de limite supérieure.
vector search @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/k au score RRF (il s’agit du k paramètre de l’algorithme RRF, et non de la requête vectorielle). Par exemple, la fusion de trois requêtes génère des scores RRF plus élevés que si seuls deux résultats de recherche sont fusionnés.
classement sémantique @search.rerankerScore Classement sémantique 0.00 - 4.00

Le classement sémantique se produit après la fusion RRF des résultats. Son score (@search.rerankerScore) est toujours signalé séparément dans la réponse de requête. Le classeur sémantique peut reclasser les résultats de la recherche en texte intégral et de la recherche hybride, en supposant que ces résultats incluent des champs ayant du contenu riche sémantiquement. Il peut reclasser des requêtes vectorielles pures si les documents de recherche incluent des champs de texte dont le contenu est sémantiquement pertinent.

Décompresser un score de recherche en sous-scores

Vous pouvez déconstructer un score de recherche pour afficher ses sous-scores. Pour les requêtes vectorielles, ces informations peuvent vous aider à déterminer une valeur appropriée pour la pondération de vecteurs ou les seuils minimaux de paramètre.

Pour obtenir des sous-scores :

  • Utilisez l’API REST de recherche de documents ou un package SDK Azure qui offre cette fonctionnalité.

  • Modifiez une demande de requête en ajoutant un nouveau paramètre debug défini sur vector ou semantic si vous utilisez un classeur sémantique, ou all.

Voici un exemple de requête hybride qui renvoie des sous-scores en mode débogage :

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

{
    "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
}

Scores pondérés

Vous pouvez également pondérationr les requêtes vectorielles pour augmenter ou diminuer leur importance dans une requête hybride.

Rappelez-vous que lorsque vous calculez le RRF pour un certain document, le moteur de recherche examine le rang de ce document pour chaque jeu de résultats où il apparaît. Supposons qu’un document apparaît dans trois résultats de recherche distincts, où les résultats proviennent de deux requêtes vectorielles et d’une requête de classement BM25 textuelle. La position du document varie dans chaque résultat.

Correspondance trouvée Position dans les résultats @search.score multiplicateur de pondération @search.score (pondéré)
résultats vectoriels un Position 1 0.8383955 0.5 0.41919775
résultats vectoriels deux Position 5 0.81514114 2.0 1.63028228
Résultats BM25 position 10 0.8577363 NA 0.8577363

La position du document dans chaque jeu de résultats correspond à un score initial. Ce score est ajouté pour créer le score RRF final pour ce document.

Si vous ajoutez une pondération vectorielle, les scores initiaux sont soumis à un multiplicateur de pondération qui augmente ou diminue le score. La valeur par défaut est 1,0, ce qui signifie qu’aucune pondération n’est appliquée et que le score initial est utilisé tel quel dans le scoring RRF. Toutefois, si vous ajoutez une pondération de 0,5, le score est réduit et ce résultat devient moins important dans le classement combiné. À l’inverse, si vous ajoutez un poids de 2,0, le score devient un facteur plus important dans le score RRF global.

Dans cet exemple, les @search.score valeurs (pondérées) vont au modèle de classement RRF.

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 les plus similaires k 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. Vous pouvez définir maxTextRecallSize sur des valeurs plus grandes (la valeur par défaut est de 1 000) pour retourner davantage de résultats depuis le côté texte de la requête hybride.

Par défaut, la recherche en texte intégral est soumise à une limite maximale de 1 000 correspondances (voir les 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.