Delen via


Een hybride query maken in Azure AI Search

Hybride zoekopdracht combineert tekst (trefwoord) en vectorquery's in één zoekaanvraag. Alle subquery's in de aanvraag worden parallel uitgevoerd. De resultaten worden samengevoegd en opnieuw gerangschikt op nieuwe zoekscores, met behulp van Recimaal Rank Fusion (RRF) om een uniforme resultatenset te retourneren. In veel gevallen retourneren hybride query's met semantische classificatie per benchmarktest de meest relevante resultaten.

In dit artikel leert u het volgende:

  • Een basisaanvraag instellen
  • Hybride query's formuleren met meer parameters en filters
  • Relevantie verbeteren met behulp van semantische classificatie of vectorgewichten
  • Querygedrag optimaliseren door tekst- en vectorinvoer te beheren

Notitie

Nieuw in 2024-09-01-preview is de mogelijkheid om filters te richten op alleen de vectorsubquery's in een hybride aanvraag. Dit geeft u meer precisie over de wijze waarop filters worden toegepast. Zie doelfilters voor vectorsubquery's in dit artikel voor meer informatie.

Vereisten

Een API of hulpprogramma kiezen

Een hybride query instellen in Search Explorer

  1. Controleer in Search Explorer of de API-versie 2024-07-01 of een nieuwere preview-API-versie is.

  2. Selecteer onder Weergave de JSON-weergave, zodat u een vectorquery kunt plakken.

  3. Vervang de standaardquerysjabloon door een hybride query, zoals het voorbeeld 'Een hybride query uitvoeren' vanaf regel 539 in de vector quickstart. Voor de beknoptheid wordt de vector afgekapt in dit artikel.

    Een hybride query heeft een tekstquery opgegeven in searchen een vectorquery die is opgegeven onder vectorQueries.vector.

    De tekstquery en vectorquery kunnen gelijkwaardig of afwijkend zijn, maar het is gebruikelijk dat ze dezelfde intentie delen.

    {
        "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. Selecteer Zoeken.

Tip

Zoekresultaten zijn gemakkelijker te lezen als u de vectoren verbergt. Schakel in Queryopties vectorwaarden verbergen in de zoekresultaten in.

Hybride queryaanvraag (REST API)

Een hybride query combineert tekstzoekopdrachten en vectorzoekopdrachten, waarbij de search parameter een queryreeks gebruikt en vectorQueries.vector de vectorquery gebruikt. De zoekmachine voert parallel volledige tekst- en vectorquery's uit. De samenvoeging van alle overeenkomsten wordt geëvalueerd op relevantie met behulp van Wederzijdse Rank Fusion (RRF) en er wordt één resultatenset geretourneerd in het antwoord.

Resultaten worden geretourneerd in tekst zonder opmaak, inclusief vectoren in velden die zijn gemarkeerd als retrievable. Omdat numerieke vectoren niet nuttig zijn in zoekresultaten, kiest u andere velden in de index als proxy voor de vectorovereenkomst. Als een index bijvoorbeeld de velden descriptionVector en descriptionText bevat, kan de query overeenkomen met descriptionVector, maar in het zoekresultaat kan 'descriptionText' worden weergegeven. Gebruik de select parameter om alleen leesbare velden in de resultaten op te geven.

In het volgende voorbeeld ziet u een hybride queryconfiguratie.

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
}

Belangrijkste punten:

  • De vectorquerytekenreeks wordt opgegeven via de vectorQueries.vector eigenschap. De query wordt uitgevoerd op basis van het veld DescriptionVector. Ingesteld kind op vector om het querytype aan te geven. U kunt desgewenst true instellen exhaustive om een query uit te voeren op de volledige inhoud van het vectorveld.

  • Trefwoorden zoeken wordt opgegeven via search eigenschap. Het wordt parallel uitgevoerd met de vectorquery.

  • k bepaalt hoeveel overeenkomsten van dichtstbijzijnde buren worden geretourneerd door de vectorquery en wordt geleverd aan de RRF-ranker.

  • top bepaalt hoeveel overeenkomsten worden geretourneerd in het antwoord all-up. In dit voorbeeld bevat het antwoord 10 resultaten, ervan uitgaande dat er ten minste 10 overeenkomsten zijn in de samengevoegde resultaten.

Hybride zoekopdracht met filter

In dit voorbeeld wordt een filter toegevoegd dat wordt toegepast op de filterable niet-ctorvelden van de zoekindex.

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

Belangrijkste punten:

  • Filters worden toegepast op de inhoud van filterbare velden. In dit voorbeeld is het veld ParkingIncluded een Booleaanse waarde en wordt het gemarkeerd als filterable in het indexschema.

  • In hybride query's kunnen filters worden toegepast voordat query's worden uitgevoerd om het queryoppervlak te verminderen of na het uitvoeren van query's om resultaten te beperken. "preFilter" is de standaardwaarde. Als u wilt gebruiken postFilter, stelt u de filterverwerkingsmodus in, zoals in dit voorbeeld wordt weergegeven.

  • Wanneer u queryresultaten postfiltert, is het aantal resultaten mogelijk kleiner dan top-n.

Hybride zoekopdrachten met filters gericht op vectorsubquery's (preview)

Met 2024-09-01-preview kunt u een globaal filter op de zoekaanvraag overschrijven door een secundair filter toe te passen dat alleen gericht is op de vectorsubquery's in een hybride aanvraag.

Deze functie biedt nauwkeurige controle door ervoor te zorgen dat filters alleen invloed hebben op de zoekresultaten van vectoren, waardoor zoekresultaten op basis van trefwoorden niet worden beïnvloed.

Het doelfilter overschrijft het globale filter volledig, inclusief eventuele filters die worden gebruikt voor beveiligingsbeperkingen of georuimtelijke zoekopdrachten. In gevallen waarin globale filters vereist zijn, zoals beveiligingsbeperking, moet u deze filters expliciet opnemen in zowel het filter op het hoogste niveau als in elk vectorfilter om ervoor te zorgen dat beveiliging en andere beperkingen consistent worden afgedwongen.

Doelvectorfilters toepassen:

Hier volgt een voorbeeld van een hybride query waarmee een filteroverschrijven wordt toegevoegd. Het globale filter Rating gt 3 wordt tijdens runtime vervangen door de filterOvrride.

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
}

Ervan uitgaande dat u semantische ranker hebt ingeschakeld en uw indexdefinitie een semantische configuratie bevat, kunt u een query formuleren die vectorzoekopdrachten en trefwoordzoekopdrachten bevat, met semantische rangschikking over de samengevoegde resultatenset. Desgewenst kunt u bijschriften en antwoorden toevoegen.

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

Belangrijkste punten:

  • Semantische ranker accepteert maximaal 50 resultaten van het samengevoegde antwoord.

  • 'queryType' en 'semanticConfiguration' zijn vereist.

  • 'ondertiteling' en 'antwoorden' zijn optioneel. Waarden worden geëxtraheerd uit de exacte tekst in de resultaten. Er wordt alleen een antwoord geretourneerd als de resultaten inhoud bevatten met de kenmerken van een antwoord op de query.

Semantische hybride zoekopdracht met filter

Dit is de laatste query in de verzameling. Het is dezelfde semantische hybride query als in het vorige voorbeeld, maar met een 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"
}

Belangrijkste punten:

  • De filtermodus kan van invloed zijn op het aantal resultaten dat beschikbaar is voor de semantische reranker. Als best practice is het slim om de semantische rangschikking het maximum aantal documenten (50) te geven. Als voorfilters of postfilters te selectief zijn, kunt u de semantische rangschikking onderstrepen door deze minder dan 50 documenten te geven om mee te werken.

  • Voorfiltering wordt toegepast voordat de query wordt uitgevoerd. Als voorfilter het zoekgebied beperkt tot 100 documenten, wordt de vectorquery uitgevoerd via het veld DescriptionVector voor die 100 documenten, waardoor de k=50 beste overeenkomsten worden geretourneerd. Deze 50 overeenkomende documenten geven vervolgens door aan RRF voor samengevoegde resultaten en vervolgens aan semantische rangschikking.

  • Postfilter wordt toegepast na het uitvoeren van de query. Als k=50 50 overeenkomsten retourneert aan de vectorqueryzijde, wordt het postfilter toegepast op de 50 overeenkomsten, waardoor de resultaten worden verminderd die voldoen aan filtercriteria, zodat u minder dan 50 documenten hebt om door te geven aan de semantische rangschikking.

MaxTextRecallSize en countAndFacetMode instellen (preview)

In deze sectie wordt uitgelegd hoe u de invoer kunt aanpassen aan een hybride query door de hoeveelheid bm25-gerangschikte resultaten te beheren die naar het hybride classificatiemodel stromen. Controle over de BM25-gerangschikte invoer biedt u meer opties voor het afstemmen van relevantie in hybride scenario's.

U wordt aangeraden de preview-versie van REST API 2024-05-01-preview te bekijken.

Tip

Een andere optie om rekening mee te houden is een aanvullende of vervangende techniek, is vectorgewicht, waardoor het belang van vectorquery's in de aanvraag toeneemt.

  1. Gebruik Search - POST of Search - GET in 2024-05-01-preview om deze parameters op te geven.

  2. Voeg een hybridSearch queryparameterobject toe om het maximum aantal documenten in te stellen dat is teruggehaald via de bm25-gerangschikte resultaten van een hybride query. Het heeft twee eigenschappen:

    • maxTextRecallSize geeft het aantal BM25-gerangschikte resultaten op dat moet worden verstrekt aan de Rank Fusion -rangschikking (RRF) die wordt gebruikt in hybride query's. De standaardwaarde is 1000. Het maximum is 10.000.

    • countAndFacetMode rapporteert de tellingen voor de BM25-gerangschikte resultaten (en voor facetten als u ze gebruikt). De standaardwaarde is alle documenten die overeenkomen met de query. Optioneel kunt u het bereik 'aantal' opgegeven voor de maxTextRecallSize.

  3. Verminder maxTextRecallSize of het zoeken naar vector-overeenkomsten over het algemeen beter presteert dan de tekstzijde van de hybride query.

  4. Als maxTextRecallSize u een grote index hebt en de standaardwaarde onvoldoende resultaten vastlegt. Met een grotere BM25-gerangschikte resultatenset kunt u ook delen skipvan deze resultaten instellen topen next ophalen.

In de volgende REST-voorbeelden ziet u twee use cases voor het instellen maxTextRecallSize.

Het eerste voorbeeld vermindert maxTextRecallSize tot 100, waardoor de tekstzijde van de hybride query wordt beperkt tot slechts 100 documenten. Het stelt ook in countAndFacetMode dat alleen die resultaten van 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" 
      } 
    } 

Het tweede voorbeeld verwijst maxTextRecallSize naar 5000. Het maakt ook gebruik van top, skip en naast het ophalen van resultaten uit grote resultatensets. In dit geval haalt de aanvraag resultaten op in BM25 gerangschikte resultaten vanaf positie 1.500 tot en met 2.000 als de bijdrage van de tekstquery aan de samengestelde RRF-resultatenset.

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

Een queryantwoord configureren

Wanneer u de hybride query instelt, moet u nadenken over de antwoordstructuur. Het antwoord is een afgevlakte rijenset. Parameters voor de query bepalen welke velden zich in elke rij bevinden en hoeveel rijen het antwoord bevatten. De zoekmachine rangschikt de overeenkomende documenten en retourneert de meest relevante resultaten.

Velden in een antwoord

Zoekresultaten bestaan uit retrievable velden uit uw zoekindex. Een resultaat is:

  • Alle retrievable velden (standaard rest API).
  • Velden die expliciet worden vermeld in een 'select'-parameter in de query.

In de voorbeelden in dit artikel is een 'select'-instructie gebruikt om tekstvelden (nonvector) in het antwoord op te geven.

Notitie

Vectoren worden niet omgekeerd ontworpen in tekst die door mensen kan worden gelezen, dus vermijd dat ze in het antwoord worden geretourneerd. Kies in plaats daarvan niet-ctorvelden die representatief zijn voor het zoekdocument. Als de query bijvoorbeeld is gericht op een veld DescriptionVector, retourneert u een equivalent tekstveld als u er een hebt ('Beschrijving') in het antwoord.

Aantal resultaten

Een query kan overeenkomen met een willekeurig aantal documenten, zo veel als alle documenten als de zoekcriteria zwak zijn (bijvoorbeeld 'search=*' voor een null-query). Omdat het zelden praktisch is om niet-gebonden resultaten te retourneren, moet u een maximum opgeven voor het totale antwoord:

  • "top": n resultaten voor query's met alleen trefwoorden (geen vector)
  • "k": n resultaten voor query's met alleen vectoren
  • "top": n resultaten voor hybride query's (met of zonder semantisch) die een zoekparameter bevatten

Zowel k als top zijn optioneel. Niet opgegeven, het standaardaantal resultaten in een antwoord is 50. U kunt 'top' en 'overslaan' instellen op pagina's door meer resultaten of de standaardwaarde wijzigen.

Notitie

Als u hybride zoekopdrachten gebruikt in 2024-05-01-preview-API, kunt u het aantal resultaten van de trefwoordquery beheren met behulp van maxTextRecallSize. Combineer dit met een instelling voor 'k' om de weergave van elk zoeksubsysteem (trefwoord en vector) te beheren.

Semantische rangschikkingsresultaten

Notitie

De semantische ranker kan maximaal 50 resultaten in beslag nemen.

Als u een semantische ranker gebruikt in de API 2024-05-01-preview, is het een best practice om 'k' en 'maxTextRecallSize' in te stellen op ten minste 50 totalen. Vervolgens kunt u de geretourneerde resultaten beperken tot de gebruiker met de parameter 'top'.

Als u semantische ranker in eerdere API's gebruikt, gaat u als volgt te werk:

  • als zoeken met alleen trefwoorden (geen vector) 'top' instelt op 50
  • als hybride zoekopdrachten 'k' instellen op 50, om ervoor te zorgen dat de semantische ranker ten minste 50 resultaten krijgt.

Rangorde

Er worden meerdere sets gemaakt voor hybride query's, met of zonder de optionele semantische rerankering. De rangschikking van resultaten wordt berekend door Recimaal Rank Fusion (RRF).

In deze sectie vergelijkt u de antwoorden tussen zoeken met één vector en eenvoudige hybride zoekopdracht naar het bovenste resultaat. De verschillende classificatiealgoritmen, de overeenkomstwaarde van HNSW en RRF zijn in dit geval, produceren scores met verschillende grootten. Dit is zo ontworpen. RRF-scores kunnen behoorlijk laag lijken, zelfs met een overeenkomst met hoge overeenkomsten. Lagere scores zijn een kenmerk van het RRF-algoritme. In een hybride query met RRF worden meer van de wederkerigheid van de gerangschikte documenten opgenomen in de resultaten, gezien de relatief kleinere score van de geclassificeerde RRF-documenten, in plaats van pure vectorzoekopdrachten.

Single Vector Search: @search.score voor resultaten geordend op cosinus-gelijkenis (standaard vector vergelijkbaarheidsfunctie).

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

Hybride zoekopdracht: @search.score voor hybride resultaten gerangschikt met behulp van Wederzijdse Rank Fusion.

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

Volgende stappen

Als volgende stap raden we u aan de democode voor Python, C# of JavaScript te bekijken.