Delen via


Vector Store in azure Cosmos DB voor MongoDB op basis van vCore

VAN TOEPASSING OP: MongoDB vCore

Gebruik de Integrated Vector Database in Azure Cosmos DB for MongoDB (vCore) om uw AI-toepassingen naadloos te verbinden met uw gegevens die zijn opgeslagen in Azure Cosmos DB. Deze integratie kan apps bevatten die u hebt gemaakt met behulp van Azure OpenAI-insluitingen. Met de systeemeigen geïntegreerde vectordatabase kunt u efficiënt high-dimensionale vectorgegevens opslaan, indexeren en er query's op uitvoeren die rechtstreeks zijn opgeslagen in Azure Cosmos DB voor MongoDB (vCore), samen met de oorspronkelijke gegevens waaruit de vectorgegevens worden gemaakt. Het elimineert de noodzaak om uw gegevens over te dragen naar alternatieve vectorarchieven en extra kosten in rekening te brengen.

Wat is een vectorarchief?

Een vectorarchief of vectordatabase is een database die is ontworpen voor het opslaan en beheren van vector-insluitingen, die wiskundige representaties van gegevens in een hoogdimensionale ruimte zijn. In deze ruimte komt elke dimensie overeen met een functie van de gegevens en kunnen tienduizenden dimensies worden gebruikt om geavanceerde gegevens weer te geven. De positie van een vector in deze ruimte vertegenwoordigt de kenmerken. Woorden, woordgroepen of volledige documenten en afbeeldingen, audio en andere typen gegevens kunnen allemaal worden gevectoriseerd.

Hoe werkt een vectorarchief?

In een vectorarchief worden vectorzoekalgoritmen gebruikt om insluitingen te indexeren en op te vragen. Sommige bekende vectorzoekalgoritmen omvatten Hiërarchische Navigable Small World (HNSW), Omgekeerd bestand (IVF), DiskANN, enzovoort. Vectorzoekopdrachten is een methode waarmee u vergelijkbare items kunt vinden op basis van hun gegevenskenmerken in plaats van door exacte overeenkomsten in een eigenschapsveld. Deze techniek is handig in toepassingen zoals het zoeken naar vergelijkbare tekst, het vinden van gerelateerde afbeeldingen, het maken van aanbevelingen of zelfs het detecteren van afwijkingen. Het wordt gebruikt om een query uit te voeren op de vector-insluitingen (lijsten met getallen) van uw gegevens die u hebt gemaakt met behulp van een machine learning-model met behulp van een insluitings-API. Voorbeelden van insluitings-API's zijn Azure OpenAI Embeddings of Hugging Face in Azure. Vectorzoekopdrachten meten de afstand tussen de gegevensvectoren en uw queryvector. De gegevensvectoren die zich het dichtst bij uw queryvector bevinden, zijn de vectoren die het meest vergelijkbaar zijn met semantisch.

In de Integrated Vector Database in Azure Cosmos DB for MongoDB (vCore) kunnen insluitingen naast de oorspronkelijke gegevens worden opgeslagen, geïndexeerd en opgevraagd. Deze aanpak elimineert de extra kosten voor het repliceren van gegevens in een afzonderlijke pure vectordatabase. Bovendien houdt deze architectuur de vector insluitingen en oorspronkelijke gegevens bij elkaar, waardoor multimodale gegevensbewerkingen beter worden gefaciliteerd en betere gegevensconsistentie, schaal en prestaties mogelijk zijn.

Azure Cosmos DB voor MongoDB (vCore) biedt robuuste vectorzoekmogelijkheden, zodat u snelle overeenkomsten kunt uitvoeren in complexe gegevenssets. Als u vectorzoekopdrachten wilt uitvoeren in Azure Cosmos DB voor MongoDB, moet u eerst een vectorindex maken. Cosmos DB ondersteunt momenteel drie typen vectorindexen:

  • DiskANN (aanbevolen): ideaal voor grootschalige gegevenssets, waarbij gebruik wordt gemaakt van SSD's voor efficiënt geheugengebruik, terwijl hoge relevante overeenkomsten behouden blijven bij zoekopdrachten van dichtstbijzijnde buren (ANN).
  • HNSW: Geschikt voor gegevenssets met gemiddelde grootte die hoge relevante overeenkomsten nodig hebben, met een structuur op basis van grafieken die de nauwkeurigheid en de efficiëntie van resources in balans brengt.
  • IVF: clustering gebruikt om de zoeksnelheid in uitgebreide gegevenssets te optimaliseren, waarbij zoekopdrachten in doelclusters worden gericht om de prestaties te versnellen.

DiskANN-indexen zijn beschikbaar op M40-lagen en hoger. Als u de DiskANN-index wilt maken, stelt u de "kind" parameter in op "vector-diskann" de volgende sjabloon:

{ 
    "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>, 
            } 
        } 
    ] 
}
Veld Type Omschrijving
index_name tekenreeks Unieke naam van de index.
path_to_property tekenreeks Pad naar de eigenschap die de vector bevat. Dit pad kan een eigenschap op het hoogste niveau of een punt notatiepad naar de eigenschap zijn. Vectoren moeten worden number[] geïndexeerd en gebruikt in vectorzoekresultaten. Als u een ander type gebruikt, zoals double[], voorkomt u dat het document wordt geïndexeerd. Niet-geïndexeerde documenten worden niet geretourneerd in het resultaat van een vectorzoekactie.
kind tekenreeks Type vectorindex dat moet worden gemaakt. De opties zijn vector-ivf, vector-hnswen vector-diskann.
dimensions geheel getal Aantal dimensies voor vector-gelijkenis. DiskANN ondersteunt maximaal 2000 dimensies, met toekomstige ondersteuning gepland voor 40.000+.
similarity tekenreeks Metrische gegevens over overeenkomsten die moeten worden gebruikt met de index. Mogelijke opties zijn COS (cosinusafstand), L2 (Euclidische afstand) en IP (binnenste product).
maxDegree geheel getal Maximum aantal randen per knooppunt in de grafiek. Deze parameter varieert van 20 tot 2048 (standaard is 32). Hoger maxDegree is geschikt voor gegevenssets met hoge dimensionaliteit en/of hoge nauwkeurigheidsvereisten.
lBuild geheel getal Hiermee stelt u het aantal kandidaat-buren in dat tijdens de opbouw van de DiskANN-index wordt geëvalueerd. Deze parameter, die varieert van 10 tot 500 (standaard 50), zorgt voor balans tussen nauwkeurigheid en rekenoverhead: hogere waarden verbeteren de kwaliteit en nauwkeurigheid van de index, maar verhogen de buildtijd

Notitie

Schakel de functie DiskANN Vector Index in voor azure Cosmos DB voor MongoDB op basis van vCore op het tabblad Preview-functies van uw Azure-abonnement. Meer informatie over preview-functies vindt u hier.

Een vectorzoekopdracht uitvoeren met DiskANN

Als u een vectorzoekopdracht wilt uitvoeren, gebruikt u de fase van de $search aggregatiepijplijn en voert u een query uit met de cosmosSearch operator. DiskANN maakt zoekopdrachten met hoge prestaties mogelijk in grote gegevenssets met optionele filters, zoals georuimtelijke of op tekst gebaseerde filters.

{
  "$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>]}}}
      ]}
    }
  }
},
Veld Type Description
lSearch geheel getal Hiermee geeft u de grootte van de dynamische kandidaatlijst voor zoeken. De standaardwaarde is 40, met een configureerbaar bereik van 10 tot 1000. Het verhogen van de waarde verbetert de relevante overeenkomsten, maar kan de zoeksnelheid verminderen.
k geheel getal Hiermee definieert u het aantal zoekresultaten dat moet worden geretourneerd. De k waarde moet kleiner dan of gelijk zijn aan lSearch.

Voorbeeld van een DiskANN-index met filteren

Vectoren toevoegen aan uw database

Als u vectorzoekopdrachten wilt gebruiken met georuimtelijke filters, voegt u documenten toe die zowel vectorinsluitingen als locatiecoördinaten bevatten. U kunt de insluitingen maken met behulp van uw eigen model, Azure OpenAI Embeddings of een andere API (zoals Hugging Face in 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)

Een DiskANN-vectorindex maken

In het volgende voorbeeld ziet u hoe u een DiskANN-vectorindex instelt met filtermogelijkheden. Dit omvat het maken van de vectorindex voor overeenkomsten zoeken, het toevoegen van documenten met vector- en georuimtelijke eigenschappen en het indexeren van velden voor extra filtering.

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

Met deze opdracht maakt u een DiskANN-vectorindex op het contentVector veld in exampleCollection, waardoor overeenkomsten worden ingeschakeld. Er wordt ook het volgende toegevoegd:

  • Een index op het is_open veld, zodat u resultaten kunt filteren op basis van of bedrijven open zijn.
  • Een georuimtelijke index in het location veld om te filteren op geografische nabijheid.

Als u documenten wilt zoeken met vergelijkbare vectoren binnen een specifieke geografische radius, geeft u het queryVector zoeken naar overeenkomsten op en voegt u een georuimtelijk filter toe.

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)

In dit voorbeeld retourneert de vector-gelijkeniszoekopdracht de meest k dichtstbijzijnde vectoren op basis van de opgegeven COS overeenkomstwaarde, terwijl het filteren van resultaten alleen open bedrijven binnen een straal van 100 mijl bevat.

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

Dit resultaat toont de meest vergelijkbare documenten als queryVector, beperkt tot een straal van 100 mijl en open bedrijven. Elk resultaat bevat de overeenkomstenscore en metagegevens, waarmee wordt gedemonstreerd hoe DiskANN in Cosmos DB voor MongoDB gecombineerde vector- en georuimtelijke query's ondersteunt voor verrijkte, locatiegevoelige zoekervaringen.

Vectorindexdefinities ophalen

Gebruik de listIndexes opdracht om uw vectorindexdefinitie op te halen uit de verzameling:

db.exampleCollection.getIndexes();

In dit voorbeeld vectorIndex wordt geretourneerd met alle cosmosSearch parameters die zijn gebruikt om de index te maken:

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

Gefilterde vectorzoekopdrachten (preview)

U kunt nu vectorzoekopdrachten uitvoeren met elk ondersteund queryfilter zoals $lt, , $eq$lte, $neq, $gte, $gt, , $inen $nin$regex. Schakel de functie 'filtervectorzoekfunctie' in op het tabblad Preview-functies van uw Azure-abonnement. Meer informatie over preview-functies vindt u hier.

Eerst moet u een index voor uw filter definiëren, naast een vectorindex. U kunt bijvoorbeeld de filterindex voor een eigenschap definiëren

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

Vervolgens kunt u de "filter" term toevoegen aan uw vectorzoekopdracht, zoals hieronder wordt weergegeven. In dit voorbeeld zoekt het filter naar documenten waarin de "title" eigenschap zich niet in de lijst van ["not in this text", "or this text"]bevindt.


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

Belangrijk

In de preview-fase moet u mogelijk de parameters voor de vectorindex aanpassen om een hogere nauwkeurigheid te bereiken. Als u bijvoorbeeld mefConstructionefSearch HNSW of IVF gebruikt, numListsnProbes kan dit leiden tot betere resultaten. U moet uw configuratie testen voordat u deze gebruikt om ervoor te zorgen dat de resultaten bevredigend zijn.

LLM Orchestration-hulpprogramma's gebruiken

Gebruiken als een vectordatabase met Semantische kernel

Gebruik Semantic Kernel om uw gegevens op te halen uit Azure Cosmos DB voor MongoDB vCore en uw LLM. U vindt hier meer informatie.

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

Gebruiken als vectordatabase met LangChain

Gebruik LangChain om uw gegevens op te halen uit Azure Cosmos DB voor MongoDB vCore en uw LLM. U vindt hier meer informatie.

Gebruiken als een semantische cache met LangChain

Gebruik LangChain en Azure Cosmos DB voor MongoDB (vCore) om Semantic Caching te organiseren met behulp van eerder vastgelegde LLM-antwoorden waarmee u LLM API-kosten kunt besparen en latentie voor antwoorden kunt verminderen. U vindt hier meer informatie

Kenmerken en beperkingen

  • Ondersteunde metrische gegevens over afstand: L2 (Euclidean), binnenproduct en cosinus.
  • Ondersteunde indexeringsmethoden: IVFFLAT, HNSW en DiskANN (preview)
  • Indexeringsvectoren tot 2000 dimensies in grootte.
  • Indexering is van toepassing op slechts één vector per pad.
  • Er kan slechts één index per vectorpad worden gemaakt.

Samenvatting

In deze handleiding ziet u hoe u een vectorindex maakt, documenten toevoegt die vectorgegevens bevatten, een overeenkomstenzoekopdracht uitvoert en de indexdefinitie ophaalt. Met behulp van onze geïntegreerde vectordatabase kunt u efficiënt high-dimensionale vectorgegevens opslaan, indexeren en er query's op uitvoeren in Azure Cosmos DB voor MongoDB vCore. Hiermee kunt u het volledige potentieel van uw gegevens ontgrendelen via vector-insluitingen en kunt u hiermee nauwkeurigere, efficiënte en krachtige toepassingen bouwen.

Volgende stap