Share via


Vector Store i Azure Cosmos DB för MongoDB vCore

GÄLLER FÖR: MongoDB vCore

Använd den integrerade vektordatabasen i Azure Cosmos DB for MongoDB vCore för att smidigt 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.

Skapa ett vektorindex

Om du vill utföra vektorsimiliaritetssökning över vektoregenskaper i dina dokument måste du först skapa ett vektorindex.

Skapa ett vektorindex med HNSW

Du kan skapa (hierarkisk navigeringsbar liten värld) index på M40-klusternivåer och högre. Om du vill skapa HSNW-indexet måste du skapa ett vektorindex med parametern "kind" inställd på att "vector-hnsw" följa mallen nedan:

{ 
    "createIndexes": "<collection_name>",
    "indexes": [
        {
            "name": "<index_name>",
            "key": {
                "<path_to_property>": "cosmosSearch"
            },
            "cosmosSearchOptions": { 
                "kind": "vector-hnsw", 
                "m": <integer_value>, 
                "efConstruction": <integer_value>, 
                "similarity": "<string_value>", 
                "dimensions": <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. Om en punkt notation sökväg används, kan alla icke-af element inte vara matriser. Vektorer måste vara en number[] som ska indexeras och returneras i vektorsökningsresultat.
kind sträng Typ av vektorindex som ska skapas. Alternativen är vector-ivf och vector-hnsw. Obs! vector-ivf Är tillgängligt på alla klusternivåer och vector-hnsw är tillgängligt på M40-klusternivåer och högre.
m integer Det maximala antalet anslutningar per lager (16 som standard är 2det lägsta värdet , maxvärdet är 100). Högre m lämpar sig för datamängder med hög dimensionalitet och/eller höga noggrannhetskrav.
efConstruction integer storleken på den dynamiska kandidatlistan för att konstruera grafen (64 som standard är 4det lägsta värdet , maxvärdet är 1000). Högre efConstruction ger bättre indexkvalitet och högre noggrannhet, men det ökar också den tid som krävs för att skapa indexet. efConstruction måste vara minst 2 * m
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).
dimensions integer Antal dimensioner för vektorlikhet. Det maximala antalet dimensioner som stöds är 2000.

Utföra en vektorsökning med HNSW

Om du vill utföra en vektorsökning använder du $search aggregeringspipelinesteget för frågan med operatorn cosmosSearch .

{
    "$search": {
        "cosmosSearch": {
            "vector": <query_vector>,
            "path": "<path_to_property>",
            "k": <num_results_to_return>,
            "efSearch": <integer_value>
        },
    }
  }
}

Fält Type Beskrivning
efSearch integer Storleken på den dynamiska kandidatlistan för sökning (40 som standard). Ett högre värde ger bättre träffsäkerhet på bekostnad av hastigheten.
k integer Antalet resultat som ska returneras. den ska vara mindre än eller lika med efSearch

Kommentar

Om du skapar ett HSNW-index med stora datamängder kan det leda till att din Azure Cosmos DB for MongoDB vCore-resurs får slut på minne eller kan begränsa prestandan för andra åtgärder som körs i databasen. Om du stöter på sådana problem kan du minska dessa genom att skala resursen till en högre klusternivå eller minska datamängdens storlek.

Skapa ett vektorindex med IVF

Om du vill skapa ett vektorindex med ivf-algoritmen (inverterad fil) använder du följande createIndexes mall och anger paramtern "kind" till "vector-ivf":

{
  "createIndexes": "<collection_name>",
  "indexes": [
    {
      "name": "<index_name>",
      "key": {
        "<path_to_property>": "cosmosSearch"
      },
      "cosmosSearchOptions": {
        "kind": "vector-ivf",
        "numLists": <integer_value>,
        "similarity": "<string_value>",
        "dimensions": <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. Om en punkt notation sökväg används, kan alla icke-af element inte vara matriser. Vektorer måste vara en number[] som ska indexeras och returneras i vektorsökningsresultat.
kind sträng Typ av vektorindex som ska skapas. Alternativen är vector-ivf och vector-hnsw. Obs! vector-ivf Är tillgängligt på alla klusternivåer och vector-hnsw är tillgängligt på M40-klusternivåer och högre.
numLists integer Det här heltalet är antalet kluster som det inverterade filindexet (IVF) använder för att gruppera vektordata. Vi rekommenderar att det numLists är inställt på documentCount/1000 för upp till 1 miljon dokument och för sqrt(documentCount) mer än 1 miljon dokument. Att använda värdet numLists1 för liknar att utföra brute-force-sökning, vilket har begränsad prestanda.
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).
dimensions integer Antal dimensioner för vektorlikhet. Det maximala antalet dimensioner som stöds är 2000.

Viktigt!

Det är viktigt att ange parametern numLists korrekt för att uppnå god noggrannhet och prestanda. Vi rekommenderar att det numLists är inställt på documentCount/1000 för upp till 1 miljon dokument och för sqrt(documentCount) mer än 1 miljon dokument.

När antalet objekt i databasen växer bör du justera numLists så att de blir större för att uppnå bra svarstidsprestanda för vektorsökning.

Om du experimenterar med ett nytt scenario eller skapar en liten demo kan du börja med numLists inställd på att 1 utföra en brute-force-sökning över alla vektorer. Detta bör ge dig de mest exakta resultaten från vektorsökningen, men tänk på att sökhastigheten och svarstiden kommer att vara långsam. Efter den första installationen bör du gå vidare och finjustera parametern numLists med hjälp av ovanstående vägledning.

Utföra en vektorsökning med IVF

Om du vill utföra en vektorsökning använder du $search sammansättningens pipelinesteg i en MongoDB-fråga. Använd den nya cosmosSearch operatorn om du vill använda indexetcosmosSearch.

{
  {
  "$search": {
    "cosmosSearch": {
        "vector": <query_vector>,
        "path": "<path_to_property>",
        "k": <num_results_to_return>,
      },
      "returnStoredSource": True }},
  {
    "$project": { "<custom_name_for_similarity_score>": {
           "$meta": "searchScore" },
            "document" : "$$ROOT"
        }
  }
}

Om du vill hämta likhetspoängen (searchScore) tillsammans med de dokument som hittas av vektorsökningen använder du operatorn $project för att inkludera searchScore och byta namn på den som <custom_name_for_similarity_score> i resultatet. Sedan projiceras dokumentet också som kapslat objekt. Observera att likhetspoängen beräknas med hjälp av måttet som definierats i vektorindexet.

Viktigt!

Vektorer måste vara en number[] som ska indexeras. 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.

Exempel med ett HNSW-index.

I följande exempel visas hur du indexar vektorer, lägger till dokument som har vektoregenskaper, utför en vektorsökning och hämtar indexkonfigurationen.

use test;

db.createCollection("exampleCollection");

db.runCommand({ 
    "createIndexes": "exampleCollection",
    "indexes": [
        {
            "name": "VectorSearchIndex",
            "key": {
                "contentVector": "cosmosSearch"
            },
            "cosmosSearchOptions": { 
                "kind": "vector-hnsw", 
                "m": 16, 
                "efConstruction": 64, 
                "similarity": "COS", 
                "dimensions": 3
            } 
        } 
    ] 
});

Det här kommandot skapar ett HNSW-index mot contentVector egenskapen i dokumenten som lagras i den angivna samlingen, exampleCollection. Egenskapen cosmosSearchOptions anger parametrarna för HNSW-vektorindexet. Om vektorn lagras i en kapslad egenskap i dokumentet kan du ange den här egenskapen med hjälp av en punkt notationssökväg. Du kan till exempel använda text.contentVector om contentVector är en undereproperty av text.

Lägga till vektorer i databasen

Om du vill lägga till vektorer i databasens samling måste du först skapa inbäddningarna med hjälp av din egen modell, Azure OpenAI-inbäddningar eller ett annat API (till exempel Hugging Face on Azure). I det här exemplet läggs nya dokument till via exempelinbäddningar:

db.exampleCollection.insertMany([
  {name: "Eugenia Lopez", bio: "Eugenia is the CEO of AdvenureWorks.", vectorContent: [0.51, 0.12, 0.23]},
  {name: "Cameron Baker", bio: "Cameron Baker CFO of AdvenureWorks.", vectorContent: [0.55, 0.89, 0.44]},
  {name: "Jessie Irwin", bio: "Jessie Irwin is the former CEO of AdventureWorks and now the director of the Our Planet initiative.", vectorContent: [0.13, 0.92, 0.85]},
  {name: "Rory Nguyen", bio: "Rory Nguyen is the founder of AdventureWorks and the president of the Our Planet initiative.", vectorContent: [0.91, 0.76, 0.83]},
]);

Om du fortsätter med det sista exemplet skapar du en annan vektor, queryVector. Vektorsökning mäter avståndet mellan queryVector och vektorerna i sökvägen till contentVector dina dokument. Du kan ange antalet resultat som sökningen returnerar genom att ange parametern k, som är inställd 2 på här. Du kan också ange efSearch, vilket är ett heltal som styr storleken på kandidatvektorlistan. Ett högre värde kan förbättra noggrannheten, men sökningen blir långsammare som ett resultat. Det här är en valfri parameter med standardvärdet 40.

const queryVector = [0.52, 0.28, 0.12];
db.exampleCollection.aggregate([
  {
    "$search": {
        "cosmosSearch": {
            "vector": "queryVector",
            "path": "contentVector",
            "k": 2,
            "efSearch": 40
        },
    }
  }
}
]);

I det här exemplet utförs en vektorsökning med hjälp queryVector av som indata via Mongo-gränssnittet. Sökresultatet är en lista över två objekt som mest liknar frågevektorn, sorterade efter deras likhetspoäng.

[
  {
    similarityScore: 0.9465376,
    document: {
      _id: ObjectId("645acb54413be5502badff94"),
      name: 'Eugenia Lopez',
      bio: 'Eugenia is the CEO of AdvenureWorks.',
      vectorContent: [ 0.51, 0.12, 0.23 ]
    }
  },
  {
    similarityScore: 0.9006955,
    document: {
      _id: ObjectId("645acb54413be5502badff97"),
      name: 'Rory Nguyen',
      bio: 'Rory Nguyen is the founder of AdventureWorks and the president of the Our Planet initiative.',
      vectorContent: [ 0.91, 0.76, 0.83 ]
    }
  }
]

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: { contentVector: 'cosmosSearch' },
    name: 'vectorSearchIndex',
    cosmosSearch: {
      kind: 'vector-hnsw',
      m: 40,
      efConstruction: 64
      similarity: 'COS',
      dimensions: 3
    },
    ns: 'test.exampleCollection'
  }
]

Exempel med ett IVF-index

I följande exempel visas hur du indexar vektorer, lägger till dokument som har vektoregenskaper, utför en vektorsökning och hämtar indexkonfigurationen.

Skapa ett vektorindex

use test;

db.createCollection("exampleCollection");

db.runCommand({
  createIndexes: 'exampleCollection',
  indexes: [
    {
      name: 'vectorSearchIndex',
      key: {
        "vectorContent": "cosmosSearch"
      },
      cosmosSearchOptions: {
        kind: 'vector-ivf',
        numLists: 3,
        similarity: 'COS',
        dimensions: 3
      }
    }
  ]
});

Det här kommandot skapar ett vector-ivf index mot vectorContent egenskapen i dokumenten som lagras i den angivna samlingen, exampleCollection. Egenskapen cosmosSearchOptions anger parametrarna för IVF-vektorindexet. Om vektorn lagras i en kapslad egenskap i dokumentet kan du ange den här egenskapen med hjälp av en punkt notationssökväg. Du kan till exempel använda text.vectorContent om vectorContent är en undereproperty av text.

Lägga till vektorer i databasen

Om du vill lägga till vektorer i databasens samling måste du först skapa inbäddningarna med hjälp av din egen modell, Azure OpenAI-inbäddningar eller ett annat API (till exempel Hugging Face on Azure). I det här exemplet läggs nya dokument till via exempelinbäddningar:

db.exampleCollection.insertMany([
  {name: "Eugenia Lopez", bio: "Eugenia is the CEO of AdvenureWorks.", vectorContent: [0.51, 0.12, 0.23]},
  {name: "Cameron Baker", bio: "Cameron Baker CFO of AdvenureWorks.", vectorContent: [0.55, 0.89, 0.44]},
  {name: "Jessie Irwin", bio: "Jessie Irwin is the former CEO of AdventureWorks and now the director of the Our Planet initiative.", vectorContent: [0.13, 0.92, 0.85]},
  {name: "Rory Nguyen", bio: "Rory Nguyen is the founder of AdventureWorks and the president of the Our Planet initiative.", vectorContent: [0.91, 0.76, 0.83]},
]);

Utföra en vektorsökning

Om du vill utföra en vektorsökning använder du $search sammansättningens pipelinesteg i en MongoDB-fråga. Använd den nya cosmosSearch operatorn om du vill använda indexetcosmosSearch.

{
  {
  "$search": {
    "cosmosSearch": {
        "vector": <vector_to_search>,
        "path": "<path_to_property>",
        "k": <num_results_to_return>,
      },
      "returnStoredSource": True }},
  {
    "$project": { "<custom_name_for_similarity_score>": {
           "$meta": "searchScore" },
            "document" : "$$ROOT"
        }
  }
}

Om du vill hämta likhetspoängen (searchScore) tillsammans med de dokument som hittas av vektorsökningen använder du operatorn $project för att inkludera searchScore och byta namn på den som <custom_name_for_similarity_score> i resultatet. Sedan projiceras dokumentet också som kapslat objekt. Observera att likhetspoängen beräknas med hjälp av måttet som definierats i vektorindexet.

Om du fortsätter med det sista exemplet skapar du en annan vektor, queryVector. Vektorsökning mäter avståndet mellan queryVector och vektorerna i sökvägen till vectorContent dina dokument. Du kan ange antalet resultat som sökningen returnerar genom att ange parametern k, som är inställd 2 på här. Du kan också ange nProbes, vilket är ett heltal som styr antalet närliggande kluster som inspekteras i varje sökning. Ett högre värde kan förbättra noggrannheten, men sökningen blir långsammare som ett resultat. Det här är en valfri parameter med standardvärdet 1 och får inte vara större än det numLists värde som anges i vektorindexet.

const queryVector = [0.52, 0.28, 0.12];
db.exampleCollection.aggregate([
  {
    $search: {
      "cosmosSearch": {
        "vector": queryVector,
        "path": "vectorContent",
        "k": 2
      },
    "returnStoredSource": true }},
  {
    "$project": { "similarityScore": {
           "$meta": "searchScore" },
            "document" : "$$ROOT"
        }
  }
]);

I det här exemplet utförs en vektorsökning med hjälp queryVector av som indata via Mongo-gränssnittet. Sökresultatet är en lista över två objekt som mest liknar frågevektorn, sorterade efter deras likhetspoäng.

[
  {
    similarityScore: 0.9465376,
    document: {
      _id: ObjectId("645acb54413be5502badff94"),
      name: 'Eugenia Lopez',
      bio: 'Eugenia is the CEO of AdvenureWorks.',
      vectorContent: [ 0.51, 0.12, 0.23 ]
    }
  },
  {
    similarityScore: 0.9006955,
    document: {
      _id: ObjectId("645acb54413be5502badff97"),
      name: 'Rory Nguyen',
      bio: 'Rory Nguyen is the founder of AdventureWorks and the president of the Our Planet initiative.',
      vectorContent: [ 0.91, 0.76, 0.83 ]
    }
  }
]

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: 'vector-ivf',
      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 semantiska Cachelagring med hjälp av tidigare recocrded LLM-respones 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 (GA) och HSNW (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