Sdílet prostřednictvím


Úložiště vektorů ve službě Azure Cosmos DB pro virtuální jádro MongoDB

Využijte integrovanou vektorovou databázi ve službě Azure Cosmos DB pro MongoDB (vCore) k bezproblémovému propojení aplikací založených 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) a DiskANN. 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á zakódování (seznamy čísel) dat, která jste vytvořili modelem strojového učení pomocí rozhraní API pro zakódování. Příklady rozhraní API pro embedding jsou embedding Azure OpenAI nebo Hugging Face na 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 (vCore) je možné vkládat, indexovat a dotazovat společně 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.

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. Azure Cosmos DB pro MongoDB (virtuální jádro) sice nabízí několik možností, ale tady jsou některé obecné pokyny, které vám pomůžou začít na základě velikosti datové sady:

IVF HNSW DiskANN (doporučeno)
Description Index IVFFlat rozděluje vektory do seznamů a pak prohledá podmnožinu nejblíže vektoru dotazu. Index HNSW vytvoří vícevrstevný graf. DiskANN je přibližný vyhledávací algoritmus nejbližšího souseda navržený pro efektivní vektorové vyhledávání v libovolném měřítku.
Klíčové kompromisy Profesionálové: Rychlejší časy sestavení, nižší využití paměti.
Nevýhody: Nižší výkon dotazů (z hlediska kompromisu mezi rychlostí a odvoláním).
Výhody: Lepší výkon dotazů (z hlediska kompromisu mezi rychlostí a přesností) lze vytvořit na prázdné tabulce.
Nevýhody: Pomalejší časy sestavení, vyšší využití paměti.
Výhody: Efektivní v jakémkoli měřítku, vysoká přesnost, vysoká propustnost, nízká latence.
Počet vektorů Méně než 10 000 Až 50 000 Až 500 000+
Doporučená úroveň clusteru M10 nebo M20 M30 a vyšší M30 a vyšší

Indexy DiskANN jsou k dispozici na úrovních M30 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 Popis
index_name řetězec Jedinečný název indexu
path_to_property řetězec Cesta k vlastnosti, která obsahuje vektor. Tato cesta může být vlastností nejvyšší úrovně nebo cestou pomocí notace s tečkami k vlastnosti. Vektory musí být number[] před tím, než jsou indexovány a použity ve výsledcích vyhledávání vektorů. Použití jiného typu, například double[], zabrání indexování dokumentu. Neindexované dokumenty se nevracejí ve výsledku vektorového hledání.
kind řetězec Typ vektorového indexu, který chcete vytvořit. Možnosti jsou vector-ivf, vector-hnswa vector-diskann.
dimensions integer Počet dimenzí pro podobnost vektorů DiskANN podporuje až 16 000 dimenzí (s kvantací produktu) s budoucí podporou plánovanou na 40 000 +.
similarity řetězec Metrika podobnosti, která se má použít s indexem Možné možnosti jsou COS (kosinusová vzdálenost), 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 dimenzionalitou a/nebo požadavky na 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 přesnost, 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.

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í. Vytváření embeddings můžete realizovat pomocí vlastního modelu, Azure OpenAI embeddings nebo rozhraní API, jako je Hugging Face na 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 contentVectorindex exampleCollection 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.

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 vyhledávání podle vektorové podobnosti vrátí k nejbližších vektorů na základě zadané COS metriky podobnosti, přičemž výsledky jsou filtrovány tak, aby zahrnovaly 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 nejpodobnější dokumenty k queryVector, omezené na okruh 100 mil a podniky, které jsou otevřené. 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 se vectorIndex vrátí se všemi cosmosSearch parametry použitými 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'
  }
]

Teď můžete spouštět vektorové vyhledávání s libovolným podporovaným filtrem dotazů, jako jsou $lt, $lte, $eq, $neq, $gte, $gt, $in, $nin a $regex.

Pokud chcete použít předfiltrování, musíte nejprve definovat standardní index vlastnosti, podle které chcete kromě vektorového indexu filtrovat. Tady je příklad vytvoření indexu filtru:

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

Jakmile je index filtru zavedený, můžete klauzuli začlenit "filter" přímo do vektorového vyhledávacího dotazu. Tento příklad ukazuje, jak filtrovat výsledky, kde hodnota vlastnosti "title"není v zadaném seznamu:

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é

Pokud chcete optimalizovat výkon a přesnost předfiltrovaných vektorových hledání, zvažte úpravu parametrů indexu vektoru. U indexů DiskANN může zvýšení maxDegree nebo lBuild vést k lepším výsledkům. Pro indexy HNSW můžete experimentovat s vyššími hodnotami pro m, efConstructionnebo efSearch může zvýšit výkon. Podobně u indexů IVF by ladění numLists nebo nProbes mohlo vést k uspokojivějším výsledkům. Je důležité otestovat konkrétní konfiguraci s vašimi daty, aby výsledky splňovaly vaše požadavky. Tyto parametry ovlivňují strukturu indexu a chování vyhledávání a optimální hodnoty se můžou lišit v závislosti na charakteristikách dat a vzorech dotazů.

Použijte nástroje pro orchestraci LLM

Použijte jako vektorovou databázi se 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 v úložišti GitHub.

Použijte jako vektorovou databázi s 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 v Azure Cosmos DB Mongo vCore.

Použití LangChain jako sémantické mezipaměti

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 v tématu Azure Cosmos DB Mongo vCore

Funkce a omezení

  • Podporované metriky vzdálenosti: L2 (Euclidean), vnitřní produkt a kosinus.
  • Podporované metody indexování: IVFFLAT, HNSW a DiskANN.
  • Pomocí diskANN a kvantování produktů můžete indexovat vektory až do 16 000 dimenzí.
  • Použití HNSW nebo IVF s poloviční přesností umožňuje indexování vektorů až do 4 000 dimenzí.
  • Bez komprese je výchozí maximální rozměr vektoru indexování 2 000.
  • 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.

Další krok