Dela via


Skapa en vektorfråga i Azure AI Search

Om du har ett vektorindex i Azure AI Search 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.

Du kan också använda Sökutforskaren i Azure-portalen om du konfigurerar en vektoriserare som konverterar strängar till inbäddningar.

Förutsättningar

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 .

En andra metod är att använda 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.

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.

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 icke-bevektorfält, antingen ett strängfält eller 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 filter tillämpas på andra fält i samma index.

Du kan använda filter som undantagsvillkor innan frågan körs eller efter frågekörningen för att filtrera sökresultat. 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 och nyare REST API:er för förhandsversion 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. Kontrollera indexdefinitionen för en vektoriserarspecifikation.

Skärmbild av en vektoriseringsinställning i ett sökindex.

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=2024-05-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=2024-05-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 rankade 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).

Ange tröskelvärden för att exkludera resultat med låg poäng (förhandsversion)

Eftersom närmsta grannsökning alltid returnerar de begärda k grannarna är det möjligt att få flera matchningar med låg poäng som en del av att uppfylla nummerkravet i sökresultaten k .

Med rest-API:erna för förhandsversionen av 2024-05-01 kan du nu lägga till en threshold frågeparameter för att undanta sökresultat med låg poäng baserat på en minimipoäng. Filtrering sker innan resultat från olika återställningsuppsättningar används.

I det här exemplet undantas alla matchningar som poäng under 0,8 från vektorsökningsresultat, även om antalet resultat hamnar under k.

POST https://[service-name].search.windows.net/indexes/[index-name]/docs/search?api-version=2024-05-01-Preview 
    Content-Type: application/json 
    api-key: [admin key] 

    { 
      "vectorQueries": [ 
        { 
          "kind": "vector", 
          "vector": [1.0, 2.0, 3.0], 
          "fields": "my-cosine-field", 
          "threshold": { 
            "kind": "vectorSimilarity", 
            "value": 0.8 
          } 
        }
      ]
    }

MaxTextSizeRecall för hybridsökning (förhandsversion)

Vektorfrågor används ofta i hybridkonstruktioner som innehåller icke-bevektorfält. Om du upptäcker att BM25-rankade resultat är över eller under representerade i ett hybridfrågeresultat kan du ange maxTextRecallSize att öka eller minska BM25-rankade resultat som tillhandahålls för hybridrankning.

Du kan bara ange den här egenskapen i hybridbegäranden som innehåller komponenterna "search" och "vectorQueries".

Mer information finns i Ange maxTextRecallSize – Skapa en hybridfråga.

Vektorviktning (förhandsversion)

Lägg till en weight frågeparameter för att ange den relativa vikten för varje vektorfråga som ingår i sökåtgärder. Det här värdet används när du kombinerar resultatet av flera rangordningslistor som skapats av två eller flera vektorfrågor i samma begäran eller från vektordelen av en hybridfråga.

Standardvärdet är 1,0 och värdet måste vara ett positivt tal som är större än noll.

Vikter används vid beräkning av de ömsesidiga fusionspoängen för varje dokument. Beräkningen är multiplikator av weight värdet mot rankningspoängen för dokumentet inom respektive resultatuppsättning.

Följande exempel är en hybridfråga med två vektorfrågesträngar och en textsträng. Vikter tilldelas till vektorfrågorna. Den första frågan är 0,5 eller halva vikten, vilket minskar dess betydelse i begäran. Den andra vektorfrågan är dubbelt så viktig.

Textfrågor har inga viktparametrar, men du kan öka eller minska deras betydelse genom att ange 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_first_vector_field", 
          "k": 10, 
          "weight": 0.5 
        },
        { 
          "kind": "vector", 
          "vector": [4.0, 5.0, 6.0], 
          "fields": "my_second_vector_field", 
          "k": 10, 
          "weight": 2.0
        } 
      ], 
      "search": "hello world" 
    } 

Nästa steg

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