Sdílet prostřednictvím


Indexování a vektory dotazů ve službě Azure Cosmos DB for NoSQL v JavaScriptu

PLATÍ PRO: NoSQL

Funkce vektorového vyhledávání ve službě Azure Cosmos DB for NoSQL je ve verzi Preview. Před použitím této funkce je nutné nejprve zaregistrovat verzi Preview. Tento článek popisuje následující kroky:

  1. Registrace verze Preview služby Vector Search ve službě Azure Cosmos DB for NoSQL

  2. Nastavení kontejneru Azure Cosmos DB pro vektorové vyhledávání

  3. Zásady vkládání vektorů pro vytváření

  4. Přidání vektorových indexů do zásad indexování kontejnerů

  5. Vytvoření kontejneru s vektorovými indexy a zásadami vkládání vektorů

  6. Provádění vektorového vyhledávání uložených dat

Tato příručka vás provede procesem vytváření vektorových dat, indexováním dat a dotazováním dat v kontejneru.

Požadavky

Registrace verze Preview

Vektorové vyhledávání služby Azure Cosmos DB for NoSQL vyžaduje registraci funkcí ve verzi Preview. Pokud se chcete zaregistrovat, postupujte následovně:

  1. Přejděte na stránku prostředku Azure Cosmos DB for NoSQL.

  2. V položce nabídky Nastavení vyberte podokno Funkce.

  3. Vyberte možnost Vektorové vyhledávání ve službě Azure Cosmos DB for NoSQL.

  4. Přečtěte si popis funkce a potvrďte, že se chcete zaregistrovat ve verzi Preview.

  5. Výběrem možnosti Povolit se zaregistrujte ve verzi Preview.

    Poznámka:

    Žádost o registraci bude automaticky schválena, ale může trvat několik minut, než se projeví.

Následující kroky předpokládají, že víte, jak nastavit účet NoSQL služby Cosmos DB a vytvořit databázi. Funkce vektorového vyhledávání je aktuálně podporována pouze u nových kontejnerů, nikoli u existujícího kontejneru. Musíte vytvořit nový kontejner a pak zadat zásadu vkládání vektoru na úrovni kontejneru a zásadu indexování vektorů při vytváření.

Podívejme se na příklad vytvoření databáze pro internetový knihkupectví a pro každou knihu ukládáte název, autor, ISBN a popis. Definujeme také dvě vlastnosti, které mají obsahovat vektorové vkládání. První je vlastnost contentVector, která obsahuje vložené texty vygenerované z textového obsahu knihy (například zřetězení vlastnosti "title" "author" "isbn" a "description" před vytvořením vkládání). Druhá je "coverImageVector", která je generována z obrázků na titulní straně knihy.

  1. Vytvořte a uložte vkládání vektorů pro pole, na kterých chcete provádět vektorové vyhledávání.
  2. Zadejte cesty pro vkládání vektorů v zásadách vkládání vektorů.
  3. Do zásad indexování kontejneru zahrňte všechny indexy požadovaných vektorů.

V dalších částech tohoto článku se podíváme na tuto strukturu pro položky uložené v našem kontejneru:

{
"title": "book-title",
"author": "book-author",
"isbn": "book-isbn",
"description": "book-description",
"contentVector": [2, -1, 4, 3, 5, -2, 5, -7, 3, 1],
"coverImageVector": [0.33, -0.52, 0.45, -0.67, 0.89, -0.34, 0.86, -0.78]
}

Vytvoření zásady vkládání vektorů pro kontejner

Dále je potřeba definovat zásadu vektoru kontejneru. Tato zásada poskytuje informace, které slouží k informování dotazovacího stroje Azure Cosmos DB, jak zpracovávat vlastnosti vektoru v systémových funkcích VectorDistance. Tato zásada také informuje zásadu indexování vektorů o nezbytných informacích, pokud se rozhodnete jednu z nich zadat.

Do zásad obsažených vektorů jsou zahrnuty následující informace:

Popis
path Cesta vlastnosti, která obsahuje vektory
datatype Typ prvků vektoru (výchozí Float32)
dimensions Délka každého vektoru v cestě (výchozí 1536)
distanceFunction Metrika použitá k výpočtu vzdálenosti a podobnosti (výchozí Cosine)

V našem příkladu s podrobnostmi o knize může zásada vektoru vypadat jako příklad JSON:

const vectorEmbeddingPolicy: VectorEmbeddingPolicy = {
      vectorEmbeddings: [
        {
          path: "/coverImageVector",
          dataType: "float32",
          dimensions: 8,
          distanceFunction: "dotproduct",
        },
        {
          path: "contentVector",
          dataType: "float32",
          dimensions: 10,
          distanceFunction: "cosine",
        },
      ],
    };

Vytvoření vektorového indexu v zásadách indexování

Po rozhodnutí o cestách vkládání vektorů je potřeba do zásad indexování přidat vektorové indexy. Při vytváření kontejneru je nutné použít zásadu vektoru a později ji není možné upravit. V tomto příkladu by zásady indexování vypadaly takto:

const indexingPolicy: IndexingPolicy = {
  vectorIndexes: [
    { path: "/coverImageVector", type: "quantizedFlat" },
    { path: "/contentVector", type: "diskANN" },
  ],
    inlcludedPaths: [
      {
        path: "/*",
      },
    ],
    excludedPaths: [
      {
        path: "/coverImageVector/*",
      },
      {
        path: "/contentVector/*",
      },
    ]
};

Teď vytvořte kontejner jako obvykle.

const containerName = "vector embedding container";
    // create container
    const { resource: containerdef } = await database.containers.createIfNotExists({
      id: containerName,
      vectorEmbeddingPolicy: vectorEmbeddingPolicy,
      indexingPolicy: indexingPolicy,
    });

Důležité

V současné době se vektorové vyhledávání ve službě Azure Cosmos DB for NoSQL podporuje pouze u nových kontejnerů. Během vytváření kontejneru je potřeba nastavit zásady vektoru kontejneru i všechny zásady indexování vektorů, protože je nelze později upravovat. Obě zásady budou možné upravit v budoucím vylepšení funkce Preview.

Spuštění vyhledávacího dotazu vektorové podobnosti

Jakmile vytvoříte kontejner s požadovanou zásadou vektoru a vložíte do kontejneru vektorová data, můžete provést vektorové vyhledávání pomocí systémové funkce Vector Distance v dotazu. Předpokládejme, že chcete hledat knihy o receptech na jídlo tak, že se podíváte na popis. Nejdřív potřebujete získat vložené texty dotazu. V tomto případě můžete chtít vygenerovat vkládání textu dotazu – "recept na jídlo". Jakmile budete mít vložený vyhledávací dotaz, můžete ho použít ve funkci VectorDistance ve vektorovém vyhledávacím dotazu a získat všechny položky, které jsou podobné vašemu dotazu, jak je znázorněno tady:

SELECT TOP 10 c.title, VectorDistance(c.contentVector, [1,2,3,4,5,6,7,8,9,10]) AS SimilarityScore
FROM c
ORDER BY VectorDistance(c.contentVector, [1,2,3,4,5,6,7,8,9,10])

Tento dotaz načte názvy knih spolu se skóre podobnosti vzhledem k vašemu dotazu. Tady je příklad v JavaScriptu:

const { resources } = await container.items
  .query({
    query: "SELECT c.title, VectorDistance(c.contentVector, @embedding) AS SimilarityScore FROM c  ORDER BY VectorDistance(c.contentVector, @embedding)"
    parameters: [{ name: "@embedding", value: [1,2,3,4,5,6,7,8,9,10] }]
  })
  .fetchAll();
for (const item of resources) {
  console.log(`${itme.title}, ${item.SimilarityScore} is a capitol `);
}