Share via


Skapa en hybridfråga i Azure AI Search

Hybridsökning kombinerar en eller flera nyckelordsfrågor med en eller flera vektorfrågor i en enda sökbegäran. Frågorna körs parallellt. Resultaten sammanfogas och sorteras om efter nya sökresultat, med hjälp av Reciprocal Rank Fusion (RRF) för att returnera en enda rangordnad resultatuppsättning.

I de flesta fall returnerar hybridfrågor med semantisk rangordning de mest relevanta resultaten per benchmark-tester.

Om du vill definiera en hybridfråga använder du REST API 2023-11-01, 2023-10-01-preview, 2024-03-01-preview, Search Explorer i Azure-portalen eller nyare versioner av Azure SDK:er.

Förutsättningar

Köra en hybridfråga i Search Explorer

  1. I Sökutforskaren kontrollerar du att API-versionen är 2023-10-01-preview eller senare.

  2. Under Visa väljer du JSON-vy.

  3. Ersätt standardfrågemallen med en hybridfråga, till exempel den som börjar på rad 539 för snabbstartsexemplet för vektorer. För korthet trunkeras vektorn i den här artikeln.

    En hybridfråga har en textfråga angiven i searchoch en vektorfråga som anges under vectorQueries.vector.

    Textfrågan och vektorfrågan ska vara likvärdiga eller åtminstone inte vara i konflikt. Om frågorna skiljer sig åt får du inte fördelen med hybrid.

    {
        "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
            }
        ]
    }
    
  4. Välj Sök.

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=2023-11-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
    }],
    "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". Ange kind till "vektor" för att ange frågetypen. Du kan också ange exhaustive 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=2023-11-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ända postFilteranger 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.

Förutsatt att du har aktiverat semantisk rangordning 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 bildtext och svar.

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}}
{
    "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 rangordning accepterar upp till 50 resultat från det sammanslagna svaret. Ange "k" och "top" till 50 för lika representation av båda frågorna.

  • "queryType" och "semanticConfiguration" krävs.

  • "bildtext" 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=2023-11-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 filterkriterierna, vilket ger dig färre än 50 dokument att skicka till semantisk rankning

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 svaret:

  • "k": n resultat för endast vektorfrågor
  • "top": n resultat för hybridfrågor 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.

Om du använder semantisk rangordning är det bästa praxis att ange både "k" och "top" till minst 50. Den semantiska rankern kan ta upp till 50 resultat. Genom att ange 50 för varje fråga får du samma representation från båda sökundersystemen.

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": "Old Carrabelle 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": "Old Carrabelle 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.