Vektoros lekérdezés létrehozása az Azure AI Searchben

Az Azure AI Searchben, ha vektormezők vannak a keresési indexben, ez a cikk a következő lépéseket ismerteti:

Ez a cikk REST-et használ az ábrához. Más nyelvű kódmintákért tekintse meg az azure-search-vector-samples GitHub-adattárat a vektoros lekérdezéseket tartalmazó végpontok közötti megoldásokhoz.

Előfeltételek

Tipp.

Ha gyorsan meg szeretné állapítani, hogy az index rendelkezik-e vektorokkal, keressen típusmezőket Collection(Edm.Single)egy dimensions attribútummal és egy hozzárendeléssel vectorSearchProfile .

Lekérdezési sztring bemenetének konvertálása vektorsá

Vektormező lekérdezéséhez magának a lekérdezésnek vektornak kell lennie. A felhasználó szöveges lekérdezési sztringjének vektoros ábrázolássá alakításának egyik módszere egy beágyazási kódtár vagy API meghívása az alkalmazáskódban. Ajánlott eljárásként mindig ugyanazokat a beágyazási modelleket használja, amelyeket beágyazások létrehozásához használ a forrásdokumentumokban.

Kódmintákat talál, amelyek bemutatják , hogyan hozhat létre beágyazásokat az azure-search-vector-samples adattárban.

Íme egy REST API-példa egy Azure OpenAI-beágyazási modell üzembe helyezéséhez küldött lekérdezési sztringre:

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

A várt válasz 202 lesz az üzembe helyezett modell sikeres hívásához. A válasz törzsében a "beágyazás" mező a "bemenet" lekérdezési sztring vektoros ábrázolása. Tesztelési célokra a "beágyazás" tömb értékét egy lekérdezési kérelemben a "vectorQueries.vector" fájlba másolná a következő szakaszokban látható szintaxis használatával.

A POST-hívás tényleges válasza az üzembe helyezett modellre 1536 beágyazást tartalmaz, amelyeket itt vágunk le, hogy csak az első néhány vektor legyen olvasható.

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

Ebben a megközelítésben az alkalmazáskód felelős a modellhez való csatlakozásért, a beágyazások generálásáért és a válasz kezeléséhez.

Tipp.

Próbálja ki a lekérdezést integrált vektorizálással, amely jelenleg nyilvános előzetes verzióban érhető el, hogy az Azure AI Search kezelje a lekérdezésvektorizációs bemeneteket és kimeneteket.

Vektoros lekérdezési kérelem

Ez a szakasz a vektoros lekérdezések alapstruktúráját mutatja be. Vektoros lekérdezések létrehozásához használhatja az Azure Portalt, a REST API-kat vagy az Azure SDK-kat. Ha 2023-07-01-preview-ról migrál, akkor kompatibilitástörő változások következnek be. További részletekért lásd : Frissítés a legújabb REST API-ra .

A 2023-11-01 a Search POST stabil REST API-verziója. Ez a verzió a következőket támogatja:

  • vectorQueries a vektorkeresés felépítése.
  • kind beállítással vector megadhatja, hogy a lekérdezés vektortömb.
  • vector a lekérdezés (szöveg vagy kép vektoros ábrázolása).
  • exhaustive (nem kötelező) teljes KNN-t hív meg lekérdezéskor, még akkor is, ha a mező indexelve van a HNSW-hez.

A következő példában a vektor ennek a sztringnek a megjelenítése: "amit az Azure-szolgáltatások támogatnak a teljes szöveges keresésben". A lekérdezés a contentVector mezőt célozza meg. A lekérdezés eredményeket ad k vissza. A tényleges vektor 1536 beágyazással rendelkezik, ezért ebben a példában az olvashatóság érdekében vágja le.

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

Vektoros lekérdezési válasz

Az Azure AI Searchben a lekérdezési válaszok alapértelmezés szerint az összes retrievable mezőből állnak. Gyakori azonban, hogy a keresési eredményeket a mezők egy részhalmazára retrievable korlátozza, ha egy select utasításban listázzuk őket.

A vektoros lekérdezésekben gondosan gondolja át, hogy a válaszban vektormezőkre van-e szükség. A vektormezők nem olvashatók az emberek számára, ezért ha választ küld egy weblapra, akkor az eredményre jellemző nem adatmegjelenítő mezőket kell választania. Ha például a lekérdezés a következőre contentVectorfut, akkor vissza is térhet content .

Ha vektormezőket szeretne az eredményben, íme egy példa a válaszstruktúrára. contentVector a beágyazások sztringtömbje, amelyet itt vágunk le a rövidítéshez. A keresési pontszám relevanciát jelez. A környezet más nem adatvetítő mezőket is tartalmaz.

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

Főbb pontok:

  • k meghatározza, hogy hány legközelebbi szomszéd eredményt ad vissza, ebben az esetben három. A vektoros lekérdezések mindig eredményeket adnak vissza k , feltéve, hogy legalább k dokumentumok léteznek, még akkor is, ha vannak rossz hasonlóságú dokumentumok, mivel az algoritmus megkeresi k a lekérdezésvektor legközelebbi szomszédjait.

  • Ezt @search.score a vektorkeresési algoritmus határozza meg.

  • A keresési eredmények mezői vagy az összes retrievable mező, vagy egy select záradék mezői. A vektoros lekérdezés végrehajtása során az egyezés csak vektoradatokon történik. A válaszok azonban az index bármely retrievable mezőjét tartalmazhatják. Mivel a vektormezők eredményének dekódolására nincs lehetőség, a nem adatfeltáró szövegmezők felvétele hasznos lehet az emberi olvasható értékekhez.

Vektoros lekérdezés szűrővel

A lekérdezési kérelem tartalmazhat vektoros lekérdezést és szűrőkifejezést. A szűrők szöveg- és numerikus mezőkre filterable vonatkoznak, és a keresési dokumentumok szűrési feltételek alapján történő belefoglalásához vagy kizárásához hasznosak. Bár egy vektormező önmagában nem szűrhető, a lekérdezések szűrőket adhatnak meg ugyanazon index más mezőire.

Az újabb API-verziókban beállíthat egy szűrő módot, amely szűrőket alkalmaz a vektoros lekérdezés végrehajtása előtt vagy után. Az egyes üzemmódok és a várt teljesítmény indexméreten alapuló összehasonlításához tekintse meg a Szűrők vektoros lekérdezésekben című témakört.

Tipp.

Ha nem rendelkezik szöveges vagy numerikus értékeket tartalmazó forrásmezőkkel, ellenőrizze, hogy vannak-e olyan dokumentum metaadatai, mint például a LastModified vagy a CreatedBy tulajdonságok, amelyek hasznosak lehetnek egy metaadat-szűrőben.

A 2023-11-01 az API stabil verziója. A következőt teszi:

  • vectorFilterMode előszűrő (alapértelmezett) vagy postfilter szűrési mód esetén.
  • filter adja meg a feltételeket.

A következő példában a vektor ennek a lekérdezési sztringnek a reprezentációja: "amit az Azure-szolgáltatások támogatnak a teljes szöveges keresésben". A lekérdezés a contentVector mezőt célozza meg. A tényleges vektor 1536 beágyazással rendelkezik, ezért ebben a példában az olvashatóság érdekében vágja le.

A szűrőfeltételeket a program egy szűrhető szövegmezőre alkalmazza (category ebben a példában), mielőtt a keresőmotor végrehajtja a vektoros lekérdezést.

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

Több vektormező

A "vectorQueries.fields" tulajdonságot több vektormezőre is beállíthatja. A vektoros lekérdezés a listában megadott fields összes vektormezőn fut. Több vektormező lekérdezésekor győződjön meg arról, hogy mindegyik ugyanabból a beágyazási modellből tartalmaz beágyazást, és hogy a lekérdezés is ugyanabból a beágyazási modellből jön létre.

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

Több vektoros lekérdezés

A több lekérdezéses vektoros keresés több lekérdezést küld a keresési index több vektormezőjében. Erre a lekérdezési kérelemre gyakori példa, ha olyan modelleket használ, mint például a CLIP egy többmodális vektoros kereséshez, ahol ugyanaz a modell képes vektorizálni a kép- és szövegtartalmat.

Az alábbi lekérdezési példa a hasonlóságot keresi mind a kettőben myImageVectormyTextVector, mind pedig a két különböző lekérdezésbe ágyazott, párhuzamosan futtatott lekérdezési beágyazást. Ez a lekérdezés olyan eredményt hoz létre, amelyet a Kölcsönös rangsor fúzió (RRF) használatával pontozott.

  • vectorQueries vektoros lekérdezések tömbje.
  • vector A keresési index képvektorait és szövegvektorait tartalmazza. Minden példány külön lekérdezés.
  • fields megadja, hogy melyik vektormezőt célozza meg.
  • k az eredményekbe belefoglalandó legközelebbi szomszéd egyezések száma.
{
    "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
        }
    ]
}

A keresési eredmények szöveg és képek kombinációját is tartalmazhatják, feltéve, hogy a keresési index tartalmaz egy mezőt a képfájlhoz (a keresési index nem tárolja a képeket).

Lekérdezés integrált vektorizálással (előzetes verzió)

Ez a szakasz egy vektoros lekérdezést jelenít meg, amely meghívja az új integrált vektorizációs előnézeti funkciót, amely egy szöveges lekérdezést vektorsá alakít át. Használja a 2023-10-01-Preview REST API-t vagy egy frissített bétaverziós Azure SDK-csomagot.

Az előfeltétel egy olyan keresési index, amely konfigurálva van egy vektormezőhöz, és hozzá van rendelve egy vektormezőhöz . A vektorizáló kapcsolati adatokat biztosít a lekérdezési időpontban használt beágyazási modellhez.

A lekérdezések vektorok helyett szöveges sztringeket biztosítanak:

  • kind beállításnak a következőre kell állítania: text .
  • text szöveges sztringgel kell rendelkeznie. Át lesz adva a vektormezőhöz rendelt vektorizálónak.
  • fields a keresendő vektormező.

Íme egy egyszerű példa a lekérdezési időpontban vektorizált lekérdezésre. A szöveges sztring vektorizált, majd a descriptionVector mező lekérdezésére szolgál.

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

Íme egy hibrid lekérdezés , amely a szöveges lekérdezések integrált vektorizálását használja. Ez a lekérdezés több lekérdezésvektormezőt, több nem megadó mezőt, szűrőt és szemantikai rangsorolást tartalmaz. A különbségek kind a vektoros lekérdezés és a text sztring helyett a vector.

Ebben a példában a keresőmotor három vektorizációs hívást indít a hozzá rendelt vektorizálókhoz descriptionVectorsynopsisVectorés authorBioVector az indexhez. Az eredményként kapott vektorok a dokumentumok saját mezőikre való lekérésére szolgálnak. A keresőmotor egy kulcsszókeresést is végrehajt a search lekérdezésen, "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
        }
    ]
}

Mind a négy lekérdezés pontszáma összeolvad az RRF rangsorolásával. A másodlagos szemantikai rangsorolást a rendszer meghívja az egyesített keresési eredményeken keresztül, de az searchFields egyetlen olyan találatok kiemelése, amelyek a leginkább szemantikailag igazodnak a találatokhoz "search":"mystery novel set in London".

Feljegyzés

A vektorosítókat az indexelés és a lekérdezés során használják. Ha nincs szüksége adatrészletezésre és vektorizálásra az indexben, kihagyhatja az olyan lépéseket, mint az indexelő, a képességkészlet és az adatforrás létrehozása. Ebben a forgatókönyvben a vektorizálót csak lekérdezési időpontban használja a szöveges sztring beágyazássá alakításához.

A rangsorolt eredmények mennyisége vektoros lekérdezési válaszban

A vektoros lekérdezés megadja a k paramétert, amely meghatározza, hogy hány találatot ad vissza az eredmény. A keresőmotor mindig a találatok k számát adja vissza. Ha k nagyobb, mint az indexben lévő dokumentumok száma, akkor a dokumentumok száma határozza meg a visszaadható dokumentumok felső korlátját.

Ha ismeri a teljes szöveges keresést, akkor nulla eredményt vár, ha az index nem tartalmaz kifejezést vagy kifejezést. A vektoros keresésben azonban a keresési művelet a legközelebbi szomszédokat azonosítja, és mindig eredményeket ad vissza k , még akkor is, ha a legközelebbi szomszédok nem hasonlóak. Így előfordulhat, hogy nem etikátlan vagy nem témakörön kívüli lekérdezések eredményei jelennek meg, különösen akkor, ha nem használ utasításokat a határok megadásához. A kevésbé releváns eredmények rosszabb hasonlósági pontszámmal rendelkeznek, de még mindig ezek a "legközelebbi" vektorok, ha nincs közelebb semmi. Így a nem értelmezhető eredményekkel rendelkező válaszok továbbra is eredményeket adhatnak vissza k , de az egyes eredmények hasonlósági pontszáma alacsony lenne.

A teljes szöveges keresést tartalmazó hibrid megközelítés enyhítheti ezt a problémát. Egy másik kockázatcsökkentés a keresési pontszám minimális küszöbértékének beállítása, de csak akkor, ha a lekérdezés egy tiszta egyvektoros lekérdezés. A hibrid lekérdezések nem kedveznek a minimális küszöbértékeknek, mert az RRF-tartományok sokkal kisebbek és változékonyak.

Az eredményszámot befolyásoló lekérdezési paraméterek a következők:

  • "k": n csak vektoros lekérdezések eredményei
  • "top": n keresési paramétert tartalmazó hibrid lekérdezések eredményei

A "k" és a "top" is választható. Meghatározatlan, a válaszban szereplő eredmények alapértelmezett száma 50. A "top" és a "skip" beállítással több találatot is megadhat, vagy módosíthatja az alapértelmezett értéket .

Vektoros lekérdezésekben használt rangsorolási algoritmusok

Az eredmények rangsorolása az alábbiak szerint történik:

  • Hasonlóság metrika
  • Reciprok Rank Fusion (RRF), ha több keresési találat van.

Hasonlóság metrika

A csak vektoros lekérdezés indexszakaszában vectorSearch megadott hasonlósági metrika. Az érvényes értékek a következők cosine: , euclideanés dotProduct.

Az Azure OpenAI-beágyazási modellek koszinuszos hasonlóságot használnak, ezért ha Azure OpenAI-beágyazási modelleket használ, cosine az ajánlott metrika. Egyéb támogatott rangsorolási metrikák a következők: euclidean és dotProduct.

Az RRF használata

Több halmaz akkor jön létre, ha a lekérdezés több vektormezőt céloz meg, több vektoros lekérdezést futtat párhuzamosan, vagy ha a lekérdezés vektoros és teljes szöveges keresés hibridje, szemantikai rangsorolással vagy anélkül.

A lekérdezés végrehajtása során a vektoros lekérdezések csak egy belső vektorindexet célozhatnak meg. Így több vektormező és több vektoros lekérdezés esetén a keresőmotor több lekérdezést hoz létre, amelyek az egyes mezők megfelelő vektorindexeit célják. A kimenet az egyes lekérdezések rangsorolt eredményeinek halmaza, amelyek az RRF használatával vannak egyesítve. További információ: Relevanciapontozás a Kölcsönös rangsor fúzió (RRF) használatával.

Következő lépések

Következő lépésként tekintse át a vektoros lekérdezési kód példáit Pythonban, C# vagy JavaScriptben.