Dela via


Skapa en hybridfråga i Azure AI Search

Hybridsökning kombinerar en eller flera textfrågor (nyckelord) 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ö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.

För att förbättra relevansen:

  • Nya parametrar maxTextRecallSize och countAndFacetMode(förhandsversion) ger dig mer kontroll över textinmatningar i en hybridfråga.

  • Med ny vektorviktning kan du ange den relativa vikten för vektorfrågan. Den här funktionen är särskilt användbar i komplexa frågor där två eller flera distinkta resultatuppsättningar måste kombineras, vilket är fallet för hybridsökning.

Förutsättningar

Välj ett API eller verktyg

  • Stabil version 2023-11-01
  • 2023-10-01-preview, lägger till integrerad vektorisering på vektorsidan av en hybridfråga
  • 2024-03-01-preview, lägger till smala datatyper och skalär kvantisering på vektorsidan av en hybridfråga
  • 2024-05-01-preview lägger till maxTextRecallSize och countAndFacetMode specifially för hybridsökning
  • Sökutforskaren i Azure-portalen (mål för 2024-05-01-preview-beteenden)
  • Nyare stabila eller betapaket för Azure SDK:er (se ändringsloggar för SDK-funktionsstöd)

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
        },
        {
            "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 bildtexter 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.

  • "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=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 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.

Dricks

Ett annat alternativ att överväga är en kompletterande eller ersättningsteknik, är vektorviktning, vilket ökar vikten av vektorfrågor i begäran.

  1. Använd Search – POST eller Search – GET in 2024-05-01-preview för att ange dessa parametrar.

  2. 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" till maxTextRecallSize.

  3. Minska maxTextRecallSize om vektorlikhetssökning vanligtvis överträffar textsidan i hybridfrågan.

  4. Ö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å ange top, skipoch next 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 rangordning i API:et 2024-05-01-preview ä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 rangordning 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": "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.