Skapa en hybridfråga i Azure AI Search
Hybridsökning kombinerar text (nyckelord) och vektorfrågor i en enda sökbegäran. Alla underfrågor i begäran körs parallellt. Resultaten sammanfogas och sorteras om efter nya sökpoäng, med hjälp av Reciprocal Rank Fusion (RRF) för att returnera en enhetlig resultatuppsättning. I många fall returnerar hybridfrågor med semantisk rangordning de mest relevanta resultaten per benchmark-tester.
I den här artikeln lär du dig att:
- Konfigurera en grundläggande begäran
- Formulera hybridfrågor med fler parametrar och filter
- Förbättra relevansen med hjälp av semantisk rangordning eller vektorvikter
- Optimera frågebeteenden genom att styra text- och vektorindata
Kommentar
Nytt i 2024-09-01-preview är möjligheten att rikta filter till bara vektorunderfrågorna i en hybridbegäran. Detta ger dig mer precision över hur filter tillämpas. Mer information finns i rikta filter till vektorunderfrågor i den här artikeln.
Förutsättningar
Ett sökindex som innehåller
searchable
vektor- och icke-bevektorfält. Vi rekommenderar guiden Importera och vektorisera data för att snabbt skapa ett index. I annat fall kan du läsa Skapa ett index och Lägga till vektorfält i ett sökindex.(Valfritt) Om du vill ha den semantiska rankaren måste söktjänsten vara Basic-nivå eller högre, med semantisk rankning aktiverat.
(Valfritt) Om du vill ha inbyggd text-till-vektorkonvertering av en frågesträng skapar och tilldelar du en vektoriserare till vektorfält i sökindexet.
Välj ett API eller verktyg
Sökutforskaren i Azure Portal (stöder både api-söksyntax för stabil och förhandsversion) har en JSON-vy som gör att du kan klistra in en hybridbegäran.
Stabil version av 2024-07-01 eller en ny förhandsversion av API:et om du använder förhandsversionsfunktioner som maxTextRecallSize och countAndFacetMode(förhandsversion).
För läsbarhet använder vi REST-exempel för att förklara hur API:erna fungerar. Du kan använda en REST-klient som Visual Studio Code med REST-tillägget för att skapa hybridfrågor. Mer information finns i Snabbstart: Vektorsökning med rest-API:er.
Nyare stabila eller betapaket för Azure SDK:er (se ändringsloggar för SDK-funktionsstöd).
Konfigurera en hybridfråga i Search Explorer
I Sökutforskaren kontrollerar du att API-versionen är 2024-07-01 eller en nyare förhandsversion av API:et.
Under Visa väljer du JSON-vy så att du kan klistra in en vektorfråga.
Ersätt standardfrågemallen med en hybridfråga, till exempel exemplet "Kör en hybridfråga" som börjar på rad 539 i snabbstarten för vektor. För korthet trunkeras vektorn i den här artikeln.
En hybridfråga har en textfråga angiven i
search
och en vektorfråga som anges undervectorQueries.vector
.Textfrågan och vektorfrågan kan vara likvärdiga eller avvikande, men det är vanligt att de delar samma avsikt.
{ "count": true, "search": "historic hotel walk to restaurants and shopping", "select": "HotelId, HotelName, Category, Tags, Description", "top": 7, "vectorQueries": [ { "vector": [0.01944167, 0.0040178085, -0.007816401 ... <remaining values omitted> ], "k": 7, "fields": "DescriptionVector", "kind": "vector", "exhaustive": true } ] }
Välj Sök.
Dricks
Sökresultat är lättare att läsa om du döljer vektorerna. I Frågealternativ aktiverar du Dölj vektorvärden i sökresultat.
Hybridfrågebegäran (REST API)
En hybridfråga kombinerar textsökning och vektorsökning, där parametern search
tar en frågesträng och vectorQueries.vector
tar vektorfrågan. Sökmotorn kör fullständiga text- och vektorfrågor parallellt. Union av alla matchningar utvärderas för relevans med hjälp av Reciprocal Rank Fusion (RRF) och en enda resultatuppsättning returneras i svaret.
Resultaten returneras i oformaterad text, inklusive vektorer i fält som är markerade som retrievable
. Eftersom numeriska vektorer inte är användbara i sökresultat väljer du andra fält i indexet som proxy för vektormatchningen. Om ett index till exempel har fälten "descriptionVector" och "descriptionText" kan frågan matchas på "descriptionVector", men sökresultatet kan visa "descriptionText". Använd parametern select
för att endast ange fält som kan läsas av människor i resultatet.
I följande exempel visas en hybridfrågekonfiguration.
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}}
{
"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",
"top": 10
}
Viktiga punkter:
Vektorfrågesträngen anges via egenskapen
vectorQueries.vector
. Frågan körs mot fältet "DescriptionVector". Angekind
till "vektor" för att ange frågetypen. Du kan också angeexhaustive
true för att fråga det fullständiga innehållet i vektorfältet.Nyckelordssökning anges via
search
egenskapen . Den körs parallellt med vektorfrågan.k
avgör hur många närmaste grannmatchningar som returneras från vektorfrågan och tillhandahålls till RRF-rankaren.top
avgör hur många matchningar som returneras i svarets all-up. I det här exemplet innehåller svaret 10 resultat, förutsatt att det finns minst 10 matchningar i de sammanslagna resultaten.
Hybridsökning med filter
Det här exemplet lägger till ett filter som tillämpas på fälten filterable
som inte används i sökindexet.
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}}
{
"vectorQueries": [
{
"vector": [
-0.009154141,
0.018708462,
. . .
-0.02178128,
-0.00086512347
],
"fields": "DescriptionVector",
"kind": "vector",
"k": 10
}
],
"search": "historic hotel walk to restaurants and shopping",
"vectorFilterMode": "postFilter",
"filter": "ParkingIncluded",
"top": "10"
}
Viktiga punkter:
Filter tillämpas på innehållet i filterbara fält. I det här exemplet är fältet ParkingIncluded ett booleskt värde och markeras som
filterable
i indexschemat.I hybridfrågor kan filter användas före frågekörning för att minska frågeytan eller efter frågekörningen för att trimma resultaten.
"preFilter"
används som standard. Om du vill användapostFilter
anger du filtrets bearbetningsläge enligt det som visas i det här exemplet.När du postfiltrera frågeresultat kan antalet resultat vara mindre än top-n.
Hybridsökning med filter för vektorunderfrågor (förhandsversion)
Med 2024-09-01-preview kan du åsidosätta ett globalt filter på sökbegäran genom att använda ett sekundärt filter som bara riktar sig mot vektorunderfrågorna i en hybridbegäran.
Den här funktionen ger detaljerad kontroll genom att säkerställa att filter endast påverkar vektorsökningsresultaten, vilket gör att nyckelordsbaserade sökresultat inte påverkas.
Det riktade filtret åsidosätter helt det globala filtret, inklusive eventuella filter som används för säkerhetstrimning eller geospatial sökning. I de fall där globala filter krävs, till exempel säkerhetstrimning, måste du uttryckligen inkludera dessa filter i både toppnivåfiltret och i varje filter på vektornivå för att säkerställa att säkerhet och andra begränsningar tillämpas konsekvent.
Så här använder du riktade vektorfilter:
Använd det senaste rest-API:et för förhandsgranskningsdokument eller ett Azure SDK-betapaket som tillhandahåller funktionen.
Ändra en frågebegäran och lägg till en ny
vectorQueries.filterOverride
parameteruppsättning i ett OData-filteruttryck.
Här är ett exempel på hybridfråga som lägger till en åsidosättning av filter. Det globala filtret "Rating gt 3" ersätts vid körning av filtretOvrride.
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,
"filterOverride": "Address/City eq 'Seattle'",
"k": 10
}
],
"search": "historic hotel walk to restaurants and shopping",
"select": "HotelName, Description, Address/City, Rating",
"filter": "Rating gt 3"
"debug": "vector",
"top": 10
}
Semantisk hybridsökning
Förutsatt att du har aktiverat semantisk rankning och indexdefinitionen innehåller en semantisk konfiguration kan du formulera en fråga som innehåller vektorsökning och nyckelordssökning, med semantisk rangordning över den sammanslagna resultatuppsättningen. Du kan också lägga till bildtexter och svar.
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}}
{
"vectorQueries": [
{
"vector": [
-0.009154141,
0.018708462,
. . .
-0.02178128,
-0.00086512347
],
"fields": "DescriptionVector",
"kind": "vector",
"k": 50
}
],
"search": "historic hotel walk to restaurants and shopping",
"select": "HotelName, Description, Tags",
"queryType": "semantic",
"semanticConfiguration": "my-semantic-config",
"captions": "extractive",
"answers": "extractive",
"top": "50"
}
Viktiga punkter:
Semantisk ranker accepterar upp till 50 resultat från det sammanslagna svaret.
"queryType" och "semanticConfiguration" krävs.
"bildtexter" och "svar" är valfria. Värden extraheras från ordagrann text i resultatet. Ett svar returneras endast om resultatet innehåller innehåll med egenskaperna för ett svar på frågan.
Semantisk hybridsökning med filter
Här är den sista frågan i samlingen. Det är samma semantiska hybridfråga som i föregående exempel, men med ett filter.
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}}
{
"vectorQueries": [
{
"vector": [
-0.009154141,
0.018708462,
. . .
-0.02178128,
-0.00086512347
],
"fields": "DescriptionVector",
"kind": "vector",
"k": 50
}
],
"search": "historic hotel walk to restaurants and shopping",
"select": "HotelName, Description, Tags",
"queryType": "semantic",
"semanticConfiguration": "my-semantic-config",
"captions": "extractive",
"answers": "extractive",
"filter": "ParkingIsIncluded'",
"vectorFilterMode": "postFilter",
"top": "50"
}
Viktiga punkter:
Filterläget kan påverka antalet resultat som är tillgängliga för den semantiska rerankern. Som bästa praxis är det smart att ge den semantiska rankaren det maximala antalet dokument (50). Om förfilter eller postfilter är för selektiva kan du undertjäna den semantiska rankern genom att ge den färre än 50 dokument att arbeta med.
Förfiltrering tillämpas före frågekörning. Om förfilter minskar sökområdet till 100 dokument körs vektorfrågan över fältet "DescriptionVector" för dessa 100 dokument och returnerar de bästa matchningarna för k=50. Dessa 50 matchande dokument skickas sedan till RRF för sammanslagna resultat och sedan till semantisk ranker.
Postfilter tillämpas efter frågekörning. Om k=50 returnerar 50 matchningar på vektorfrågesidan tillämpas postfiltret på de 50 matchningarna, vilket minskar resultatet som uppfyller filtervillkoren, vilket gör att du får färre än 50 dokument att skicka till semantisk rankning.
Ange maxTextRecallSize och countAndFacetMode (förhandsversion)
I det här avsnittet beskrivs hur du justerar indata till en hybridfråga genom att kontrollera mängden BM25-rankade resultat som flödar till hybridrankningsmodellen. Om du styr över BM25-rankade indata får du fler alternativ för relevansjustering i hybridscenarier.
Vi rekommenderar förhandsversion av REST API version 2024-05-01-preview.
Dricks
Ett annat alternativ att överväga är en kompletterande eller ersättningsteknik, är vektorviktning, vilket ökar vikten av vektorfrågor i begäran.
Använd Search – POST eller Search – GET in 2024-05-01-preview för att ange dessa parametrar.
Lägg till ett
hybridSearch
frågeparameterobjekt för att ange det maximala antalet dokument som återkallas via BM25-rankade resultat för en hybridfråga. Den har två egenskaper:maxTextRecallSize
anger antalet BM25-rankade resultat som ska tillhandahållas till RRF-rankningen (Reciprocal Rank Fusion) som används i hybridfrågor. Standardvärdet är 1 000. Maxvärdet är 10 000.countAndFacetMode
rapporterar antalet för BM25-rankade resultat (och för fasetter om du använder dem). Standardvärdet är alla dokument som matchar frågan. Du kan också omfånget "count" tillmaxTextRecallSize
.
Minska
maxTextRecallSize
om vektorlikhetssökning vanligtvis överträffar textsidan i hybridfrågan.Öka
maxTextRecallSize
om du har ett stort index och standardvärdet inte samlar in tillräckligt många resultat. Med en större BM25-rankad resultatuppsättning kan du också angetop
,skip
ochnext
hämta delar av dessa resultat.
Följande REST-exempel visar två användningsfall för att ange maxTextRecallSize
.
Det första exemplet minskar maxTextRecallSize
till 100, vilket begränsar textsidan i hybridfrågan till bara 100 dokument. Den anger countAndFacetMode
också att endast dessa resultat ska inkluderas från maxTextRecallSize
.
POST https://[service-name].search.windows.net/indexes/[index-name]/docs/search?api-version=2024-05-01-Preview
{
"vectorQueries": [
{
"kind": "vector",
"vector": [1.0, 2.0, 3.0],
"fields": "my_vector_field",
"k": 10
}
],
"search": "hello world",
"hybridSearch": {
"maxTextRecallSize": 100,
"countAndFacetMode": "countRetrievableResults"
}
}
Det andra exemplet höjs maxTextRecallSize
till 5 000. Den använder också top, skip och bredvid för att hämta resultat från stora resultatuppsättningar. I det här fallet hämtar begäran in BM25-rankade resultat från position 1 500 till 2 000 som textfrågasbidraget till RRF:s sammansatta resultatuppsättning.
POST https://[service-name].search.windows.net/indexes/[index-name]/docs/search?api-version=2024-05-01-Preview
{
"vectorQueries": [
{
"kind": "vector",
"vector": [1.0, 2.0, 3.0],
"fields": "my_vector_field",
"k": 10
}
],
"search": "hello world",
"top": 500,
"skip": 1500,
"next": 500,
"hybridSearch": {
"maxTextRecallSize": 5000,
"countAndFacetMode": "countRetrievableResults"
}
}
Konfigurera ett frågesvar
När du konfigurerar hybridfrågan bör du tänka på svarsstrukturen. Svaret är en utplattad raduppsättning. Parametrar i frågan avgör vilka fält som finns på varje rad och hur många rader som finns i svaret. Sökmotorn rangordnar matchande dokument och returnerar de mest relevanta resultaten.
Fält i ett svar
Sökresultaten består av retrievable
fält från ditt sökindex. Ett resultat är antingen:
- Alla
retrievable
fält (standardvärdet rest-API). - Fält som uttryckligen anges i parametern "select" i frågan.
Exemplen i den här artikeln använde en "select"-instruktion för att ange textfält (nonvector) i svaret.
Kommentar
Vektorer är inte bakåtkompilerade i mänsklig läsbar text, så undvik att returnera dem i svaret. Välj i stället icke-bevektorfält som är representativa för sökdokumentet. Om frågan till exempel riktar sig mot ett "DescriptionVector"-fält returnerar du ett motsvarande textfält om du har ett ("Beskrivning") i svaret.
Antal resultat
En fråga kan matcha valfritt antal dokument, så många som alla om sökvillkoren är svaga (till exempel "search=*" för en null-fråga). Eftersom det sällan är praktiskt att returnera obundna resultat bör du ange ett maxvärde för det övergripande svaret:
"top": n
resultat för frågor med enbart nyckelord (ingen vektor)"k": n
resultat för endast vektorfrågor"top": n
resultat för hybridfrågor (med eller utan semantik) som innehåller en sökparameter
Både "k" och "top" är valfria. Ospecificerat är standardantalet resultat i ett svar 50. Du kan ange "top" och "skip" för att gå igenom fler resultat eller ändra standardvärdet.
Kommentar
Om du använder hybridsökning i API:et 2024-05-01-preview kan du styra antalet resultat från nyckelordsfrågan med hjälp av maxTextRecallSize. Kombinera detta med en inställning för "k" för att styra representationen från varje sökundersystem (nyckelord och vektor).
Semantiska rankerresultat
Kommentar
Den semantiska rankern kan ta upp till 50 resultat.
Om du använder semantisk ranker i API:et för förhandsversionen 2024-05-01 är det bästa praxis att ange "k" och "maxTextRecallSize" för att summera till minst 50 totalt. Du kan sedan begränsa de resultat som returneras till användaren med parametern "top".
Om du använder semantisk rankning i tidigare API:er gör du följande:
- om du gör sökning med enbart nyckelord (ingen vektor) anger du "top" till 50
- om du gör hybridsökningsuppsättningen "k" till 50, för att säkerställa att den semantiska rankern får minst 50 resultat.
Rangordning
Flera uppsättningar skapas för hybridfrågor, med eller utan den valfria semantiska omrankningen. Rankning av resultat beräknas av Reciprocal Rank Fusion (RRF).
I det här avsnittet jämför du svaren mellan enkel vektorsökning och enkel hybridsökning för det översta resultatet. De olika rangordningsalgoritmerna, HNSW:s likhetsmått och RRF, ger i det här fallet poäng som har olika storlek. Detta beteende är av design. RRF-poäng kan verka ganska låga, även med en hög likhetsmatchning. Lägre poäng är en egenskap hos RRF-algoritmen. I en hybridfråga med RRF inkluderas mer av reciprocalen för de rankade dokumenten i resultaten, med tanke på den relativt mindre poängen för RRF-rankade dokument, i motsats till ren vektorsökning.
Enkel vektorsökning: @search.score för resultat ordnade efter cosinélikhet (standardfunktion för vektorlikhetsavstånd).
{
"@search.score": 0.8399121,
"HotelId": "49",
"HotelName": "Swirling Currents Hotel",
"Description": "Spacious rooms, glamorous suites and residences, rooftop pool, walking access to shopping, dining, entertainment and the city center.",
"Category": "Luxury",
"Address": {
"City": "Arlington"
}
}
Hybridsökning: @search.score för hybridresultat som rangordnas med reciprokal rankningsfusion.
{
"@search.score": 0.032786883413791656,
"HotelId": "49",
"HotelName": "Swirling Currents Hotel",
"Description": "Spacious rooms, glamorous suites and residences, rooftop pool, walking access to shopping, dining, entertainment and the city center.",
"Category": "Luxury",
"Address": {
"City": "Arlington"
}
}
Nästa steg
Som ett nästa steg rekommenderar vi att du granskar demokoden för Python, C# eller JavaScript.