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
Azure AI Search, bármely régióban és bármilyen szinten.
A Visual Studio Code rest-ügyféllel és mintaadatokkal, ha ezeket a példákat önállóan szeretné futtatni. Az első lépésekhez tekintse meg a rövid útmutatót: Azure AI Search a REST használatával.
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ássalvector
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 contentVector
fut, 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 visszak
, feltéve, hogy legalábbk
dokumentumok léteznek, még akkor is, ha vannak rossz hasonlóságú dokumentumok, mivel az algoritmus megkeresik
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 egyselect
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ármelyretrievable
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 myImageVector
myTextVector
, 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 descriptionVector
synopsisVector
é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.