Vector Store ve službě Azure Cosmos DB pro virtuální jádro MongoDB

PLATÍ PRO: Virtuální jádro MongoDB

Využijte integrovanou vektorovou databázi ve službě Azure Cosmos DB pro MongoDB 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 spolu s původními daty, ze kterých se vytvářejí vektorová data. 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 virtuální jádro MongoDB 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.

Vytvoření vektorového indexu

Pokud chcete ve svých dokumentech provádět vektorové similiarity, budete muset nejprve vytvořit vektorový index.

Vytvoření vektorového indexu pomocí HNSW

Indexy hierarchické navigace small world můžete vytvářet na úrovních clusteru M40 a vyšších úrovních. Pokud chcete vytvořit index HSNW, musíte vytvořit vektorový index s parametrem "kind" nastaveným na "vector-hnsw" následující šablonu:

{ 
    "createIndexes": "<collection_name>",
    "indexes": [
        {
            "name": "<index_name>",
            "key": {
                "<path_to_property>": "cosmosSearch"
            },
            "cosmosSearchOptions": { 
                "kind": "vector-hnsw", 
                "m": <integer_value>, 
                "efConstruction": <integer_value>, 
                "similarity": "<string_value>", 
                "dimensions": <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. Pokud se použije cesta tečkování, pak všechny neleaf elementy nemohou být pole. Vektory musí být number[] indexované a vracet ve výsledcích hledání vektorů.
kind string Typ vektorového indexu, který chcete vytvořit. Možnosti jsou vector-ivf a vector-hnsw. Poznámka vector-ivf : Je k dispozici na všech úrovních clusteru a vector-hnsw je k dispozici na úrovních clusteru M40 a vyšších.
m integer Maximální počet připojení na vrstvu (16 ve výchozím nastavení je 2minimální hodnota , maximální hodnota je 100). Vyšší m je vhodný pro datové sady s vysokou dimenzionální a/nebo vysokou přesností.
efConstruction integer velikost dynamického kandidátního seznamu pro vytvoření grafu (64 ve výchozím nastavení je 4minimální hodnota , maximální hodnota je 1000). Vyšší efConstruction bude mít za následek vyšší kvalitu indexu a vyšší přesnost, ale také zvýší čas potřebný k sestavení indexu. efConstruction musí být alespoň 2 * m
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).
dimensions integer Počet dimenzí pro podobnost vektorů Maximální počet podporovaných dimenzí je 2000.

Provedení vektorového vyhledávání pomocí HNSW

Pokud chcete provést vektorové vyhledávání, použijte $search fázi kanálu agregace, ve které je dotaz s operátorem cosmosSearch .

{
    "$search": {
        "cosmosSearch": {
            "vector": <query_vector>,
            "path": "<path_to_property>",
            "k": <num_results_to_return>,
            "efSearch": <integer_value>
        },
    }
  }
}

Pole Typ Popis
efSearch integer Velikost dynamického kandidátního seznamu pro vyhledávání (40 ve výchozím nastavení). Vyšší hodnota poskytuje lepší úplnost za cenu rychlosti.
k integer Počet výsledků, které se mají vrátit. měla by být menší než nebo rovna efSearch

Poznámka:

Vytvoření indexu HSNW s velkými datovými sadami může vést k tomu, že váš prostředek virtuálních jader Azure Cosmos DB pro MongoDB nemá nedostatek paměti, nebo může omezit výkon jiných operací spuštěných ve vaší databázi. Pokud na tyto problémy narazíte, můžete je zmírnit škálováním prostředku na vyšší úroveň clusteru nebo zmenšením velikosti datové sady.

Vytvoření vektorového indexu pomocí IVF

Pokud chcete vytvořit vektorový index pomocí algoritmu IVF (Inverted File), použijte následující createIndexes šablonu a nastavte "kind" parametr na "vector-ivf":

{
  "createIndexes": "<collection_name>",
  "indexes": [
    {
      "name": "<index_name>",
      "key": {
        "<path_to_property>": "cosmosSearch"
      },
      "cosmosSearchOptions": {
        "kind": "vector-ivf",
        "numLists": <integer_value>,
        "similarity": "<string_value>",
        "dimensions": <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. Pokud se použije cesta tečkování, pak všechny neleaf elementy nemohou být pole. Vektory musí být number[] indexované a vracet ve výsledcích hledání vektorů.
kind string Typ vektorového indexu, který chcete vytvořit. Možnosti jsou vector-ivf a vector-hnsw. Poznámka vector-ivf : Je k dispozici na všech úrovních clusteru a vector-hnsw je k dispozici na úrovních clusteru M40 a vyšších.
numLists integer Toto celé číslo je počet clusterů, které index invertovaného souboru (IVF) používá k seskupení vektorových dat. Doporučujeme nastavit numListsdocumentCount/1000 až 1 milion dokumentů a na sqrt(documentCount) více než 1 milion dokumentů. numLists Použití hodnoty 1 je podobné provádění vyhledávání hrubou silou, což má omezený výkon.
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).
dimensions integer Počet dimenzí pro podobnost vektorů Maximální počet podporovaných dimenzí je 2000.

Důležité

Nastavení parametru numLists je důležité pro dosažení správné přesnosti a výkonu. Doporučujeme nastavit numListsdocumentCount/1000 až 1 milion dokumentů a na sqrt(documentCount) více než 1 milion dokumentů.

S rostoucím počtem položek v databázi byste měli ladit početLists tak, aby byly větší, abyste dosáhli dobrého výkonu latence pro vektorové vyhledávání.

Pokud experimentujete s novým scénářem nebo vytváříte malou ukázku, můžete začít numLists1 nastavením provést vyhledávání hrubou silou napříč všemi vektory. Měli byste tak poskytnout nejpřesnější výsledky z vektorového vyhledávání, mějte ale na paměti, že rychlost a latence hledání budou pomalé. Po počátečním nastavení byste měli pokračovat a ladit numLists parametr s využitím výše uvedených pokynů.

Provedení vektorového vyhledávání pomocí IVF

K provedení vektorového vyhledávání použijte $search fázi kanálu agregace v dotazu MongoDB. Pokud chcete použít cosmosSearch index, použijte nový cosmosSearch operátor.

{
  {
  "$search": {
    "cosmosSearch": {
        "vector": <query_vector>,
        "path": "<path_to_property>",
        "k": <num_results_to_return>,
      },
      "returnStoredSource": True }},
  {
    "$project": { "<custom_name_for_similarity_score>": {
           "$meta": "searchScore" },
            "document" : "$$ROOT"
        }
  }
}

Pokud chcete načíst skóre podobnosti (searchScore) spolu s dokumenty nalezenými vektorovým vyhledáváním, použijte $project operátor k zahrnutí searchScore a přejmenování jako <custom_name_for_similarity_score> ve výsledcích. Dokument se pak projektuje také jako vnořený objekt. Všimněte si, že skóre podobnosti se počítá pomocí metriky definované v indexu vektoru.

Důležité

Vektory musí být number[] indexované. 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í.

Příklad použití indexu HNSW

Následující příklady ukazují, jak indexovat vektory, přidat dokumenty s vlastnostmi vektoru, provést vektorové vyhledávání a načíst konfiguraci indexu.

use test;

db.createCollection("exampleCollection");

db.runCommand({ 
    "createIndexes": "exampleCollection",
    "indexes": [
        {
            "name": "VectorSearchIndex",
            "key": {
                "contentVector": "cosmosSearch"
            },
            "cosmosSearchOptions": { 
                "kind": "vector-hnsw", 
                "m": 16, 
                "efConstruction": 64, 
                "similarity": "COS", 
                "dimensions": 3
            } 
        } 
    ] 
});

Tento příkaz vytvoří index HNSW proti contentVector vlastnosti v dokumentech, které jsou uloženy v zadané kolekci, exampleCollection. Vlastnost cosmosSearchOptions určuje parametry indexu vektoru HNSW. Pokud dokument obsahuje vektor uložený ve vnořené vlastnosti, můžete tuto vlastnost nastavit pomocí cesty tečky. Můžete například použíttext.contentVector, pokud contentVector je subproperty .text

Přidání vektorů do databáze

Pokud chcete do kolekce databáze přidat vektory, musíte nejprve vytvořit vkládání pomocí vlastního modelu, vkládání Azure OpenAI Nebo jiného rozhraní API (například Hugging Face v Azure). V tomto příkladu se nové dokumenty přidají prostřednictvím ukázkových vkládání:

db.exampleCollection.insertMany([
  {name: "Eugenia Lopez", bio: "Eugenia is the CEO of AdvenureWorks.", vectorContent: [0.51, 0.12, 0.23]},
  {name: "Cameron Baker", bio: "Cameron Baker CFO of AdvenureWorks.", vectorContent: [0.55, 0.89, 0.44]},
  {name: "Jessie Irwin", bio: "Jessie Irwin is the former CEO of AdventureWorks and now the director of the Our Planet initiative.", vectorContent: [0.13, 0.92, 0.85]},
  {name: "Rory Nguyen", bio: "Rory Nguyen is the founder of AdventureWorks and the president of the Our Planet initiative.", vectorContent: [0.91, 0.76, 0.83]},
]);

Pokračujeme v posledním příkladu a vytvořte další vektor, queryVector. Vektorové vyhledávání měří vzdálenost mezi queryVector a vektory v contentVector cestě k dokumentům. Počet výsledků, které hledání vrací, můžete nastavit nastavením parametru k, který je zde nastavený 2 . Můžete také nastavit efSearch, což je celé číslo, které řídí velikost seznamu kandidátských vektorů. Vyšší hodnota může zvýšit přesnost, ale hledání bude pomalejší v důsledku toho. Jedná se o volitelný parametr s výchozí hodnotou 40.

const queryVector = [0.52, 0.28, 0.12];
db.exampleCollection.aggregate([
  {
    "$search": {
        "cosmosSearch": {
            "vector": "queryVector",
            "path": "contentVector",
            "k": 2,
            "efSearch": 40
        },
    }
  }
}
]);

V tomto příkladu se vektorové vyhledávání provádí jako queryVector vstup prostřednictvím prostředí Mongo Shell. Výsledkem hledání je seznam dvou položek, které jsou nejvíce podobné vektoru dotazu seřazené podle skóre podobnosti.

[
  {
    similarityScore: 0.9465376,
    document: {
      _id: ObjectId("645acb54413be5502badff94"),
      name: 'Eugenia Lopez',
      bio: 'Eugenia is the CEO of AdvenureWorks.',
      vectorContent: [ 0.51, 0.12, 0.23 ]
    }
  },
  {
    similarityScore: 0.9006955,
    document: {
      _id: ObjectId("645acb54413be5502badff97"),
      name: 'Rory Nguyen',
      bio: 'Rory Nguyen is the founder of AdventureWorks and the president of the Our Planet initiative.',
      vectorContent: [ 0.91, 0.76, 0.83 ]
    }
  }
]

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 vectorIndexcosmosSearch 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: { contentVector: 'cosmosSearch' },
    name: 'vectorSearchIndex',
    cosmosSearch: {
      kind: 'vector-hnsw',
      m: 40,
      efConstruction: 64
      similarity: 'COS',
      dimensions: 3
    },
    ns: 'test.exampleCollection'
  }
]

Příklad použití indexu IVF

Následující příklady ukazují, jak indexovat vektory, přidat dokumenty s vlastnostmi vektoru, provést vektorové vyhledávání a načíst konfiguraci indexu.

Vytvoření vektorového indexu

use test;

db.createCollection("exampleCollection");

db.runCommand({
  createIndexes: 'exampleCollection',
  indexes: [
    {
      name: 'vectorSearchIndex',
      key: {
        "vectorContent": "cosmosSearch"
      },
      cosmosSearchOptions: {
        kind: 'vector-ivf',
        numLists: 3,
        similarity: 'COS',
        dimensions: 3
      }
    }
  ]
});

Tento příkaz vytvoří vector-ivf index proti vectorContent vlastnosti v dokumentech, které jsou uloženy v zadané kolekci, exampleCollection. Vlastnost cosmosSearchOptions určuje parametry pro index vektoru IVF. Pokud dokument obsahuje vektor uložený ve vnořené vlastnosti, můžete tuto vlastnost nastavit pomocí cesty tečky. Můžete například použíttext.vectorContent, pokud vectorContent je subproperty .text

Přidání vektorů do databáze

Pokud chcete do kolekce databáze přidat vektory, musíte nejprve vytvořit vkládání pomocí vlastního modelu, vkládání Azure OpenAI Nebo jiného rozhraní API (například Hugging Face v Azure). V tomto příkladu se nové dokumenty přidají prostřednictvím ukázkových vkládání:

db.exampleCollection.insertMany([
  {name: "Eugenia Lopez", bio: "Eugenia is the CEO of AdvenureWorks.", vectorContent: [0.51, 0.12, 0.23]},
  {name: "Cameron Baker", bio: "Cameron Baker CFO of AdvenureWorks.", vectorContent: [0.55, 0.89, 0.44]},
  {name: "Jessie Irwin", bio: "Jessie Irwin is the former CEO of AdventureWorks and now the director of the Our Planet initiative.", vectorContent: [0.13, 0.92, 0.85]},
  {name: "Rory Nguyen", bio: "Rory Nguyen is the founder of AdventureWorks and the president of the Our Planet initiative.", vectorContent: [0.91, 0.76, 0.83]},
]);

Provedení vektorového vyhledávání

K provedení vektorového vyhledávání použijte $search fázi kanálu agregace v dotazu MongoDB. Pokud chcete použít cosmosSearch index, použijte nový cosmosSearch operátor.

{
  {
  "$search": {
    "cosmosSearch": {
        "vector": <vector_to_search>,
        "path": "<path_to_property>",
        "k": <num_results_to_return>,
      },
      "returnStoredSource": True }},
  {
    "$project": { "<custom_name_for_similarity_score>": {
           "$meta": "searchScore" },
            "document" : "$$ROOT"
        }
  }
}

Pokud chcete načíst skóre podobnosti (searchScore) spolu s dokumenty nalezenými vektorovým vyhledáváním, použijte $project operátor k zahrnutí searchScore a přejmenování jako <custom_name_for_similarity_score> ve výsledcích. Dokument se pak projektuje také jako vnořený objekt. Všimněte si, že skóre podobnosti se počítá pomocí metriky definované v indexu vektoru.

Pokračujeme v posledním příkladu a vytvořte další vektor, queryVector. Vektorové vyhledávání měří vzdálenost mezi queryVector a vektory v vectorContent cestě k dokumentům. Počet výsledků, které hledání vrací, můžete nastavit nastavením parametru k, který je zde nastavený 2 . Můžete také nastavit nProbes, což je celé číslo, které řídí počet blízkých clusterů, které jsou kontrolovány v každém hledání. Vyšší hodnota může zvýšit přesnost, ale hledání bude pomalejší v důsledku toho. Jedná se o volitelný parametr s výchozí hodnotou 1 a nemůže být větší než numLists hodnota zadaná v indexu vektoru.

const queryVector = [0.52, 0.28, 0.12];
db.exampleCollection.aggregate([
  {
    $search: {
      "cosmosSearch": {
        "vector": queryVector,
        "path": "vectorContent",
        "k": 2
      },
    "returnStoredSource": true }},
  {
    "$project": { "similarityScore": {
           "$meta": "searchScore" },
            "document" : "$$ROOT"
        }
  }
]);

V tomto příkladu se vektorové vyhledávání provádí jako queryVector vstup prostřednictvím prostředí Mongo Shell. Výsledkem hledání je seznam dvou položek, které jsou nejvíce podobné vektoru dotazu seřazené podle skóre podobnosti.

[
  {
    similarityScore: 0.9465376,
    document: {
      _id: ObjectId("645acb54413be5502badff94"),
      name: 'Eugenia Lopez',
      bio: 'Eugenia is the CEO of AdvenureWorks.',
      vectorContent: [ 0.51, 0.12, 0.23 ]
    }
  },
  {
    similarityScore: 0.9006955,
    document: {
      _id: ObjectId("645acb54413be5502badff97"),
      name: 'Rory Nguyen',
      bio: 'Rory Nguyen is the founder of AdventureWorks and the president of the Our Planet initiative.',
      vectorContent: [ 0.91, 0.76, 0.83 ]
    }
  }
]

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 vectorIndexcosmosSearch 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: 'vector-ivf',
      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 $ltje , $lte, $eq, $neq, $gte$gt, $in, $nina $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, efConstructionnebo 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.

https://github.com/microsoft/semantic-kernel/tree/main/python/semantic_kernel/connectors/memory/azure_cosmosdb

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) můžete orchestrovat sémantické Ukládání do mezipaměti pomocí dříve reocrdovaný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 (GA) a HSNW (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.

Další krok