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:
Registrace verze Preview služby Vector Search ve službě Azure Cosmos DB for NoSQL
Nastavení kontejneru Azure Cosmos DB pro vektorové vyhledávání
Zásady vkládání vektorů pro vytváření
Přidání vektorových indexů do zásad indexování kontejnerů
Vytvoření kontejneru s vektorovými indexy a zásadami vkládání vektorů
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
- Existující účet Azure Cosmos DB for NoSQL.
- Pokud nemáte předplatné Azure, vyzkoušejte službu Azure Cosmos DB pro NoSQL zdarma.
- Pokud máte existující předplatné Azure, vytvořte nový účet Azure Cosmos DB for NoSQL.
- Nejnovější verze sady JavaScript SDK služby Azure Cosmos DB (verze 4.1.0 nebo novější)
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ě:
Přejděte na stránku prostředku Azure Cosmos DB for NoSQL.
V položce nabídky Nastavení vyberte podokno Funkce.
Vyberte možnost Vektorové vyhledávání ve službě Azure Cosmos DB for NoSQL.
Přečtěte si popis funkce a potvrďte, že se chcete zaregistrovat ve verzi Preview.
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í.
Vysvětlení kroků spojených s hledáním vektorů
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.
- Vytvořte a uložte vkládání vektorů pro pole, na kterých chcete provádět vektorové vyhledávání.
- Zadejte cesty pro vkládání vektorů v zásadách vkládání vektorů.
- 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 `);
}