Een vectorquery maken in Azure AI Search

Als u in Azure AI Search vectorvelden in een zoekindex hebt, wordt in dit artikel uitgelegd hoe u:

In dit artikel wordt REST gebruikt voor illustratie. Zie de GitHub-opslagplaats azure-search-vector-samples voor end-to-end-oplossingen met vectorquery's voor codevoorbeelden in andere talen.

Vereisten

Tip

Als u snel wilt bepalen of uw index vectoren heeft, zoekt u naar velden van het type Collection(Edm.Single), met een dimensions kenmerk en een vectorSearchProfile toewijzing.

Een queryreeksinvoer converteren naar een vector

Als u een query wilt uitvoeren op een vectorveld, moet de query zelf een vector zijn. Een benadering voor het converteren van de tekenreeks voor tekstquery's van een gebruiker naar de vectorweergave is het aanroepen van een insluitbibliotheek of API in uw toepassingscode. Als best practice kunt u altijd dezelfde insluitingsmodellen gebruiken die worden gebruikt voor het genereren van insluitingen in de brondocumenten.

U vindt codevoorbeelden die laten zien hoe u insluitingen genereert in de opslagplaats azure-search-vector-samples .

Hier volgt een REST API-voorbeeld van een querytekenreeks die is verzonden naar een implementatie van een Azure OpenAI-insluitmodel:

POST https://{{openai-service-name}}.openai.azure.com/openai/deployments/{{openai-deployment-name}}/embeddings?api-version={{openai-api-version}}
Content-Type: application/json
api-key: {{admin-api-key}}
{
    "input": "what azure services support generative AI'"
}

Het verwachte antwoord is 202 voor een geslaagde aanroep naar het geïmplementeerde model. Het veld 'insluiten' in de hoofdtekst van het antwoord is de vectorweergave van de querytekenreeks 'invoer'. Voor testdoeleinden kopieert u de waarde van de matrix 'embedding' naar vectorQueries.vector in een queryaanvraag, met behulp van de syntaxis die wordt weergegeven in de volgende secties.

Het werkelijke antwoord voor deze POST-aanroep naar het geïmplementeerde model bevat 1536 insluitingen, die hier zijn ingekort tot slechts de eerste paar vectoren voor leesbaarheid.

{
    "object": "list",
    "data": [
        {
            "object": "embedding",
            "index": 0,
            "embedding": [
                -0.009171937,
                0.018715322,
                ...
                -0.0016804502
            ]
        }
    ],
    "model": "ada",
    "usage": {
        "prompt_tokens": 7,
        "total_tokens": 7
    }
}

In deze benadering is uw toepassingscode verantwoordelijk voor het maken van verbinding met een model, het genereren van insluitingen en het verwerken van het antwoord.

Tip

Voer query's uit met geïntegreerde vectorisatie, momenteel in openbare preview, om Azure AI Search te laten omgaan met de invoer en uitvoer van uw queryvectorisatie.

Vectorqueryaanvraag

In deze sectie ziet u de basisstructuur van een vectorquery. U kunt Azure Portal, REST API's of de Azure SDK's gebruiken om een vectorquery te formuleren. Als u migreert van 2023-07-01-Preview, zijn er belangrijke wijzigingen. Zie Upgraden naar de nieuwste REST API voor meer informatie.

2023-11-01 is de stabiele REST API-versie voor Search POST. Deze versie ondersteunt:

  • vectorQueries is de constructie voor vectorzoekopdrachten.
  • kind ingesteld om aan te vector geven dat de query een vectormatrix is.
  • vector is een query (een vectorweergave van tekst of een afbeelding).
  • exhaustive (optioneel) roept uitgebreide KNN aan tijdens het uitvoeren van query's, zelfs als het veld is geïndexeerd voor HNSW.

In het volgende voorbeeld is de vector een weergave van deze tekenreeks: 'wat Azure-services ondersteuning bieden voor zoeken in volledige tekst'. De query is gericht op het contentVector veld. De query retourneert k resultaten. De werkelijke vector heeft 1536 insluitingen, dus deze wordt in dit voorbeeld ingekort voor leesbaarheid.

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}}
{
    "count": true,
    "select": "title, content, category",
    "vectorQueries": [
        {
            "kind": "vector",
            "vector": [
                -0.009154141,
                0.018708462,
                . . . 
                -0.02178128,
                -0.00086512347
            ],
            "exhaustive": true,
            "fields": "contentVector",
            "k": 5
        }
    ]
}

Vectorqueryantwoord

In Azure AI Search bestaan queryantwoorden standaard uit alle retrievable velden. Het is echter gebruikelijk om zoekresultaten te beperken tot een subset retrievable van velden door ze in een select instructie weer te geven.

In een vectorquery moet u zorgvuldig overwegen of u vectorvelden in een antwoord moet gebruiken. Vectorvelden zijn niet door mensen leesbaar, dus als u een reactie naar een webpagina pusht, moet u niet-vectorvelden kiezen die representatief zijn voor het resultaat. Als de query bijvoorbeeld wordt uitgevoerd contentVector, kunt u in plaats daarvan retourneren content .

Als u vectorvelden in het resultaat wilt, ziet u hier een voorbeeld van de antwoordstructuur. contentVector is een tekenreeksmatrix met insluitingen, die hier zijn ingekort om kortheid te beperken. De zoekscore geeft relevantie aan. Andere niet-ctorvelden zijn opgenomen voor context.

{
    "@odata.count": 3,
    "value": [
        {
            "@search.score": 0.80025613,
            "title": "Azure Search",
            "category": "AI + Machine Learning",
            "contentVector": [
                -0.0018343845,
                0.017952163,
                0.0025753193,
                ...
            ]
        },
        {
            "@search.score": 0.78856903,
            "title": "Azure Application Insights",
            "category": "Management + Governance",
            "contentVector": [
                -0.016821077,
                0.0037742127,
                0.016136652,
                ...
            ]
        },
        {
            "@search.score": 0.78650564,
            "title": "Azure Media Services",
            "category": "Media",
            "contentVector": [
                -0.025449317,
                0.0038463024,
                -0.02488436,
                ...
            ]
        }
    ]
}

Belangrijkste punten:

  • k bepaalt hoeveel dichtstbijzijnde buurresultaten worden geretourneerd, in dit geval drie. Vectorquery's retourneren k altijd resultaten, ervan uitgaande dat er ten minste k documenten bestaan, zelfs als er documenten met een slechte overeenkomst zijn, omdat het algoritme alle dichtstbijzijnde buren aan de queryvector vindt k .

  • De @search.score wordt bepaald door het algoritme voor vectorzoekopdrachten.

  • Velden in zoekresultaten zijn alle retrievable velden of velden in een select component. Tijdens de uitvoering van vectorquery's wordt de overeenkomst alleen gemaakt op vectorgegevens. Een antwoord kan echter elk retrievable veld in een index bevatten. Omdat er geen mogelijkheid is voor het decoderen van een vectorveldresultaat, is het opnemen van niet-vectortekstvelden handig voor hun leesbare waarden.

Vectorquery met filter

Een queryaanvraag kan een vectorquery en een filterexpressie bevatten. Filters zijn van toepassing op filterable tekst- en numerieke velden en zijn handig voor het opnemen of uitsluiten van zoekdocumenten op basis van filtercriteria. Hoewel een vectorveld niet kan worden gefilterd, kan een query filters opgeven voor andere velden in dezelfde index.

In nieuwere API-versies kunt u een filtermodus instellen om filters toe te passen vóór of na de uitvoering van vectorquery's. Zie Filters in vectorquery's voor een vergelijking van elke modus en de verwachte prestaties op basis van de indexgrootte.

Tip

Als u geen bronvelden met tekst of numerieke waarden hebt, controleert u of documentmetagegevens, zoals LastModified of CreatedBy-eigenschappen, nuttig kunnen zijn in een metagegevensfilter.

2023-11-01 is de stabiele versie voor deze API. Het heeft:

  • vectorFilterModevoor prefiltermodus (standaard) of postfilterfilterfilters.
  • filter geeft de criteria.

In het volgende voorbeeld is de vector een weergave van deze querytekenreeks: 'wat Azure-services ondersteuning bieden voor zoeken in volledige tekst'. De query is gericht op het contentVector veld. De werkelijke vector heeft 1536 insluitingen, dus deze wordt in dit voorbeeld ingekort voor leesbaarheid.

De filtercriteria worden toegepast op een filterbaar tekstveld (category in dit voorbeeld) voordat de zoekmachine de vectorquery uitvoert.

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}}
{
    "count": true,
    "select": "title, content, category",
    "filter": "category eq 'Databases'",
    "vectorFilterMode": "preFilter",
    "vectorQueries": [
        {
            "kind": "vector",
            "vector": [
                -0.009154141,
                0.018708462,
                . . . 
                -0.02178128,
                -0.00086512347
            ],
            "exhaustive": true,
            "fields": "contentVector",
            "k": 5
        }
    ]
}

Meerdere vectorvelden

U kunt de eigenschap vectorQueries.fields instellen op meerdere vectorvelden. De vectorquery wordt uitgevoerd op elk vectorveld dat u in de fields lijst opgeeft. Wanneer u query's uitvoert op meerdere vectorvelden, moet u ervoor zorgen dat elk veld insluitingen bevat uit hetzelfde insluitingsmodel en dat de query ook wordt gegenereerd op basis van hetzelfde insluitingsmodel.

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}}
{
    "count": true,
    "select": "title, content, category",
    "vectorQueries": [
        {
            "kind": "vector",
            "vector": [
                -0.009154141,
                0.018708462,
                . . . 
                -0.02178128,
                -0.00086512347
            ],
            "exhaustive": true,
            "fields": "contentVector, titleVector",
            "k": 5
        }
    ]
}

Query's met meerdere vectoren

Meerdere queryvectorzoekopdrachten verzenden meerdere query's over meerdere vectorvelden in uw zoekindex. Een veelvoorkomend voorbeeld van deze queryaanvraag is bij het gebruik van modellen zoals CLIP voor een multimodale vectorzoekopdracht waarbij hetzelfde model afbeeldings- en tekstinhoud kan vectoriseren.

In het volgende queryvoorbeeld wordt gezocht naar overeenkomsten in beide myImageVector en myTextVector, maar worden er twee verschillende insluitingen voor query's verzonden, die beide parallel worden uitgevoerd. Deze query produceert een resultaat dat wordt gescoord met behulp van Recimaal Rank Fusion (RRF).

  • vectorQueries biedt een matrix van vectorquery's.
  • vector bevat de afbeeldingsvectoren en tekstvectoren in de zoekindex. Elk exemplaar is een afzonderlijke query.
  • fields geeft aan welk vectorveld moet worden gericht.
  • k is het aantal dichtstbijzijnde burenovereenkomsten dat moet worden opgenomen in de resultaten.
{
    "count": true,
    "select": "title, content, category",
    "vectorQueries": [
        {
            "kind": "vector",
            "vector": [
                -0.009154141,
                0.018708462,
                . . . 
                -0.02178128,
                -0.00086512347
            ],
            "fields": "myimagevector",
            "k": 5
        },
        {
            "kind": "vector"
            "vector": [
                -0.002222222,
                0.018708462,
                -0.013770515,
            . . .
            ],
            "fields": "mytextvector",
            "k": 5
        }
    ]
}

Zoekresultaten bevatten een combinatie van tekst en afbeeldingen, ervan uitgaande dat uw zoekindex een veld voor het afbeeldingsbestand bevat (een zoekindex slaat geen afbeeldingen op).

Query met geïntegreerde vectorisatie (preview)

In deze sectie ziet u een vectorquery die de nieuwe preview-functie voor geïntegreerde vectorisatie aanroept waarmee een tekstquery wordt geconverteerd naar een vector. Gebruik 2023-10-01-Preview REST API of een bijgewerkt bèta-Azure SDK-pakket.

Een vereiste is een zoekindex waarbij een vectorizer is geconfigureerd en toegewezen aan een vectorveld. De vectorizer biedt verbindingsgegevens met een insluitmodel dat wordt gebruikt tijdens het uitvoeren van query's.

Query's bieden tekenreeksen in plaats van vectoren:

  • kind moet zijn ingesteld op text .
  • text moet een tekenreeks hebben. Het wordt doorgegeven aan de vectorizer die is toegewezen aan het vectorveld.
  • fields is het vectorveld om te zoeken.

Hier volgt een eenvoudig voorbeeld van een query die wordt gevectoriseerd tijdens het uitvoeren van query's. De tekenreeks wordt vectorized en vervolgens gebruikt om een query uit te voeren op het veld descriptionVector.

POST https://{{search-service}}.search.windows.net/indexes/{{index}}/docs/search?api-version=2023-10-01-preview
{
    "select": "title, genre, description",
    "vectorQueries": [
        {
            "kind": "text",
            "text": "mystery novel set in London",
            "fields": "descriptionVector",
            "k": 5
        }
    ]
}

Hier volgt een hybride query met geïntegreerde vectorisatie van tekstquery's. Deze query bevat meerdere queryvectorvelden, meerdere niet-vectorvelden, een filter en een semantische classificatie. Ook hier zijn de verschillen de kind vectorquery en de text tekenreeks in plaats van een vector.

In dit voorbeeld maakt de zoekmachine drie vectorisatie-aanroepen naar de vectorizers die zijn toegewezen aan descriptionVector, synopsisVectoren authorBioVector in de index. De resulterende vectoren worden gebruikt om documenten op te halen op basis van hun respectieve velden. De zoekmachine voert ook een trefwoordzoekopdracht uit op de search query, 'mystery novel set in Londen'.

POST https://{{search-service}}.search.windows.net/indexes/{{index}}/docs/search?api-version=2023-10-01-preview
Content-Type: application/json
api-key: {{admin-api-key}}
{
    "search":"mystery novel set in London", 
    "searchFields":"description, synopsis", 
    "semanticConfiguration":"my-semantic-config", 
    "queryType":"semantic",
    "select": "title, author, synopsis",
    "filter": "genre eq 'mystery'",
    "vectorFilterMode": "postFilter",
    "vectorQueries": [
        {
            "kind": "text",
            "text": "mystery novel set in London",
            "fields": "descriptionVector, synopsisVector",
            "k": 5
        },
        {
            "kind": "text"
            "text": "living english author",
            "fields": "authorBioVector",
            "k": 5
        }
    ]
}

De gescoorde resultaten van alle vier query's worden samengevoegd met behulp van RRF-classificatie. Secundaire semantische classificatie wordt aangeroepen via de samengevoegde zoekresultaten, maar op de searchFields enige, het stimuleren van resultaten die het meest semantisch zijn uitgelijnd op "search":"mystery novel set in London".

Notitie

Vectorizers worden gebruikt tijdens het indexeren en uitvoeren van query's. Als u geen gegevenssegmentering en vectorisatie in de index nodig hebt, kunt u stappen overslaan, zoals het maken van een indexeerfunctie, vaardighedenset en gegevensbron. In dit scenario wordt de vectorizer alleen tijdens de query gebruikt om een teksttekenreeks te converteren naar een insluiting.

Aantal gerangschikte resultaten in een vectorqueryantwoord

Een vectorquery geeft de k parameter op, waarmee wordt bepaald hoeveel overeenkomsten worden geretourneerd in de resultaten. De zoekmachine retourneert k altijd het aantal overeenkomsten. Als k het aantal documenten in de index groter is dan het aantal documenten, bepaalt het aantal documenten de bovengrens van wat kan worden geretourneerd.

Als u bekend bent met zoeken in volledige tekst, weet u dat u nul resultaten verwacht als de index geen term of woordgroep bevat. Bij vectorzoekopdrachten identificeert de zoekbewerking echter de dichtstbijzijnde buren en retourneert k deze altijd resultaten, zelfs als de dichtstbijzijnde buren niet zo vergelijkbaar zijn. Het is dus mogelijk om resultaten te krijgen voor niet-gevoelige of off-topic-query's, met name als u geen prompts gebruikt om grenzen in te stellen. Minder relevante resultaten hebben een slechtere gelijkenisscore, maar ze zijn nog steeds de dichtstbijzijnde vectoren als er niets dichterbij is. Als zodanig kan een antwoord zonder zinvolle resultaten nog steeds resultaten retourneren k , maar de gelijkenisscore van elk resultaat zou laag zijn.

Een hybride benadering met zoeken in volledige tekst kan dit probleem verhelpen. Een andere beperking is het instellen van een minimumdrempel voor de zoekscore, maar alleen als de query een pure enkelvoudige vectorquery is. Hybride query's zijn niet leidend tot minimale drempelwaarden, omdat de RRF-bereiken zoveel kleiner en vluchtig zijn.

Queryparameters die van invloed zijn op het aantal resultaten zijn onder andere:

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

Classificatiealgoritmen die worden gebruikt in een vectorquery

De rangschikking van resultaten wordt berekend door:

  • Metrische gegevens over overeenkomsten
  • Wederzijdse Rank Fusion (RRF) als er meerdere sets zoekresultaten zijn.

Metrische gegevens over overeenkomsten

De metrische overeenkomst die is opgegeven in de indexsectie vectorSearch voor een vectorquery. Geldige waarden zijn cosine, euclidean en dotProduct.

Azure OpenAI-insluitmodellen maken gebruik van cosinus-overeenkomsten, dus als u Azure OpenAI-insluitingsmodellen gebruikt, cosine is dit de aanbevolen metrische waarde. Andere ondersteunde metrische classificatiegegevens zijn onder andere euclidean en dotProduct.

RRF gebruiken

Er worden meerdere sets gemaakt als de query is gericht op meerdere vectorvelden, meerdere vectorquery's parallel uitvoert of als de query een hybride van vector en zoeken in volledige tekst is, met of zonder semantische rangschikking.

Tijdens het uitvoeren van query's kan een vectorquery slechts één interne vectorindex bereiken. Voor meerdere vectorvelden en meerdere vectorquery's genereert de zoekmachine dus meerdere query's die gericht zijn op de respectieve vectorindexen van elk veld. De uitvoer is een set gerangschikte resultaten voor elke query, die worden gefuseerd met behulp van RRF. Zie Relevantiescores met behulp van Recimaal Rank Fusion (RRF) voor meer informatie.

Volgende stappen

Bekijk als volgende stap voorbeelden van vectorquerycode in Python, C# of JavaScript.