Skapa en vektorfråga i Azure AI Search

I Azure AI Search, om du har vektorfält i ett sökindex, förklarar den här artikeln hur du:

Den här artikeln använder REST som illustration. Kodexempel på andra språk finns i GitHub-lagringsplatsen azure-search-vector-samples för lösningar från slutpunkt till slutpunkt som innehåller vektorfrågor.

Förutsättningar

Dricks

Om du snabbt vill ta reda på om ditt index har vektorer letar du efter fält av typen Collection(Edm.Single), med ett dimensions attribut och en vectorSearchProfile tilldelning.

Konvertera en frågesträngsindata till en vektor

Om du vill köra frågor mot ett vektorfält måste själva frågan vara en vektor. En metod för att konvertera en användares textfrågesträng till dess vektorrepresentation är att anropa ett inbäddningsbibliotek eller API i programkoden. Vi rekommenderar att du alltid använder samma inbäddningsmodeller som används för att generera inbäddningar i källdokumenten.

Du hittar kodexempel som visar hur du genererar inbäddningar i lagringsplatsen azure-search-vector-samples .

Här är ett REST API-exempel på en frågesträng som skickats till en distribution av en Azure OpenAI-inbäddningsmodell:

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

Det förväntade svaret är 202 för ett lyckat anrop till den distribuerade modellen. Fältet "inbäddning" i svarets brödtext är vektorrepresentationen av frågesträngen "input". I testsyfte kopierar du värdet för matrisen "inbäddning" till "vectorQueries.vector" i en frågebegäran med hjälp av syntaxen som visas i de kommande avsnitten.

Det faktiska svaret för det här POST-anropet till den distribuerade modellen innehåller 1536 inbäddningar, trimmade här till bara de första vektorerna för läsbarhet.

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

I den här metoden ansvarar programkoden för att ansluta till en modell, generera inbäddningar och hantera svaret.

Dricks

Prova Fråga med integrerad vektorisering, för närvarande i offentlig förhandsversion, för att låta Azure AI Search hantera dina indata och utdata för frågevektorisering.

Begäran om vektorfråga

Det här avsnittet visar den grundläggande strukturen för en vektorfråga. Du kan använda Azure-portalen, REST-API:er eller Azure SDK:er för att formulera en vektorfråga. Om du migrerar från 2023-07-01-Preview finns det icke-bakåtkompatibla ändringar. Mer information finns i Uppgradera till det senaste REST-API:et .

2023-11-01 är den stabila REST API-versionen för Search POST. Den här versionen stöder:

  • vectorQueries är konstruktionen för vektorsökning.
  • kind inställd på vector anger att frågan är en vektormatris.
  • vector är fråga (en vektorrepresentation av text eller en bild).
  • exhaustive (valfritt) anropar fullständigt KNN vid frågetillfället, även om fältet indexeras för HNSW.

I följande exempel är vektorn en representation av den här strängen: "vilka Azure-tjänster stöder fulltextsökning". Frågan riktar sig mot fältet contentVector . Frågan returnerar k resultat. Den faktiska vektorn har 1536 inbäddningar, så den trimmas i det här exemplet för läsbarhet.

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

Svar på vektorfråga

I Azure AI Search består frågesvar av alla retrievable fält som standard. Det är dock vanligt att begränsa sökresultaten till en delmängd av retrievable fälten genom att visa dem i en select -instruktion.

I en vektorfråga bör du noga överväga om du behöver vektorfält i ett svar. Vektorfält är inte läsbara för människor, så om du skickar ett svar till en webbsida bör du välja icke-bevektorfält som är representativa för resultatet. Om frågan till exempel körs mot contentVectorkan du returnera content i stället.

Om du vill ha vektorfält i resultatet, här är ett exempel på svarsstrukturen. contentVector är en strängmatris med inbäddningar, trimmad här för korthet. Sökpoängen anger relevans. Andra icke-bevektorfält ingår i kontexten.

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

Viktiga punkter:

  • k avgör hur många närmaste grannresultat som returneras, i det här fallet tre. Vektorfrågor returnerar k alltid resultat, förutsatt att det finns minst k dokument, även om det finns dokument med dålig likhet, eftersom algoritmen hittar närmaste k grannar till frågevektorn.

  • @search.score Bestäms av vektorsökningsalgoritmen.

  • Fält i sökresultat är antingen alla retrievable fält eller fält i en select sats. Under körning av vektorfrågor görs matchningen enbart på vektordata. Ett svar kan dock innehålla valfritt retrievable fält i ett index. Eftersom det inte finns någon möjlighet att avkoda ett vektorfältresultat är inkluderingen av icke-inledande textfält användbar för deras mänskliga läsbara värden.

Vektorfråga med filter

En frågebegäran kan innehålla en vektorfråga och ett filteruttryck. Filter gäller för text och numeriska fält och är användbara för att filterable inkludera eller exkludera sökdokument baserat på filtervillkor. Även om ett vektorfält inte kan filtreras kan en fråga ange filter för andra fält i samma index.

I nyare API-versioner kan du ange ett filterläge för att tillämpa filter före eller efter körning av vektorfrågor. En jämförelse av varje läge och den förväntade prestandan baserat på indexstorleken finns i Filter i vektorfrågor.

Dricks

Om du inte har källfält med text eller numeriska värden kontrollerar du om det finns dokumentmetadata, till exempel LastModified- eller CreatedBy-egenskaper, som kan vara användbara i ett metadatafilter.

2023-11-01 är den stabila versionen för det här API:et. Den har:

  • vectorFilterModeför förfilter (standard) eller postfilterfiltreringslägen.
  • filter innehåller kriterierna.

I följande exempel är vektorn en representation av den här frågesträngen: "vilka Azure-tjänster stöder fulltextsökning". Frågan riktar sig mot fältet contentVector . Den faktiska vektorn har 1536 inbäddningar, så den trimmas i det här exemplet för läsbarhet.

Filtervillkoren tillämpas på ett filterbart textfält (category i det här exemplet) innan sökmotorn kör vektorfrågan.

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

Flera vektorfält

Du kan ange egenskapen "vectorQueries.fields" till flera vektorfält. Vektorfrågan körs mot varje vektorfält som du anger i fields listan. När du kör frågor mot flera vektorfält kontrollerar du att var och en innehåller inbäddningar från samma inbäddningsmodell och att frågan också genereras från samma inbäddningsmodell.

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

Flera vektorfrågor

Vektorsökning med flera frågor skickar flera frågor över flera vektorfält i ditt sökindex. Ett vanligt exempel på den här frågebegäran är när du använder modeller som CLIP för en multimodal vektorsökning där samma modell kan vektorisera bild- och textinnehåll.

Följande frågeexempel söker efter likhet i både myImageVector och myTextVector, men skickar i två olika frågebäddningar, som var och en körs parallellt. Den här frågan ger ett resultat som poängsätts med hjälp av Reciprocal Rank Fusion (RRF).

  • vectorQueries innehåller en matris med vektorfrågor.
  • vector innehåller bildvektorer och textvektorer i sökindexet. Varje instans är en separat fråga.
  • fields anger vilket vektorfält som ska riktas.
  • k är antalet närmaste grannmatchningar som ska inkluderas i 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
        }
    ]
}

Sökresultaten skulle innehålla en kombination av text och bilder, förutsatt att ditt sökindex innehåller ett fält för bildfilen (ett sökindex lagrar inte bilder).

Fråga med integrerad vektorisering (förhandsversion)

Det här avsnittet visar en vektorfråga som anropar den nya funktionen för förhandsversion av integrerad vektorisering som konverterar en textfråga till en vektor. Använd REST API för förhandsversion 2023-10-01 eller ett uppdaterat Beta Azure SDK-paket.

En förutsättning är ett sökindex med en vektoriserare konfigurerad och tilldelad till ett vektorfält. Vektoriseraren tillhandahåller anslutningsinformation till en inbäddningsmodell som används vid frågetillfället.

Frågor tillhandahåller textsträngar i stället för vektorer:

  • kind måste anges till text .
  • text måste ha en textsträng. Den skickas till vektoriseraren som tilldelats vektorfältet.
  • fields är det vektorfält som ska sökas.

Här är ett enkelt exempel på en fråga som är vektoriserad vid frågetillfället. Textsträngen är vektoriserad och används sedan för att fråga efter fältet 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
        }
    ]
}

Här är en hybridfråga med integrerad vektorisering av textfrågor. Den här frågan innehåller flera frågevektorfält, flera icke-bevektorfält, ett filter och semantisk rangordning. Återigen är kind skillnaderna vektorfrågan och strängen text i stället för en vector.

I det här exemplet gör sökmotorn tre vektoriseringsanrop till de vektoriserare som tilldelats till descriptionVector, synopsisVectoroch authorBioVector i indexet. De resulterande vektorerna används för att hämta dokument mot respektive fält. Sökmotorn kör också en nyckelordssökning på search frågan , "mystery novel set in London".

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 poängsatta resultaten från alla fyra frågorna sammansvetsas med RRF-rangordning. Sekundär semantisk rangordning anropas över de sammansvetsade sökresultaten searchFields , men bara för att öka resultaten som är mest semantiskt justerade till "search":"mystery novel set in London".

Kommentar

Vectorizers används under indexering och frågekörning. Om du inte behöver segmentering och vektorisering av data i indexet kan du hoppa över steg som att skapa en indexerare, kompetensuppsättning och datakälla. I det här scenariot används vektoriseraren endast vid frågetillfället för att konvertera en textsträng till en inbäddning.

Antal rangordnade resultat i ett vektorfrågesvar

En vektorfråga anger parametern k som avgör hur många matchningar som returneras i resultatet. Sökmotorn returnerar k alltid antalet matchningar. Om k är större än antalet dokument i indexet avgör antalet dokument den övre gränsen för vad som kan returneras.

Om du är bekant med fulltextsökning vet du att du förväntar dig noll resultat om indexet inte innehåller någon term eller fras. I vektorsökning identifierar sökåtgärden dock närmaste grannar och returnerar k alltid resultat även om närmaste grannar inte är så lika. Därför är det möjligt att få resultat för meningslösa frågor eller frågor utanför ämnet, särskilt om du inte använder uppmaningar för att ange gränser. Mindre relevanta resultat har sämre likhetspoäng, men de är fortfarande de "närmaste" vektorerna om det inte finns något närmare. Därför kan ett svar utan meningsfulla resultat fortfarande returnera k resultat, men varje resultats likhetspoäng skulle vara låg.

En hybridmetod som innehåller fulltextsökning kan åtgärda det här problemet. En annan åtgärd är att ange ett minimitröskelvärde för sökpoängen, men bara om frågan är en ren enskild vektorfråga. Hybridfrågor bidrar inte till minsta tröskelvärden eftersom RRF-intervallen är så mycket mindre och flyktiga.

Frågeparametrar som påverkar resultatantalet är:

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

Rangordningsalgoritmer som används i en vektorfråga

Rangordningen av resultaten beräknas av antingen:

  • Likhetsmått
  • Reciprocal Rank Fusion (RRF) om det finns flera uppsättningar sökresultat.

Likhetsmått

Likhetsmåttet som anges i indexavsnittet vectorSearch för en fråga med endast vektorer. Giltiga värden är cosine, euclidean och dotProduct.

Azure OpenAI-inbäddningsmodeller använder cosinélikhet, så om du använder Inbäddningsmodeller cosine för Azure OpenAI är det rekommenderade måttet. Andra rangordningsmått som stöds är euclidean och dotProduct.

Använda RRF

Flera uppsättningar skapas om frågan riktar sig mot flera vektorfält, kör flera vektorfrågor parallellt eller om frågan är en hybrid av vektor- och fulltextsökning, med eller utan semantisk rangordning.

Under frågekörningen kan en vektorfråga endast rikta in sig på ett internt vektorindex. För flera vektorfält och flera vektorfrågor genererar sökmotorn därför flera frågor som riktar sig mot respektive vektorindex för varje fält. Utdata är en uppsättning rankade resultat för varje fråga, som sammansvetsas med RRF. Mer information finns i Relevansbedömning med Reciprocal Rank Fusion (RRF).

Nästa steg

Som ett nästa steg granskar du exempel på vektorfrågekod i Python, C# eller JavaScript.