Een hybride query maken in Azure AI Search

Hybride zoekopdrachten combineren een of meer trefwoordquery's met een of meer vectorquery's in één zoekaanvraag. De query's worden parallel uitgevoerd. De resultaten worden samengevoegd en opnieuw gerangschikt op nieuwe zoekscores, met behulp van Wederzijdse Rank Fusion (RRF) om één gerangschikte resultatenset te retourneren.

In de meeste gevallen retourneren hybride query's met semantische classificatie de meest relevante resultaten per benchmarktest.

Als u een hybride query wilt definiëren, gebruikt u REST API 2023-11-01, 2023-10-01-preview, 2024-03-01-preview, Search Explorer in Azure Portal of nieuwere versies van de Azure SDK's.

Vereisten

Een hybride query uitvoeren in Search Explorer

  1. Controleer in Search Explorer of de API-versie 2023-10-01-preview of hoger is.

  2. Selecteer onder Weergave de JSON-weergave.

  3. Vervang de standaardquerysjabloon door een hybride query, zoals de sjabloon die begint op regel 539 voor het voorbeeld van de vector quickstart. Voor de beknoptheid wordt de vector afgekapt in dit artikel.

    Een hybride query bevat een tekstquery die is opgegeven in search, en een vectorquery die is opgegeven onder vectorQueries.vector.

    De tekstquery en vectorquery moeten gelijkwaardig zijn of in ieder geval niet conflicteren. Als de query's verschillen, profiteert u niet van hybride toepassingen.

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

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

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

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.

Ervan uitgaande dat u semantische rangschikking 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. U kunt desgewenst onderschrift s en antwoorden toevoegen.

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

Belangrijkste punten:

  • Semantische classificatie accepteert maximaal 50 resultaten van het samengevoegde antwoord. Stel 'k' en 'top' in op 50 voor gelijke weergave van beide query's.

  • 'queryType' en 'semanticConfiguration' zijn vereist.

  • "onderschrift s" 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=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"
}

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

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

  • "k": n resultaten voor query's met alleen vectoren
  • "top": n resultaten voor hybride query's 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.

Als u semantische classificatie gebruikt, is het een best practice om zowel 'k' als 'top' in te stellen op ten minste 50. De semantische ranker kan maximaal 50 resultaten in beslag nemen. Door 50 voor elke query op te geven, krijgt u gelijke weergave van beide zoeksubsystemen.

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.