Dela via


Vektorarkiv i Azure Cosmos DB för MongoDB vCore

Använd den integrerade vektordatabasen i Azure Cosmos DB for MongoDB (vCore) för att sömlöst ansluta dina AI-baserade program till dina data som lagras i Azure Cosmos DB. Den här integreringen kan omfatta appar som du har skapat med hjälp av Azure OpenAI-inbäddningar. Med den inbyggda integrerade vektordatabasen kan du effektivt lagra, indexeras och köra frågor mot högdimensionella vektordata som lagras direkt i Azure Cosmos DB for MongoDB (vCore), tillsammans med de ursprungliga data som vektordata skapas från. Det eliminerar behovet av att överföra dina data till alternativa vektorlager och medför ytterligare kostnader.

Vad är ett vektorlager?

Ett vektorlager eller en vektordatabas är en databas som är utformad för att lagra och hantera inbäddningar av vektorer, som är matematiska representationer av data i ett högdimensionellt utrymme. I det här utrymmet motsvarar varje dimension en funktion i data och tiotusentals dimensioner kan användas för att representera avancerade data. En vektors position i det här utrymmet representerar dess egenskaper. Ord, fraser eller hela dokument och bilder, ljud och andra typer av data kan alla vektoriseras.

Hur fungerar ett vektorlager?

I ett vektorlager används algoritmer för vektorsökning för att indexera och fråga inbäddningar. Några välkända vektorsökningsalgoritmer är HNSW (Hierarchical Navigable Small World), Inverted File (IVF), DiskANN osv. Vektorsökning är en metod som hjälper dig att hitta liknande objekt baserat på deras dataegenskaper i stället för exakta matchningar i ett egenskapsfält. Den här tekniken är användbar i program som att söka efter liknande text, hitta relaterade bilder, göra rekommendationer eller till och med identifiera avvikelser. Den används för att fråga vektorinbäddningar (listor med siffror) för dina data som du skapade med hjälp av en maskininlärningsmodell med hjälp av ett INBÄDDNINGS-API. Exempel på API:er för inbäddningar är Azure OpenAI-inbäddningar eller Hugging Face på Azure. Vektorsökning mäter avståndet mellan datavektorerna och frågevektorn. De datavektorer som är närmast din frågevektor är de som är mest lika semantiskt.

I den integrerade vektordatabasen i Azure Cosmos DB for MongoDB (vCore) kan inbäddningar lagras, indexeras och efterfrågas tillsammans med de ursprungliga data. Den här metoden eliminerar den extra kostnaden för att replikera data i en separat ren vektordatabas. Dessutom håller den här arkitekturen samman vektorbäddningar och ursprungliga data, vilket bättre underlättar multimodala dataåtgärder och ger bättre datakonsekvens, skalning och prestanda.

Azure Cosmos DB for MongoDB (vCore) ger robusta vektorsökningsfunktioner, så att du kan utföra sökningar med höghastighetslikhet i komplexa datauppsättningar. Om du vill utföra vektorsökning i Azure Cosmos DB för MongoDB måste du först skapa ett vektorindex. Cosmos DB stöder för närvarande tre typer av vektorindex:

  • DiskANN (rekommenderas): Perfekt för storskaliga datauppsättningar, med hjälp av SSD:er för effektiv minnesanvändning samtidigt som hög återkallning upprätthålls i ungefärliga ann-sökningar (närmaste granne).
  • HNSW: Passar för medelstora datamängder som behöver hög träffsäkerhet, med en grafbaserad struktur som balanserar noggrannhet och resurseffektivitet.
  • IVF: Använder klustring för att optimera sökhastigheten i expansiva datamängder, med fokus på sökningar i målkluster för att få snabbare prestanda.

DiskANN-index är tillgängliga på M40-nivåer och senare. Om du vill skapa DiskANN-indexet anger du parametern "kind" till "vector-diskann" följande mall nedan:

{ 
    "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>, 
            } 
        } 
    ] 
}
Fält Type Description
index_name sträng Unikt namn på indexet.
path_to_property sträng Sökväg till egenskapen som innehåller vektorn. Den här sökvägen kan vara en toppnivåegenskap eller en punkt notationssökväg till egenskapen. Vektorer måste vara en number[] som ska indexeras och användas i vektorsökningsresultat. Om du använder en annan typ, till exempel double[], förhindras dokumentet från att indexeras. Icke-indexerade dokument returneras inte i resultatet av en vektorsökning.
kind sträng Typ av vektorindex som ska skapas. Alternativen är vector-ivf, vector-hnswoch vector-diskann.
dimensions integer Antal dimensioner för vektorlikhet. DiskANN stöder upp till 2 000 dimensioner och framtida stöd planeras för 40 000+.
similarity sträng Likhetsmått att använda med indexet. Möjliga alternativ är COS (cosinusavstånd), L2 (Euklidiska avstånd) och IP (inre produkt).
maxDegree integer Maximalt antal kanter per nod i diagrammet. Den här parametern sträcker sig från 20 till 2048 (standardvärdet är 32). Högre maxDegree är lämpligt för datauppsättningar med höga krav på dimensionalitet och/eller hög noggrannhet.
lBuild integer Anger antalet kandidatgrannarna som utvärderas under indexkonstruktionen i DiskANN. Den här parametern, som sträcker sig från 10 till 500 (standardvärdet är 50), balanserar noggrannhet och beräkningskostnader: högre värden förbättrar indexkvaliteten och noggrannheten men ökar byggtiden

Utföra en vektorsökning med DiskANN

Om du vill utföra en vektorsökning använder du $search sammansättningens pipelinesteg och frågar med operatorn cosmosSearch . DiskANN tillåter högpresterande sökningar över massiva datauppsättningar med valfri filtrering, till exempel geospatiala eller textbaserade filter.

{
  "$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>]}}}
      ]}
    }
  }
},
Fält Type Beskrivning
lSearch integer Anger storleken på den dynamiska kandidatlistan för sökning. Standardvärdet är 40, med ett konfigurerbart intervall från 10 till 1000. Att öka värdet förbättrar återkallandet men kan minska sökhastigheten.
k integer Definierar antalet sökresultat som ska returneras. Värdet k måste vara mindre än eller lika med lSearch.

Aktivera DiskANN på ett nytt kluster

Om du vill aktivera DiskANN Vector Index på ett nyligen etablerat Azure Cosmos DB for MongoDB-kluster (vCore) följer du dessa steg för att utföra en registrering på klusternivå via Azure CLI:

  1. Logga in på Azure CLI
az login
  1. Hämta de aktuella inställningarna för funktionsflaggor i klustret. Detta säkerställer att du behåller alla befintliga flaggor när du lägger till den nya funktionen.
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. Lägg till flaggan i DiskANNIndex listan över förhandsgranskningsfunktioner utan att ta bort några befintliga.
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\"]}" 

Exempel med ett DiskANN-index med filtrering

Lägga till vektorer i databasen

Om du vill använda vektorsökning med geospatiala filter lägger du till dokument som innehåller både vektorinbäddningar och platskoordinater. Du kan skapa inbäddningarna med hjälp av din egen modell, Azure OpenAI-inbäddningar eller ett annat API (till exempel Hugging Face on Azure).

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)

Skapa ett DiskANN-vektorindex

I följande exempel visas hur du konfigurerar ett DiskANN-vektorindex med filtreringsfunktioner. Detta inkluderar att skapa vektorindexet för likhetssökning, lägga till dokument med vektor- och geospatiala egenskaper och indexeringsfält för ytterligare filtrering.

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

Det här kommandot skapar ett DiskANN-vektorindex på contentVector fältet i exampleCollection, vilket möjliggör likhetssökningar. Den lägger också till:

  • Ett index för fältet is_open så att du kan filtrera resultat baserat på om företag är öppna.
  • Ett geospatialt index på fältet location för att filtrera efter geografisk närhet.

Om du vill hitta dokument med liknande vektorer inom en specifik geografisk radie anger du queryVector för likhetssökning och inkluderar ett geospatialt filter.

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)

I det här exemplet returnerar vektorlikhetssökningen de översta k närmaste vektorerna baserat på det angivna COS likhetsmåttet, samtidigt som resultaten filtreras så att de endast omfattar öppna företag inom en radie på 100 mil.

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

Det här resultatet visar de vanligaste liknande dokumenten som queryVector, begränsade till en radie på 160 mil och öppna företag. Varje resultat innehåller likhetspoäng och metadata som visar hur DiskANN i Cosmos DB för MongoDB stöder kombinerade vektor- och geospatiala frågor för berikade, platskänsliga sökupplevelser.

Hämta definitioner för vektorindex

Om du vill hämta vektorindexdefinitionen från samlingen använder du listIndexes kommandot:

db.exampleCollection.getIndexes();

I det här exemplet vectorIndex returneras med alla cosmosSearch parametrar som användes för att skapa indexet:

[
  { 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'
  }
]

Filtrerad vektorsökning (förhandsversion)

Nu kan du köra vektorsökningar med valfritt frågefilter som stöds, till exempel $lt, $lte, $eq, $neq$gte, $gt, $in, $ninoch $regex. Aktivera funktionen "filtreringsvektorsökning" på fliken Förhandsversionsfunktioner i din Azure-prenumeration. Läs mer om förhandsversionsfunktioner här.

Först måste du definiera ett index för filtret utöver ett vektorindex. Du kan till exempel definiera filterindexet för en egenskap

db.runCommand({ 
     "createIndexes": "<collection_name",
    "indexes": [ {
        "key": { 
            "<property_to_filter>": 1 
               }, 
        "name": "<name_of_filter_index>" 
    }
    ] 
});

Sedan kan du lägga till termen i vektorsökningen "filter" enligt nedan. I det här exemplet letar filtret efter dokument där "title" egenskapen inte finns i listan med ["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' }
}
]);

Viktigt!

I förhandsversionen kan filtrerad vektorsökning kräva att du justerar vektorindexparametrarna för att uppnå högre noggrannhet. Om du till exempel ökar m, , eller efSearch när du använder HNSW eller numLists, eller nProbes när du använder IVF, kan det leda efConstructiontill bättre resultat. Du bör testa konfigurationen innan du använder den för att säkerställa att resultaten är tillfredsställande.

Använda VERKTYG FÖR LLM-orkestrering

Använda som vektordatabas med semantisk kernel

Använd semantisk kernel för att orkestrera din informationshämtning från Azure Cosmos DB för MongoDB vCore och din LLM. Läs mer här.

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

Använda som vektordatabas med LangChain

Använd LangChain för att samordna din informationshämtning från Azure Cosmos DB för MongoDB vCore och din LLM. Läs mer här.

Använda som en semantisk cache med LangChain

Använd LangChain och Azure Cosmos DB for MongoDB (vCore) för att orkestrera semantisk cachelagring med hjälp av tidigare inspelade LLM-svar som kan spara kostnader för LLM API och minska svarstiden. Läs mer här

Funktioner och begränsningar

  • Avståndsmått som stöds: L2 (Euklidiska), inre produkt och cosinus.
  • Indexeringsmetoder som stöds: IVFFLAT, HNSW och DiskANN (förhandsversion)
  • Indexeringsvektorer upp till 2 000 dimensioner i storlek.
  • Indexering gäller endast för en vektor per sökväg.
  • Endast ett index kan skapas per vektorsökväg.

Sammanfattning

Den här guiden visar hur du skapar ett vektorindex, lägger till dokument som har vektordata, utför en likhetssökning och hämtar indexdefinitionen. Med hjälp av vår integrerade vektordatabas kan du effektivt lagra, indexeras och köra frågor mot högdimensionella vektordata direkt i Azure Cosmos DB för MongoDB vCore. Det gör att du kan frigöra den fulla potentialen för dina data via vektorbäddningar, och det ger dig möjlighet att skapa mer exakta, effektiva och kraftfulla program.

Gå vidare