Relevantiescores in hybride zoekopdrachten met behulp van Recicimaal Rank Fusion (RRF)
Wederzijdse Rank Fusion (RRF) is een algoritme waarmee de zoekscores van meerdere, eerder gerangschikte resultaten worden geëvalueerd om een uniforme resultatenset te produceren. In Azure AI Search wordt RRF gebruikt wanneer er twee of meer query's parallel worden uitgevoerd. Elke query produceert een gerangschikte resultatenset en RRF wordt gebruikt om de classificaties samen te voegen en te homogeniseren in één resultatenset, geretourneerd in het queryantwoord. Voorbeelden van scenario's waarbij RRF altijd wordt gebruikt, zijn hybride zoekopdrachten en meerdere vectorquery's die gelijktijdig worden uitgevoerd.
RRF is gebaseerd op het concept van wederzijdse rang, wat de inverse is van de rang van het eerste relevante document in een lijst met zoekresultaten. Het doel van de techniek is om rekening te houden met de positie van de items in de oorspronkelijke rangschikkingen en hogere urgentie te geven aan items die in meerdere lijsten zijn gerangschikt. Dit kan helpen bij het verbeteren van de algehele kwaliteit en betrouwbaarheid van de uiteindelijke rangschikking, waardoor het nuttiger is voor de taak om meerdere geordende zoekresultaten te combineren.
Notitie
Nieuw in 2024-09-01-preview is de mogelijkheid om een RRF-geclassificeerde zoekscore te deconstrueren in de subscores van de onderdelen. Dit geeft u transparantie in de samenstelling van de all-up score. Zie zoekscores uitpakken (preview) in dit artikel voor meer informatie.
Hoe RRF-classificatie werkt
RRF werkt door de zoekresultaten van meerdere methoden te gebruiken, een wederzijdse classificatiescore toe te wijzen aan elk document in de resultaten en vervolgens de scores te combineren om een nieuwe classificatie te maken. Het concept is dat documenten die worden weergegeven op de bovenste posities op meerdere zoekmethoden waarschijnlijk relevanter zijn en hoger moeten worden gerangschikt in het gecombineerde resultaat.
Hier volgt een eenvoudige uitleg van het RRF-proces:
Verkrijg gerangschikte zoekresultaten van meerdere query's die parallel worden uitgevoerd.
Wijs wederzijdse rangschikkingsscores toe voor resultaat in elk van de gerangschikte lijsten. RRF genereert een nieuwe
@search.score
voor elke overeenkomst in elke resultatenset. Voor elk document in de zoekresultaten wijst de engine een wederzijdse rangschikkingsscore toe op basis van de positie in de lijst. De score wordt berekend als1/(rank + k)
, waarrank
bevindt zich de positie van het document in de lijst enk
is een constante, die experimenteel is waargenomen om het beste uit te voeren als deze is ingesteld op een kleine waarde zoals 60. Houd er rekening mee dat dezek
waarde een constante is in het RRF-algoritme en volledig gescheiden is van hetk
aantal dichtstbijzijnde buren.Scores combineren. Voor elk document somt de engine de wederzijdse classificatiescores op die zijn verkregen uit elk zoeksysteem, waardoor een gecombineerde score voor elk document wordt geproduceerd.
De engine rangschikt documenten op basis van gecombineerde scores en sorteert ze. De resulterende lijst is de gefuseerde classificatie.
Alleen velden die zijn gemarkeerd als searchable
in de index of searchFields
in de query, worden gebruikt voor scoren. Alleen velden die zijn gemarkeerd als retrievable
, of velden die zijn opgegeven in select
de query, worden geretourneerd in zoekresultaten, samen met hun zoekscore.
Parallelle queryuitvoering
RRF wordt gebruikt wanneer er meer dan één query wordt uitgevoerd. In de volgende voorbeelden ziet u querypatronen waarin parallelle uitvoering van query's plaatsvindt:
- Een volledige tekstquery, plus één vectorquery (eenvoudig hybride scenario), is gelijk aan twee queryuitvoeringen.
- Een volledige tekstquery, plus één vectorquery die gericht is op twee vectorvelden, is gelijk aan drie queryuitvoeringen.
- Een volledige-tekstquery, plus twee vectorquery's die gericht zijn op vijf vectorvelden, is gelijk aan 11 queryuitvoeringen
Scores in een hybride zoekresultaten
Wanneer de resultaten worden gerangschikt, @search.score
bevat de eigenschap de waarde die wordt gebruikt om de resultaten te ordenen. Scores worden gegenereerd door classificatiealgoritmen die per methode variëren. Elk algoritme heeft een eigen bereik en grootte.
In de volgende grafiek wordt de score-eigenschap geïdentificeerd die wordt geretourneerd voor elke overeenkomst, het algoritme en het bereik van scores voor elk algoritme voor relevantieclassificatie.
Zoekmethode | Parameter | Score-algoritme | Bereik |
---|---|---|---|
zoeken in volledige tekst | @search.score |
BM25-algoritme | Geen bovengrens. |
vector zoeken | @search.score |
HNSW-algoritme, met behulp van de metrische overeenkomst die is opgegeven in de HNSW-configuratie. | 0.333 - 1.00 (Cosinus), 0 tot 1 voor Euclidean en DotProduct. |
hybride zoekopdracht | @search.score |
RRF-algoritme | Bovengrens wordt gebonden door het aantal query's dat wordt gefuseerd, waarbij elke query een maximum van ongeveer 1 aan de RRF-score bijdraagt. Als u bijvoorbeeld drie query's samenvoegt, worden hogere RRF-scores geproduceerd dan als er slechts twee zoekresultaten worden samengevoegd. |
semantische rangschikking | @search.rerankerScore |
Semantische rangschikking | 0.00 - 4.00 |
Semantische classificatie vindt plaats nadat RRF resultaten heeft samengevoegd. De score (@search.rerankerScore
) wordt altijd afzonderlijk gerapporteerd in het queryantwoord. Semantische ranker kan volledige tekst en hybride zoekresultaten opnieuw rangschikken, ervan uitgaande dat deze resultaten velden bevatten met semantisch rijke inhoud. Het kan pure vectorquery's opnieuw rangordenen als de zoekdocumenten tekstvelden bevatten die semantisch relevante inhoud bevatten.
Een zoekscore uitpakken in subscores (preview)
Met 2024-09-01-preview kunt u een zoekscore deconstrueren om de subscores ervan weer te geven.
Voor vectorquery's kan deze informatie u helpen bij het bepalen van een geschikte waarde voor vectorgewichten of het instellen van minimale drempelwaarden.
Substrepingstekens ophalen:
Gebruik de nieuwste preview-versie van search documents REST API of een Azure SDK beta-pakket dat de functie biedt.
Wijzig een queryaanvraag, voeg een nieuwe
debug
parameterset toe aanvector
,semantic
als u semantische rangschikking gebruikt ofall
.
Hier volgt een voorbeeld van een hybride query die subscores retourneert in de foutopsporingsmodus:
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
}
Gewogen scores
Met 2024-07-01 en nieuwere preview-API-versies kunt u vectorquery's wegen om hun belang in een hybride query te vergroten of te verlagen.
Zoals u weet, kijkt de zoekmachine bij het berekenen van RRF voor een bepaald document naar de positie van dat document voor elke resultatenset waarin het wordt weergegeven. Stel dat een document wordt weergegeven in drie afzonderlijke zoekresultaten, waarbij de resultaten afkomstig zijn van twee vectorquery's en één tekst bm25-gerangschikte query. De positie van het document varieert in elk resultaat.
Overeenkomst gevonden | Positie in resultaten | @search.score | gewichtsvermenigvuldiger | @search.score (gewogen) |
---|---|---|---|---|
vectorresultaten één | positie 1 | 0.8383955 | 0,5 | 0.41919775 |
vectorresultaten twee | positie 5 | 0.81514114 | 2.0 | 1.63028228 |
BM25 resultaten | positie 10 | 0.8577363 | N.v.t. | 0.8577363 |
De positie van het document in elke resultatenset komt overeen met een initiële score, die wordt opgeteld om de uiteindelijke RRF-score voor dat document te maken.
Als u vectorgewichten toevoegt, worden de initiële scores onderworpen aan een gewichtsvermenigvuldiger die de score verhoogt of verlaagt. De standaardwaarde is 1,0, wat betekent dat er geen weging is en dat de initiële score wordt gebruikt als RRF-score. Als u echter een gewicht van 0,5 toevoegt, wordt de score verlaagd en wordt dat resultaat minder belangrijk in de gecombineerde rangschikking. Als u daarentegen een gewicht van 2,0 toevoegt, wordt de score een grotere factor in de algehele RRF-score.
In dit voorbeeld worden de @search.score (gewogen) waarden doorgegeven aan het RRF-classificatiemodel.
Aantal gerangschikte resultaten in een hybride queryantwoord
Als u geen paginering gebruikt, retourneert de zoekmachine standaard de top 50 hoogste rangschikkingsovereenkomsten voor zoeken in volledige tekst en de meest vergelijkbare k
overeenkomsten voor vectorzoekopdrachten. In een hybride query top
bepaalt u het aantal resultaten in het antwoord. Op basis van de standaardinstellingen worden de top 50 hoogste gerangschikte overeenkomsten van de gecombineerde resultatenset geretourneerd.
Vaak vindt de zoekmachine meer resultaten dan top
en k
. Als u meer resultaten wilt retourneren, gebruikt u de pagingparameters top
en skip
next
. Paging is hoe u het aantal resultaten op elke logische pagina bepaalt en door de volledige nettolading navigeert. U kunt instellen maxTextRecallSize
op grotere waarden (de standaardwaarde is 1000) om meer resultaten te retourneren van de tekstzijde van de hybride query.
Standaard is zoeken in volledige tekst onderhevig aan een maximumlimiet van 1000 overeenkomsten (zie API-antwoordlimieten). Zodra er 1000 overeenkomsten zijn gevonden, zoekt de zoekmachine niet meer naar meer.
Zie Hoe u met zoekresultaten kunt werken voor meer informatie.
Diagram van een werkstroom voor het scoren van zoekopdrachten
Het volgende diagram illustreert een hybride query die trefwoorden en vectorzoekopdrachten aanroept, met een boost door middel van scoreprofielen en semantische rangschikking.
Een query die de vorige werkstroom genereert, kan er als volgt uitzien:
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"
}