Dela via


Relevansbedömning i hybridsökning med hjälp av Reciprocal Rank Fusion (RRF)

Reciprocal Rank Fusion (RRF) är en algoritm som utvärderar sökpoängen från flera tidigare rankade resultat för att skapa en enhetlig resultatuppsättning. I Azure AI Search används RRF när det finns två eller flera frågor som körs parallellt. Varje fråga genererar en rangordnad resultatuppsättning och RRF används för att sammanfoga och homogenisera rankningen till en enda resultatuppsättning som returneras i frågesvaret. Exempel på scenarier där RRF alltid används är hybridsökning och flera vektorfrågor som körs samtidigt.

RRF baseras på begreppet ömsesidig rangordning, vilket är invertering av rangordningen för det första relevanta dokumentet i en lista över sökresultat. Målet med tekniken är att ta hänsyn till positionen för objekten i den ursprungliga rangordningen och ge högre prioritet åt objekt som rangordnas högre i flera listor. Detta kan bidra till att förbättra den slutliga rankningens övergripande kvalitet och tillförlitlighet, vilket gör det mer användbart för uppgiften att hitta flera ordnade sökresultat.

Så här fungerar RRF-rankning

RRF fungerar genom att ta sökresultaten från flera metoder, tilldela ett ömsesidigt rangresultat till varje dokument i resultaten och sedan kombinera poängen för att skapa en ny rangordning. Konceptet är att dokument som visas på de översta positionerna över flera sökmetoder sannolikt är mer relevanta och bör rangordnas högre i det kombinerade resultatet.

Här är en enkel förklaring av RRF-processen:

  1. Hämta rankade sökresultat från flera frågor som körs parallellt.

  2. Tilldela ömsesidiga rankningspoäng för resultat i var och en av de rankade listorna. RRF genererar en ny @search.score för varje matchning i varje resultatuppsättning. För varje dokument i sökresultaten tilldelar motorn en ömsesidig rankningspoäng baserat på dess position i listan. Poängen beräknas som 1/(rank + k), där rank är dokumentets position i listan och k är en konstant, som observerades experimentellt för att prestera bäst om det är inställt på ett litet värde som 60. Observera att det här k värdet är en konstant i RRF-algoritmen och helt separat från det k som styr antalet närmaste grannar.

  3. Kombinera poäng. För varje dokument summerar motorn de ömsesidiga rankningspoäng som erhålls från varje söksystem, vilket ger en kombinerad poäng för varje dokument. 

  4. Motorn rangordnar dokument baserat på kombinerade poäng och sorterar dem. Den resulterande listan är den sammansvetsade rangordningen.

Endast fält som är markerade som searchable i indexet eller searchFields i frågan används för bedömning. Endast fält som har markerats som retrievable, eller fält som anges i select frågan, returneras i sökresultaten, tillsammans med deras sökpoäng.

Parallell frågekörning

RRF används när det finns fler än en frågekörning. Följande exempel illustrerar frågemönster där parallell frågekörning sker:

  • En fulltextfråga plus en vektorfråga (enkelt hybridscenario) är lika med två frågekörningar.
  • En fulltextfråga, plus en vektorfråga som riktar sig mot två vektorfält, är lika med tre frågekörningar.
  • En fulltextfråga, plus två vektorfrågor som riktar sig mot fem vektorfält, är lika med 11 frågekörningar

Poäng i hybridsökresultat

När resultaten rangordnas @search.score innehåller egenskapen det värde som används för att sortera resultaten. Poängen genereras av rangordningsalgoritmer som varierar för varje metod. Varje algoritm har sitt eget intervall och storlek.

Följande diagram identifierar den bedömningsegenskap som returneras för varje matchning, algoritm och poängintervall för varje relevansrankningsalgoritm.

Sökmetod Parameter Bedömningsalgoritm Intervall
fulltextsökning @search.score BM25-algoritm Ingen övre gräns.
vektorsökning @search.score HNSW-algoritm med hjälp av likhetsmåttet som anges i HNSW-konfigurationen. 0.333 - 1.00 (Cosinus), 0 till 1 för Euclidean och DotProduct.
hybridsökning @search.score RRF-algoritm Den övre gränsen begränsas av antalet frågor som sammansvetsas, där varje fråga bidrar med högst cirka 1 till RRF-poängen. Till exempel skulle sammanslagning av tre frågor ge högre RRF-poäng än om endast två sökresultat slås samman.
semantisk rangordning @search.rerankerScore Semantisk rankning 0.00 - 4.00

Semantisk rankning deltar inte i RRF. Dess poäng (@search.rerankerScore) rapporteras alltid separat i frågesvaret. Semantisk rangordning kan ändra storlek på fulltext och hybridsökresultat, förutsatt att dessa resultat inkluderar fält med semantiskt omfattande innehåll.

Antal rankade resultat i ett hybridfrågesvar

Om du inte använder sidnumrering returnerar sökmotorn som standard de 50 högst rankade matchningarna för fulltextsökning och de mest liknande k matchningarna för vektorsökning. I en hybridfråga top avgör du antalet resultat i svaret. Baserat på standardvärden returneras de 50 högst rankade matchningarna i den enhetliga resultatuppsättningen.

Ofta hittar sökmotorn fler resultat än top och k. Om du vill returnera fler resultat använder du växlingsparametrarna top, skipoch next. Växling är hur du fastställer antalet resultat på varje logisk sida och navigerar genom den fullständiga nyttolasten.

Fulltextsökning omfattas av en maximal gräns på 1 000 matchningar (se API-svarsgränser). När 1 000 matchningar har hittats letar sökmotorn inte längre efter fler.

Mer information finns i Så här arbetar du med sökresultat.

Diagram över ett arbetsflöde för sökbedömning

Följande diagram illustrerar en hybridfråga som anropar nyckelords- och vektorsökning, med ökad poängsättningsprofiler och semantisk rangordning.

Diagram of prefilters.

En fråga som genererar det tidigare arbetsflödet kan se ut så här:

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

Se även