Megosztás a következőn keresztül:


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é.

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 40konfigurá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 lSearchkell 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:

  1. Bejelentkezés az Azure CLI-be
az login
  1. 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>
  1. 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.

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 queryVectorkapcsoló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őmefConstruction, illetve efSearch a HNSW-t numListshaszná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.

https://github.com/microsoft/semantic-kernel/tree/main/python/semantic_kernel/connectors/memory/azure_cosmosdb

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.

Következő lépés