Delen via


Vectorwinkel in Azure Cosmos DB voor 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 vectoropslag?

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 vectoropslag?

In een vectorarchief worden vectorzoekalgoritmen gebruikt om insluitingen te indexeren en op te vragen. Sommige bekende vectorzoekalgoritmen omvatten Hiërarchische Navigable Small World (HNSW), Inverted File (IVF), DiskANN, enzovoort. Vectorzoekopdracht is een methode waarmee u vergelijkbare items kunt vinden op basis van hun data-eigenschappen in plaats van op basis van 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 datavectoren die zich het dichtst bij uw zoekvector bevinden, zijn degene die het meest semantisch vergelijkbaar zijn.

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. Hoewel Azure Cosmos DB voor MongoDB (vCore) meerdere opties biedt, vindt u hier enkele algemene richtlijnen om aan de slag te gaan op basis van de grootte van uw gegevensset:

IVF HNSW DiskANN (aanbevolen)
Beschrijving Een IVFFlat-index verdeelt vectoren in lijsten en doorzoekt vervolgens een subset die zich het dichtst bij de queryvector bevindt. Een HNSW-index maakt een graaf met meerdere lagen. DiskANN is een benaderde dichtstbijzijnde buurzoekalgoritme dat is ontworpen voor efficiënte vectorzoekopdracht op elke schaal.
Belangrijke afwegingen Pros: Snellere buildtijden, lager geheugengebruik.
Nadelen: Lagere queryprestaties (wat betreft de afweging tussen snelheid en nauwkeurigheid).
Pros: Betere queryprestaties (in termen van snelheid-herinnerings-afweging), kan worden gecreëerd op een lege tabel.
Tegens: Tragere buildtijden, hoger geheugengebruik.
Voordelen: Efficiënt op elke schaal, hoge recall, hoge doorvoer, lage latentie.
Aantal vectoren Minder dan 10.000 Tot 50.000 Tot 500.000+
Aanbevolen clusterlaag M10 of M20 M30 en hoger M30 en hoger

DiskANN-indexen zijn beschikbaar op M30-lagen en hoger. Om de DiskANN-index te maken, stelt u de "kind"-parameter in volgens de volgende sjabloon: "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>, 
            } 
        } 
    ] 
}
Veld Typologie 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 topniveaueigenschap of een puntnotatiepad 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 16.000 dimensies (met Product Quantization), met toekomstige ondersteuning gepland voor 40.000+.
similarity tekenreeks Overeenkomstmetriek om te gebruiken 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

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 Typologie Omschrijving
lSearch geheel getal Hiermee specificeert u de grootte van de dynamische kandidatenlijst voor de zoekopdracht. De standaardwaarde is 40, met een configureerbaar bereik van 10 tot 1000. Het verhogen van de waarde verbetert de herinnering, 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 veld contentVector in exampleCollection, waardoor gelijkeniszoekopdrachten worden mogelijk gemaakt. 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 voor queryVector, beperkt tot een straal van 100 mijl en bedrijven die open zijn. 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'
  }
]

U kunt nu vectorzoekopdrachten uitvoeren met elk ondersteund queryfilter zoals $lt, , $lte$eq, $neq, $gte, $gt, , $inen $nin$regex.

Als u vooraf filteren wilt gebruiken, moet u eerst een standaardindex definiëren voor de eigenschap waarop u wilt filteren, naast uw vectorindex. Hier volgt een voorbeeld van het maken van een filterindex:

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

Zodra uw filterindex is ingesteld, kunt u de "filter" component rechtstreeks opnemen in uw vectorzoekquery, zoals hieronder wordt weergegeven. In dit voorbeeld ziet u hoe u resultaten filtert waarbij de waarde van de "title" eigenschap niet aanwezig is in de opgegeven lijst:

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

Als u de prestaties en nauwkeurigheid van uw vooraf gefilterde vectorzoekopdrachten wilt optimaliseren, kunt u overwegen uw vectorindexparameters aan te passen. Voor DiskANN-indexen kan het verhogen van maxDegree of lBuild betere resultaten opleveren. Voor HNSW-indexen kunt u experimenteren met hogere waarden voor m, efConstructionof efSearch de prestaties verbeteren. Voor IVF-indexen kan het afstellen van numLists of nProbes leiden tot meer bevredigende resultaten. Het is van cruciaal belang om uw specifieke configuratie te testen met uw gegevens om ervoor te zorgen dat de resultaten voldoen aan uw vereisten. Deze parameters zijn van invloed op de indexstructuur en het zoekgedrag, en optimale waarden kunnen variëren op basis van uw gegevenskenmerken en querypatronen.

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. Meer informatie hier.

https://github.com/microsoft/semantic-kernel/tree/main/python/semantic_kernel/connectors/memory_stores/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. Meer informatie hier.

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. Meer informatie hier

Kenmerken en beperkingen

  • Ondersteunde metrische gegevens over afstand: L2 (Euclidean), binnenproduct en cosinus.
  • Ondersteunde indexeringsmethoden: IVFFLAT, HNSW en DiskANN.
  • Met DiskANN en Product Quantization kunt u vectoren tot 16.000 dimensies indexeren.
  • Met HNSW of IVF met halve precisie kunt u vectoren tot 4000 dimensies indexeren.
  • Zonder compressie is de standaard maximale vectordimensie voor indexeren 2000.
  • 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