Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
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.
Vector Similarity-zoekopdracht uitvoeren
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-hnsw en 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.
Een vectorzoekopdracht uitvoeren
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'
}
]
Gefilterde vectorzoekopdrachten
U kunt nu vectorzoekopdrachten uitvoeren met elk ondersteund queryfilter zoals $lt
, , $lte
$eq
, $neq
, $gte
, $gt
, , $in
en $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
, efConstruction
of 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.
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.
Gerelateerde inhoud
- Retail-referentieoplossing voor .NET RAG-patroon
- .NET-zelfstudie : chatbot voor recepten
- C# RAG-patroon - OpenAI-services integreren met Cosmos
- Python RAG-patroon - Azure-product chatbot
- Zelfstudie voor Python-notebook - Vector-databaseintegratie via LangChain
- Python-notebook-tutorial - LLM Caching-integratie via LangChain
- Python - LlamaIndex-integratie
- Python - Semantische kernelgeheugenintegratie