Úložiště vektorů ve službě Azure Cosmos DB pro virtuální jádro MongoDB
Pomocí integrované vektorové databáze ve službě Azure Cosmos DB for MongoDB (vCore) můžete bez problémů propojit aplikace založené na umělé inteligenci s daty uloženými ve službě Azure Cosmos DB. Tato integrace může zahrnovat aplikace, které jste vytvořili pomocí vkládání Azure OpenAI. Nativní integrovaná vektorová databáze umožňuje efektivně ukládat, indexovat a dotazovat vysoce dimenzionální vektorová data uložená přímo ve službě Azure Cosmos DB pro MongoDB (vCore) spolu s původními daty, ze kterých se vektorová data vytvářejí. Eliminuje nutnost přenášet data do alternativních úložišť vektorů a vyžadovat další náklady.
Co je úložiště vektorů?
Vektorové úložiště nebo vektorová databáze je databáze určená k ukládání a správě vkládání vektorů, což jsou matematické reprezentace dat ve vysokodimenzionálním prostoru. V tomto prostoru každá dimenze odpovídá funkci dat a desítky tisíc dimenzí se můžou použít k reprezentaci sofistikovaných dat. Pozice vektoru v tomto prostoru představuje jeho vlastnosti. Slova, fráze nebo celé dokumenty a obrázky, zvuk a další typy dat můžou být vektorizovány.
Jak funguje úložiště vektorů?
V úložišti vektorů se algoritmy vektorového vyhledávání používají k indexování a vkládání dotazů. Mezi dobře známé algoritmy vektorového vyhledávání patří Hierarchical Navigable Small World (HNSW), Inverted File (IVF), DiskANN atd. Vektorové vyhledávání je metoda, která vám pomůže najít podobné položky na základě jejich charakteristik dat, nikoli přesných shod v poli vlastnosti. Tato technika je užitečná v aplikacích, jako je hledání podobného textu, hledání souvisejících obrázků, vytváření doporučení nebo dokonce zjišťování anomálií. Používá se k dotazování na vektorové vkládání (seznamy čísel) dat, která jste vytvořili pomocí modelu strojového učení pomocí rozhraní API pro vkládání. Příklady rozhraní API pro vkládání jsou vkládání Azure OpenAI Embeddings nebo Hugging Face v Azure. Vektorové vyhledávání měří vzdálenost mezi datovými vektory a vektorem dotazu. Datové vektory, které jsou nejblíže vašemu vektoru dotazu, jsou ty, které jsou nalezeny nejvíce podobné sémanticky.
V integrované vektorové databázi ve službě Azure Cosmos DB pro MongoDB (virtuální jádro) je možné ukládat, indexovat a dotazovat se spolu s původními daty. Tento přístup eliminuje dodatečné náklady na replikaci dat v samostatné čistě vektorové databázi. Tato architektura navíc udržuje vektorové vkládání a původní data pohromadě, což usnadňuje operace s více modálními daty a umožňuje větší konzistenci dat, škálování a výkon.
Vyhledávání vektorové podobnosti
Azure Cosmos DB pro MongoDB (virtuální jádro) poskytuje robustní funkce vektorového vyhledávání, které umožňují provádět vysokorychlostní vyhledávání podobností napříč komplexními datovými sadami. Pokud chcete ve službě Azure Cosmos DB for MongoDB provádět vektorové vyhledávání, musíte nejprve vytvořit vektorový index. Cosmos DB v současné době podporuje tři typy vektorových indexů:
- DiskANN (doporučeno):: Ideální pro rozsáhlé datové sady s využitím disků SSD pro efektivní využití paměti při zachování vysokého úplnosti v přibližných vyhledáváních nejbližšího souseda (ANN).
- HNSW: Vhodné pro datové sady se střední velikostí vyžadující vysokou úplnost a strukturu založenou na grafech, která vyrovnává přesnost a efektivitu prostředků.
- IVF: Využívá clustering k optimalizaci rychlosti vyhledávání v rozsáhlých datových sadách a zaměřuje se na vyhledávání v cílových clusterech za účelem zrychlení výkonu.
Indexy DiskANN jsou k dispozici na úrovních M40 a vyšších úrovních. Pokud chcete vytvořit index DiskANN, nastavte "kind"
parametr na "vector-diskann"
následující šablonu:
{
"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>,
}
}
]
}
Pole | Typ | Description |
---|---|---|
index_name |
string | Jedinečný název indexu |
path_to_property |
string | Cesta k vlastnosti, která obsahuje vektor. Tato cesta může být vlastnost nejvyšší úrovně nebo cesta zápisu tečky k vlastnosti. Vektory musí být number[] indexovány a použity ve výsledcích hledání vektorů. Použití jiného typu, například double[] , zabrání indexování dokumentu. Neindexované dokumenty nebudou vráceny ve výsledku vektorového vyhledávání. |
kind |
string | Typ vektorového indexu, který chcete vytvořit. Možnosti jsou vector-ivf , vector-hnsw a vector-diskann . |
dimensions |
integer | Počet dimenzí pro podobnost vektorů DiskANN podporuje až 2000 dimenzí s budoucí podporou na 40 000+. |
similarity |
string | Metrika podobnosti, která se má použít s indexem Možné možnosti jsou COS (kosinus), L2 (euklidová vzdálenost) a IP (vnitřní součin). |
maxDegree |
integer | Maximální počet hran na uzel v grafu Tento parametr se pohybuje od 20 do 2048 (výchozí hodnota je 32). Vyšší maxDegree je vhodná pro datové sady s vysokou dimenzionální a/nebo vysokou přesností. |
lBuild |
integer | Nastaví počet kandidátských sousedů vyhodnocených během sestavování indexu DiskANN. Tento parametr, který se pohybuje od 10 do 500 (výchozí hodnota je 50), vyrovnává přesnost a výpočetní režii: vyšší hodnoty zlepšují kvalitu a přesnost indexu, ale zvyšují dobu sestavování. |
Provedení vektorového vyhledávání pomocí DiskANN
K provedení vektorového vyhledávání použijte $search
fázi kanálu agregace a dotazujte se s operátorem cosmosSearch
. DiskANN umožňuje vysoce výkonné vyhledávání v rozsáhlých datových sadách s volitelným filtrováním, jako jsou geoprostorové nebo textové filtry.
{
"$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>]}}}
]}
}
}
},
Pole | Typ | Popis |
---|---|---|
lSearch |
integer | Určuje velikost dynamického seznamu kandidátů pro vyhledávání. Výchozí hodnota je 40 , s konfigurovatelným rozsahem od 10 do 1000 . Zvýšení hodnoty zvyšuje úplnost, ale může snížit rychlost vyhledávání. |
k |
integer | Definuje počet výsledků hledání, které se mají vrátit. Hodnota k musí být menší nebo rovna lSearch . |
Povolení DiskANN v novém clusteru
Pokud chcete povolit diskANN Vector Index v nově zřízeném clusteru Azure Cosmos DB pro MongoDB (vCore), proveďte registraci na úrovni clusteru pomocí Azure CLI:
- Přihlášení k Azure CLI
az login
- Načtěte aktuální nastavení příznaků funkcí v clusteru. Tím zajistíte, že při přidávání nové funkce zachováte všechny existující příznaky.
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>
DiskANNIndex
Přidejte příznak do seznamu funkcí ve verzi Preview, aniž byste odebrali všechny existující funkce.
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\"]}"
Příklad použití indexu DiskANN s filtrováním
Přidání vektorů do databáze
Pokud chcete použít vektorové vyhledávání s geoprostorovými filtry, přidejte dokumenty, které obsahují jak vektorové vkládání, tak souřadnice umístění. Vkládání můžete vytvořit pomocí vlastního modelu, vkládání Azure OpenAI nebo jiného rozhraní API (například Hugging Face v 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)
Vytvoření indexu vektoru DiskANN
Následující příklad ukazuje, jak nastavit index vektoru DiskANN s možnostmi filtrování. To zahrnuje vytvoření vektorového indexu pro vyhledávání podobnosti, přidání dokumentů s vektorovými a geoprostorovými vlastnostmi a indexování polí pro další filtrování.
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
}
}
]
})
Tento příkaz vytvoří na poli exampleCollection
index contentVector
vektoru DiskANN, který umožňuje vyhledávání podobnosti. Přidá také:
- Index v
is_open
poli, který umožňuje filtrovat výsledky na základě toho, jestli jsou firmy otevřené. - Geoprostorový index
location
pole pro filtrování podle geografické blízkosti.
Provedení vektorového vyhledávání
Pokud chcete najít dokumenty s podobnými vektory v určitém geografickém poloměru, zadejte queryVector
hledání podobnosti a zahrňte geoprostorový filtr.
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)
V tomto příkladu hledání vektorové podobnosti vrátí nejlepší k
nejbližší vektory založené na zadané COS
metrice podobnosti a filtrování výsledků tak, aby zahrnovalo pouze otevřené firmy v okruhu 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]
}
}
]
Tento výsledek ukazuje nejlepší podobné dokumenty, které queryVector
jsou omezené na 100 mil poloměru a otevřené firmy. Každý výsledek zahrnuje skóre podobnosti a metadata a ukazuje, jak DiskANN ve službě Cosmos DB pro MongoDB podporuje kombinované vektory a geoprostorové dotazy pro rozšířené vyhledávání citlivé na umístění.
Získání definic vektorových indexů
K načtení definice vektorového indexu z kolekce použijte listIndexes
příkaz:
db.exampleCollection.getIndexes();
V tomto příkladu vectorIndex
cosmosSearch
se vrátí všechny parametry použité k vytvoření indexu:
[
{ 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'
}
]
Filtrované vektorové vyhledávání (Preview)
Teď můžete spouštět vektorové vyhledávání s libovolným podporovaným filtrem dotazů, jako $lt
je , $lte
, $eq
, $neq
, $gte
$gt
, $in
, $nin
a $regex
. Povolte funkci filtrování vektorového vyhledávání na kartě Funkce ve verzi Preview vašeho předplatného Azure. Další informace o funkcích ve verzi Preview najdete tady.
Nejprve budete muset kromě vektorového indexu definovat index pro filtr. Můžete například definovat index filtru pro vlastnost.
db.runCommand({
"createIndexes": "<collection_name",
"indexes": [ {
"key": {
"<property_to_filter>": 1
},
"name": "<name_of_filter_index>"
}
]
});
Dále můžete termín přidat "filter"
do vektorového vyhledávání, jak je znázorněno níže. V tomto příkladu filtr hledá dokumenty, ve kterých "title"
vlastnost není v seznamu ["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' }
}
]);
Důležité
V náhledu může filtrování vektorového vyhledávání vyžadovat, abyste upravili parametry indexu vektoru, abyste dosáhli vyšší přesnosti. Například zvýšení m
, efConstruction
nebo efSearch
při použití HNSW nebo numLists
, nebo nProbes
při použití IVF může vést k lepším výsledkům. Před použitím byste měli otestovat konfiguraci, abyste měli jistotu, že výsledky budou uspokojivé.
Použití nástrojů pro orchestraci LLM
Použití jako vektorové databáze s sémantickým jádrem
Pomocí sémantického jádra můžete orchestrovat načítání informací z virtuálních jader Azure Cosmos DB pro MongoDB a LLM. Další informace najdete zde.
Použití jako vektorové databáze s jazykem LangChain
Pomocí Jazyka LangChain můžete orchestrovat načítání informací z virtuálních jader Azure Cosmos DB pro MongoDB a LLM. Další informace najdete zde.
Použití jako sémantické mezipaměti s jazykem LangChain
Pomocí jazyka LangChain a Azure Cosmos DB for MongoDB (vCore) orchestrujte sémantické ukládání do mezipaměti pomocí dříve zaznamenaných odpovědí LLM, které vám můžou ušetřit náklady na rozhraní LLM API a snížit latenci odpovědí. Další informace najdete tady.
Funkce a omezení
- Podporované metriky vzdálenosti: L2 (Euclidean), vnitřní produkt a kosinus.
- Podporované metody indexování: IVFFLAT, HNSW a DiskANN (Preview)
- Indexovací vektory o velikosti až 2 000 dimenzí
- Indexování se vztahuje pouze na jeden vektor na cestu.
- Na cestu vektoru lze vytvořit pouze jeden index.
Shrnutí
Tato příručka ukazuje, jak vytvořit vektorový index, přidat dokumenty, které obsahují vektorová data, provést vyhledávání podobnosti a načíst definici indexu. Pomocí naší integrované vektorové databáze můžete efektivně ukládat, indexovat a dotazovat vysoce dimenzionální vektorová data přímo ve službě Azure Cosmos DB pro virtuální jádra MongoDB. Umožňuje vám odemknout plný potenciál vašich dat prostřednictvím vektorových vkládání a umožňuje vytvářet přesnější, efektivnější a výkonnější aplikace.
Související obsah
- Referenční řešení .NET RAG Pattern retail reference
- Kurz k .NET – chatovací robot s receptem
- Model RAG v jazyce C# – Integrace služeb OpenAI se službou Cosmos DB
- Model RAG v Pythonu – Chatovací robot produktu Azure
- Kurz poznámkového bloku Pythonu – Integrace vektorové databáze prostřednictvím jazyka LangChain
- Kurz poznámkového bloku Pythonu – Integrace ukládání do mezipaměti LLM prostřednictvím LangChain
- Python – Integrace llamaIndex
- Python – Integrace sémantického jádra