Sdílet prostřednictvím


Integrované úložiště vektorů v Azure DocumentDB

Využijte integrovanou vektorovou databázi v Azure DocumentDB k bezproblémovému propojení aplikací založených na umělé inteligenci s daty uloženými v Azure DocumentDB. 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 v Azure DocumentDB 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 v Azure DocumentDB můžete ukládat, indexovat a dotazovat vkládání 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 společně, což usnadňuje operace s vícemodálními daty a umožňuje větší konzistenci dat, škálování a výkon.

Případy použití vektorové databáze

Vektorové databáze se používají v mnoha oblastech umělé inteligence a analýzy dat. Pomáhají s úlohami, jako je pochopení přirozeného jazyka, rozpoznávání obrázků a videí, vytváření systémů doporučení a výkon funkcí vyhledávání. Najdete je v analytických AI i generovaných aplikacích AI.

Vektorovou databázi můžete použít například k:

  • Identifikujte podobné obrázky, dokumenty a skladby na základě jejich obsahu, motivů, mínění a stylů.
  • Identifikujte podobné produkty na základě jejich charakteristik, funkcí a skupin uživatelů.
  • Doporučte obsah, produkty nebo služby na základě preferencí jednotlivců.
  • Doporučte obsah, produkty nebo služby na základě podobností skupin uživatelů.
  • Identifikujte nejvhodnější možnosti z velkého souboru voleb, které vyhovují složitým požadavkům.
  • Identifikujte datové anomálie nebo podvodné aktivity, které se liší od převládajících nebo normálních vzorů.
  • Implementujte trvalou paměť pro agenty AI.
  • Povolte generování rozšířené vyhledáváním (RAG).

Integrovaná vektorová databáze vs. databáze čistých vektorů

Existují dva běžné typy implementací vektorové databáze: databáze čistých vektorů a integrovaná vektorová databáze v NoSQL nebo relační databázi.

Databáze čistých vektorů efektivně ukládá a spravuje vkládání vektorů spolu s malým množstvím metadat. Je oddělená od zdroje dat, ze kterého jsou vložené objekty odvozeny.

Vektorová databáze, která se integruje do vysoce výkonné noSQL nebo relační databáze, poskytuje další funkce. Integrovaná vektorová databáze v NoSQL nebo relační databázi může ukládat, indexovat a dotazovat vkládání společně s odpovídajícími původními daty. Tento přístup eliminuje dodatečné náklady na replikaci dat v samostatné čistě vektorové databázi. Navíc udržování vektorových vkládání a původních dat společně usnadňuje operace s vícemodálními daty a umožňuje větší konzistenci dat, škálování a výkon.

Opensourcové vektorové databáze

Když vývojáři vyberou vektorové databáze, nabízí opensourcové možnosti řadu výhod. Open source znamená, že zdrojový kód softwaru je volně dostupný a umožňuje uživatelům přizpůsobit databázi podle svých konkrétních potřeb. Tato flexibilita je výhodná pro organizace, které podléhají jedinečným zákonným požadavkům na data, jako jsou společnosti v odvětví finančních služeb.

Další výhodou open-source vektorových databází je silná podpora komunity, kterou využívají. Aktivní komunity uživatelů často přispívají k vývoji těchto databází, poskytují podporu a sdílejí osvědčené postupy a podporují inovace.

Někteří jednotlivci se rozhodnou pro opensourcové vektorové databáze, protože jsou "zdarma", což znamená, že neexistuje žádné náklady na získání nebo použití softwaru. Alternativou je použití úrovní Free nabízených službami spravované databáze vektorů. Tyto spravované služby poskytují nejen bezplatný přístup k určitému limitu využití, ale také zjednodušují provozní zátěž zpracováním údržby, aktualizací a škálovatelnosti. Díky použití bezplatné úrovně spravovaných vektorových databázových služeb můžete dosáhnout úspor nákladů a zároveň snížit režii správy. Tento přístup vám umožní soustředit se spíše na základní aktivity než na správu databáze.

Výběr nejlepší opensourcové vektorové databáze

Volba nejlepší opensourcové vektorové databáze vyžaduje zvážení několika faktorů. Výkon a škálovatelnost databáze jsou zásadní, protože ovlivňují, jestli databáze dokáže zpracovat vaše konkrétní požadavky na úlohy. Databáze s efektivními funkcemi indexování a dotazování obvykle nabízejí optimální výkon. Dalším faktorem je podpora komunity a dostupná dokumentace pro databázi. Robustní komunita a dokumentace vám mohou poskytnout cennou pomoc. DocumentDB je například oblíbená opensourcová vektorová databáze:

Nejoblíbenější možnost pro vás nemusí být nejlepší. Měli byste tedy porovnat různé možnosti založené na funkcích, podporovaných datových typech a kompatibilitě s existujícími nástroji a architekturami, které používáte. Měli byste také pamatovat na výzvy opensourcových databází vektorů.

Výzvy opensourcových vektorových databází

Většina opensourcových vektorových databází, včetně dříve uvedených databází, jsou čistě vektorové databáze. Jinými slovy, jsou navržené tak, aby ukládaly a spravovaly pouze vkládání vektorů spolu s malým množstvím metadat. Vzhledem k tomu, že fungují odděleně od původních dat, je potřeba přesouvat data mezi různými službami. Tato složitost zvyšuje dodatečné náklady, zkompiluje věci a může zpomalit produkční systémy.

Představují také výzvy, které jsou typické pro opensourcové databáze:

  • Nastavení: Potřebujete podrobné znalosti pro instalaci, konfiguraci a provoz databáze, zejména pro složitá nasazení. Optimalizace prostředků a konfigurace při škálování provozu vyžaduje pečlivé sledování a úpravy.
  • Údržba: Musíte spravovat vlastní aktualizace, opravy a údržbu. Odborné znalosti strojového učení nestačí; musíte mít také rozsáhlé zkušenosti se správou databáze.
  • Podpora: Oficiální podpora může být v porovnání se spravovanými službami omezena a spoléhá se na pomoc komunity.

Ačkoli jsou tedy zpočátku zdarma, vznikají u open-source vektorových databází při zvyšování rozsahu značné náklady. Rozšíření provozu vyžaduje více hardwaru, kvalifikovaných pracovníků IT a pokročilé správy infrastruktury, což vede k vyšším nákladům na hardware, personál a provozní náklady. Škálování opensourcových vektorových databází může být finančně náročné i přes nedostatek licenčních poplatků.

Řešení problémů opensourcových vektorových databází

Plně spravovaná vektorová databáze, která se integruje do vysoce výkonné noSQL nebo relační databáze, zabraňuje dodatečným nákladům a složitostem opensourcových vektorových databází. Taková databáze ukládá, indexuje a dotazy vkládá spolu s odpovídajícími původními daty. Tento přístup eliminuje dodatečné náklady na replikaci dat v samostatné čistě vektorové databázi. Kromě toho je lepší udržovat vektorové vkládání a původní data společně, což usnadňuje operace s vícemodálními daty a umožňuje větší konzistenci dat, škálování a výkon. Mezitím plně spravovaná služba vývojářům pomáhá vyhnout se potížím v nastavování, údržbě a spoléhat se na komunitní pomoc s opensourcovou vektorovou databází. Některé spravované služby vektorových databází navíc nabízejí úroveň, která je zdarma na dobu životnosti.

Příkladem je integrovaná vektorová databáze v Azure DocumentDB. Toto nastavení umožňuje vývojářům ušetřit peníze stejně jako u opensourcových vektorových databází. Na rozdíl od opensourcových možností se ale poskytovatel služeb stará o údržbu, aktualizace a škálování za vás. Modernizace je rychlá a snadná a současně udržuje nízké celkové náklady na vlastnictví (TCO), když je čas rozšířit operace. Pomocí této služby můžete také pohodlně škálovat aplikace MongoDB, které jsou již v produkčním prostředí.

Azure DocumentDB 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 DocumentDB provádět vektorové vyhledávání, musíte nejprve vytvořit vektorový index. Azure DocumentDB 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 můžete použít 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>, 
            } 
        } 
    ] 
}
Obor Typ Description
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ů. Vektor používající jiný typ, například double[], zabraňuje 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>]}}}
      ]}
    }
  }
},
Obor Typ Description
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í. Tento příklad 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, abyste mohli filtrovat výsledky podle 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 queryVector, které jsou omezené na poloměr 160 kilometrů a firmy, které jsou v provozu. Každý výsledek zahrnuje skóre podobnosti a metadata, která demonstrují, jak DiskANN v Azure DocumentDB podporuje kombinované vektorové 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 přidat "filter" přímo do vektorového vyhledávacího dotazu. Tento příklad ukazuje, jak filtrovat výsledky, kde "title" hodnota vlastnosti 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žití nástrojů pro orchestraci velkých jazykových modelů (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 Azure DocumentDB 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 Azure DocumentDB a LLM. Další informace najdete v tématu Integrace jazyka LangChain pro Azure DocumentDB.

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

Pomocí jazyka LangChain a Azure DocumentDB můžete orchestrovat 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 Integrace jazyka LangChain s Azure DocumentDB.

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.
  • Pro cestu vektoru můžete vytvořit pouze jeden index.

Shrnutí

Tento průvodce 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 v Azure DocumentDB. 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