Vektortároló az Azure Cosmos DB for MongoDB virtuális magban
Az Azure Cosmos DB for MongoDB(vCore) integrált vektoradatbázisával zökkenőmentesen csatlakoztathatja AI-alapú alkalmazásait az Azure Cosmos DB-ben tárolt adatokhoz. Ez az integráció az Azure OpenAI-beágyazások használatával létrehozott alkalmazásokat is tartalmazhat. A natívan integrált vektoradatbázissal hatékonyan tárolhatja, indexelheti és lekérdezheti a közvetlenül a MongoDB-hez készült Azure Cosmos DB-ben (vCore) tárolt nagy dimenziójú vektoradatokat, valamint azokat az eredeti adatokat, amelyekből a vektoradatok létrejönnek. Ez szükségtelenné teszi az adatok alternatív vektortárolókba való átvitelét, és további költségekkel jár.
Mi az a vektortároló?
A vektortárolók vagy vektoradatbázisok vektoros beágyazások tárolására és kezelésére szolgáló adatbázisok, amelyek nagy dimenziójú térben lévő adatok matematikai ábrázolásai. Ebben a térben minden dimenzió megfelel az adatok egy funkciójának, és több tízezer dimenzió használható kifinomult adatok megjelenítésére. A vektor pozíciója ebben a térben annak jellemzőit jelöli. Szavak, kifejezések vagy teljes dokumentumok, képek, hang és más típusú adatok mind vektorizálhatók.
Hogyan működik a vektortároló?
A vektortárakban a vektorkeresési algoritmusok a beágyazások indexelésére és lekérdezésére szolgálnak. Néhány jól ismert vektorkeresési algoritmus a hierarchikus Navigable Small World (HNSW), az Inverted File (IVF), a DiskANN stb. A vektoros keresés egy olyan módszer, amely segít megtalálni a hasonló elemeket az adattulajdonságuk alapján, nem pedig egy tulajdonságmező pontos egyezései alapján. Ez a technika olyan alkalmazásokban hasznos, mint a hasonló szövegek keresése, a kapcsolódó képek keresése, javaslatok készítése vagy akár a rendellenességek észlelése. A rendszer a gépi tanulási modellel létrehozott adatok vektoros beágyazásait (számlistáit) kérdezi le egy beágyazási API használatával. A beágyazási API-k például az Azure OpenAI-beágyazások vagy a Face ölelése az Azure-ban. A vektorkeresés az adatvektorok és a lekérdezésvektor közötti távolságot méri. A lekérdezésvektorhoz legközelebb eső adatvektorok azok, amelyek szemantikailag a leginkább hasonlítanak.
Az Azure Cosmos DB for MongoDB(vCore) integrált vektoradatbázisában a beágyazások az eredeti adatok mellett tárolhatók, indexelhetők és lekérdezhetők. Ez a módszer kiküszöböli az adatok egy különálló, tiszta vektoradatbázisban való replikálásának többletköltségét. Emellett ez az architektúra együtt tartja a vektoros beágyazásokat és az eredeti adatokat, ami jobban megkönnyíti a több modális adatműveleteket, és nagyobb adatkonzisztenciát, skálázást és teljesítményt tesz lehetővé.
Vektoros hasonlóság keresésének végrehajtása
A MongoDB-hez készült Azure Cosmos DB (vCore) robusztus vektorkeresési képességeket biztosít, lehetővé téve a nagy sebességű hasonlósági kereséseket összetett adathalmazok között. Ha vektorkeresést szeretne végezni a MongoDB-hez készült Azure Cosmos DB-ben, először létre kell hoznia egy vektorindexet. A Cosmos DB jelenleg háromféle vektorindexet támogat:
- DiskANN (ajánlott): Ideális nagy méretű adathalmazokhoz, SSD-k használata a hatékony memóriahasználat érdekében, miközben magas visszahívást biztosít a legközelebbi szomszéd (ANN) keresésekben.
- HNSW: Közepes méretű, nagy visszahívást igénylő adathalmazokhoz alkalmas, gráfalapú szerkezettel, amely egyensúlyba hozja a pontosságot és az erőforrás-hatékonyságot.
- IVF: A fürtözés használatával optimalizálja a keresési sebességet a nagy kiterjedésű adathalmazokban, és a célzott fürtökön belüli keresésekre összpontosít a teljesítmény felgyorsítása érdekében.
A DiskANN-indexek M40-szinteken és magasabb szinteken érhetők el. A DiskANN-index létrehozásához állítsa a paramétert "kind"
az alábbi sablon követésére "vector-diskann"
:
{
"createIndexes": "<collection_name>",
"indexes": [
{
"name": "<index_name>",
"key": {
"<path_to_property>": "cosmosSearch"
},
"cosmosSearchOptions": {
"kind": "vector-diskann",
"dimensions": <integer_value>,
"similarity": <string_value>,
"maxDegree" : <integer_value>,
"lBuild" : <integer_value>,
}
}
]
}
Mező | Típus | Leírás |
---|---|---|
index_name |
húr | Az index egyedi neve. |
path_to_property |
húr | A vektort tartalmazó tulajdonság elérési útja. Ez az elérési út lehet legfelső szintű tulajdonság vagy pont jelölési útvonal a tulajdonsághoz. A vektoroknak indexelendőnek kell lenniük number[] , és a vektorkeresési eredményekben kell használniuk. Egy másik típus, például double[] a dokumentum indexelésének megakadályozása. A nem indexelt dokumentumok nem lesznek visszaadva vektorkeresés eredményeként. |
kind |
húr | A létrehozandó vektorindex típusa. A beállítások a következők vector-ivf : , vector-hnsw és vector-diskann . |
dimensions |
egész szám | A vektoros hasonlóság dimenzióinak száma. A DiskANN legfeljebb 2000 dimenziót támogat, és a jövőbeli támogatás 40 000-et tervez. |
similarity |
húr | Hasonlósági metrika az indexhez. Lehetséges lehetőségek a COS következők: (koszinusz távolság), L2 (euklideszi távolság) és IP (belső termék). |
maxDegree |
egész szám | Csomópontonkénti élek maximális száma a gráfban. Ez a paraméter 20 és 2048 közötti (alapértelmezés szerint 32). A magasabb maxDegree a nagy mérettel és/vagy nagy pontossági követelményekkel rendelkező adathalmazokhoz alkalmas. |
lBuild |
egész szám | Beállítja a DiskANN-index felépítése során kiértékelt jelölt szomszédok számát. Ez a 10 és 500 közötti (alapértelmezés szerint 50) paraméter a pontosságot és a számítási többletterhelést egyensúlyba hozza: a magasabb értékek javítják az index minőségét és pontosságát, de növelik a létrehozási időt |
Vektorkeresés végrehajtása a DiskANN használatával
Vektorkeresés végrehajtásához használja az $search
aggregációs folyamat szakaszát, és kérdezze le az cosmosSearch
operátort. A DiskANN nagy teljesítményű keresést tesz lehetővé nagy teljesítményű adathalmazokban opcionális szűréssel, például térinformatikai vagy szövegalapú szűrőkkel.
{
"$search": {
"cosmosSearch": {
"path": "<path_to_property>",
"query": "<query_vector>",
"k": <num_results_to_return>,
"filter": {"$and": [
{ "<attribute_1>": { "$eq": <value> } },
{"<location_attribute>": {"$geoWithin": {"$centerSphere":[[<longitude_integer_value>, <latitude_integer_value>], <radius>]}}}
]}
}
}
},
Mező | Típus | Leírás |
---|---|---|
lSearch |
egész szám | Megadja a keresési dinamikus jelöltlista méretét. Az alapértelmezett érték a 40 konfigurálható tartomány : .10 1000 Az érték növelése javítja a visszahívást, de csökkentheti a keresési sebességet. |
k |
egész szám | Meghatározza a visszaadni kívánt keresési eredmények számát. Az k értéknek kisebbnek vagy egyenlőnek lSearch kell lennie. |
A DiskANN engedélyezése új fürtön
Ha engedélyezni szeretné a DiskANN Vector Indexet egy újonnan kiépített Azure Cosmos DB for MongoDB (vCore) fürtön, kövesse az alábbi lépéseket egy fürtszintű regisztráció végrehajtásához az Azure CLI-n keresztül:
- Bejelentkezés az Azure CLI-be
az login
- Kérje le a fürt szolgáltatásjelzőinek aktuális beállításait. Ez biztosítja, hogy az új funkció hozzáadásakor megőrizze a meglévő jelzőket.
az resource show --ids "/subscriptions/<sub id>/resourceGroups/<resource group name>/providers/Microsoft.DocumentDB/mongoClusters/<resource name of your Cosmos DB for MongoDB cluster>" --api-version <cluster's api version>
- Vegye fel a jelzőt
DiskANNIndex
az előzetes verziójú funkciók listájára a meglévők eltávolítása nélkül.
az resource patch --ids "/subscriptions/<sub id>/resourceGroups/<resource group name>/providers/Microsoft.DocumentDB/mongoClusters/<resource name of your Cosmos DB for MongoDB cluster>" --api-version <cluster's api version> --properties "{\"previewFeatures\": [\"GeoReplicas\", \"DiskANNIndex\"]}"
Példa a DiskANN-index szűréssel való használatára
Vektorok hozzáadása az adatbázishoz
Ha térinformatikai szűrőkkel szeretné használni a vektorkeresést, adjon hozzá olyan dokumentumokat, amelyek vektorbeágyazást és helykoordinátát is tartalmaznak. A beágyazásokat saját modellel, Azure OpenAI-beágyazással vagy egy másik API-val (például a Face azure-beli ölelésével) hozhatja létre.
from pymongo import MongoClient
client = MongoClient("<your_connection_string>")
db = client["test"]
collection = db["testCollection"]
documents = [
{"name": "Eugenia Lopez", "bio": "CEO of AdventureWorks", "is_open": 1, "location": [-118.9865, 34.0145], "contentVector": [0.52, 0.20, 0.23]},
{"name": "Cameron Baker", "bio": "CFO of AdventureWorks", "is_open": 1, "location": [-0.1278, 51.5074], "contentVector": [0.55, 0.89, 0.44]},
{"name": "Jessie Irwin", "bio": "Director of Our Planet initiative", "is_open": 0, "location": [-118.9865, 33.9855], "contentVector": [0.13, 0.92, 0.85]},
{"name": "Rory Nguyen", "bio": "President of Our Planet initiative", "is_open": 1, "location": [-119.0000, 33.9855], "contentVector": [0.91, 0.76, 0.83]}
]
collection.insert_many(documents)
DiskANN-vektorindex létrehozása
Az alábbi példa bemutatja, hogyan állíthat be Egy DiskANN-vektorindexet szűrési képességekkel. Ez magában foglalja a vektorindex létrehozását a hasonlóság kereséséhez, a vektor- és térinformatikai tulajdonságokkal rendelkező dokumentumok hozzáadását, valamint a további szűréshez szükséges mezők indexelését.
db.command({
"createIndexes": "testCollection",
"indexes": [
{
"name": "DiskANNVectorIndex",
"key": {
"contentVector": "cosmosSearch"
},
"cosmosSearchOptions": {
"kind": "vector-diskann",
"dimensions": 3,
"similarity": "COS",
"maxDegree": 32,
"lBuild": 64
}
},
{
"name": "is_open",
"key": {
"is_open": 1
}
},
{
"name": "locationIndex",
"key": {
"location": 1
}
}
]
})
Ez a parancs létrehoz egy DiskANN-vektorindexet a contentVector
mezőn exampleCollection
, amely lehetővé teszi a hasonlósági kereséseket. A következőt is hozzáadja:
- A mező indexe
is_open
, amely lehetővé teszi az eredmények szűrését attól függően, hogy a vállalkozások nyitottak-e. - Térinformatikai index a mezőn a
location
földrajzi közelség alapján történő szűréshez.
Vektorkeresés végrehajtása
Ha hasonló vektorokkal rendelkező dokumentumokat szeretne megkeresni egy adott földrajzi sugaron belül, adja meg a queryVector
hasonlóság keresését, és adjon meg egy térinformatikai szűrőt.
query_vector = [0.52, 0.28, 0.12]
pipeline = [
{
"$search": {
"cosmosSearch": {
"path": "contentVector",
"vector": query_vector,
"k": 5,
"filter": {
"$and": [
{"is_open": {"$eq": 1}},
{"location": {"$geoWithin": {"$centerSphere": [[-119.7192861804, 34.4102485028], 100 / 3963.2]}}}
]
}
}
}
}
]
results = list(collection.aggregate(pipeline))
for result in results:
print(result)
Ebben a példában a vektor-hasonlósági keresés a megadott COS
hasonlósági metrika alapján adja vissza a legközelebbi k
legközelebbi vektorokat, az eredmények szűrése pedig csak a 100 mérföldes körzeten belüli nyitott vállalkozásokat foglalja magában.
[
{
similarityScore: 0.9745354109084544,
document: {
_id: ObjectId("645acb54413be5502badff94"),
name: 'Eugenia Lopez',
bio: 'CEO of AdventureWorks',
is_open: 1,
location: [-118.9865, 34.0145],
contentVector: [0.52, 0.20, 0.23]
}
},
{
similarityScore: 0.9006955671333992,
document: {
_id: ObjectId("645acb54413be5502badff97"),
name: 'Rory Nguyen',
bio: 'President of Our Planet initiative',
is_open: 1,
location: [-119.7302, 34.4005],
contentVector: [0.91, 0.76, 0.83]
}
}
]
Ez az eredmény a 100 mérföldes körzetre korlátozott és a nyitott vállalkozásokhoz queryVector
kapcsolódó legfontosabb dokumentumokat jeleníti meg. Minden eredmény tartalmazza a hasonlósági pontszámot és a metaadatokat, bemutatva, hogyan támogatja a DiskANN a MongoDB-hez készült Cosmos DB-ben a kombinált vektor- és térinformatikai lekérdezéseket a gazdagított, helyérzékeny keresési szolgáltatásokhoz.
Vektorindex-definíciók lekérése
A vektorindex definíciójának gyűjteményből való lekéréséhez használja a listIndexes
következő parancsot:
db.exampleCollection.getIndexes();
Ebben a példában vectorIndex
a rendszer visszaadja az cosmosSearch
index létrehozásához használt összes paramétert:
[
{ v: 2, key: { _id: 1 }, name: '_id_', ns: 'test.exampleCollection' },
{
v: 2,
key: { vectorContent: 'cosmosSearch' },
name: 'vectorSearchIndex',
cosmosSearch: {
kind: <index_type>, // options are `vector-ivf`, `vector-hnsw`, and `vector-diskann`
numLists: 3,
similarity: 'COS',
dimensions: 3
},
ns: 'test.exampleCollection'
}
]
Szűrt vektorkeresés (előzetes verzió)
Mostantól bármilyen támogatott lekérdezésszűrővel futtathat vektorkereséseket, például $lt
, $lte
, $eq
, $neq
, $gte
, $gt
, $in
$nin
, és $regex
. Engedélyezze a "szűrési vektorkeresés" funkciót az Azure-előfizetés "Előzetes verziójú szolgáltatások" lapján. Az előzetes verziójú funkciókról itt olvashat bővebben.
Először meg kell határoznia egy indexet a szűrőhöz a vektorindex mellett. Definiálhatja például a szűrőindexet egy tulajdonságon
db.runCommand({
"createIndexes": "<collection_name",
"indexes": [ {
"key": {
"<property_to_filter>": 1
},
"name": "<name_of_filter_index>"
}
]
});
Ezután hozzáadhatja a kifejezést a "filter"
vektorkereséshez az alább látható módon. Ebben a példában a szűrő olyan dokumentumokat keres, ahol a "title"
tulajdonság nem szerepel a listán ["not in this text", "or this text"]
.
db.exampleCollection.aggregate([
{
'$search': {
"cosmosSearch": {
"vector": "<query_vector>",
"path": <path_to_vector>,
"k": num_results,
"filter": {<property_to_filter>: {"$nin": ["not in this text", "or this text"]}}
},
"returnStoredSource": True }},
{'$project': { 'similarityScore': { '$meta': 'searchScore' }, 'document' : '$$ROOT' }
}
]);
Fontos
Az előzetes verzióban a szűrt vektorkereséshez szükség lehet a vektorindex paramétereinek módosítására a nagyobb pontosság érdekében. A HNSW vagy az nProbes
IVF használata esetén például a növekvőm
efConstruction
, illetve efSearch
a HNSW-t numLists
használók jobb eredményekhez vezethetnek. Használat előtt tesztelje a konfigurációt, hogy az eredmények megfelelőek legyenek.
LLM Vezénylési eszközök használata
Vektoradatbázisként való használat szemantikus kernellel
A Szemantic Kernel használatával vezényli az adatok lekérését az Azure Cosmos DB-ből MongoDB virtuális maghoz és az LLM-hez. További tájékoztatást itt olvashat.
Vektoradatbázisként való használat a LangChainnel
A LangChain használatával vezényli az adatok lekérését az Azure Cosmos DB-ből MongoDB virtuális maghoz és az LLM-hez. További tájékoztatást itt olvashat.
Szemantikai gyorsítótárként való használat a LangChainnel
A LangChain és az Azure Cosmos DB for MongoDB (vCore) használatával vezényli a szemantikai gyorsítótárazást, a korábban rögzített LLM-válaszokat használva, amelyekkel mentheti az LLM API költségeit, és csökkentheti a válaszok késését. További információ itt
Szolgáltatások és korlátozások
- Támogatott távolságmetrikák: L2 (Euklideszi), belső termék és koszinusz.
- Támogatott indexelési módszerek: IVFFLAT, HNSW és DiskANN (előzetes verzió)
- Legfeljebb 2000 dimenzió méretű vektorok indexelése.
- Az indexelés útvonalonként csak egy vektorra vonatkozik.
- Vektorútvonalonként csak egy index hozható létre.
Összegzés
Ez az útmutató bemutatja, hogyan hozhat létre vektorindexet, adhat hozzá vektoradatokat tartalmazó dokumentumokat, végezhet hasonlósági keresést, és hogyan kérdezheti le az indexdefiníciót. Az integrált vektoradatbázis használatával hatékonyan tárolhatja, indexelheti és lekérdezheti a nagy dimenziójú vektoradatokat közvetlenül az Azure Cosmos DB for MongoDB virtuális magjában. Lehetővé teszi az adatok teljes potenciáljának kihasználását vektoros beágyazásokon keresztül, és lehetővé teszi, hogy pontosabb, hatékonyabb és hatékonyabb alkalmazásokat hozzon létre.
Kapcsolódó tartalom
- .NET RAG Minta kiskereskedelmi referenciamegoldás
- .NET-oktatóanyag – recept csevegőrobot
- C# RAG-minta – OpenAI-szolgáltatások integrálása a Cosmossal
- Python RAG-minta – Azure-termék csevegőrobotja
- Python-jegyzetfüzet-oktatóanyag – Vektoradatbázis-integráció a LangChain használatával
- Python-jegyzetfüzet-oktatóanyag – LLM-gyorsítótárazási integráció a LangChain használatával
- Python – LlamaIndex-integráció
- Python – Szemantikus kernelmemória-integráció