Indexování a dotazování vektorů ve službě Azure Cosmos DB for NoSQL v .NET
Než začnete používat indexování vektorů a vyhledávání, musíte nejprve tuto funkci povolit. Tento článek popisuje následující kroky:
- Povolení vektorového vyhledávání 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 .NET SDK služby Azure Cosmos DB (verze: 3.45.0 nebo novější, Preview: 3.46.0-preview.0 nebo novější).
Povolení funkce
Vektorové vyhledávání služby Azure Cosmos DB for NoSQL vyžaduje povolení funkce provedením následujících kroků:
- 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 ji chcete povolit.
- Výběrem možnosti Povolit zapnete vektorové vyhledávání ve službě Azure Cosmos DB for NoSQL.
Tip
Alternativně můžete pomocí Azure CLI aktualizovat možnosti vašeho účtu tak, aby podporovaly vektorové vyhledávání NoSQL.
az cosmosdb update \
--resource-group <resource-group-name> \
--name <account-name> \
--capabilities EnableNoSQLVectorSearch
Poznámka:
Žádost o registraci bude automaticky schválena; může však trvat 15 minut, než se projeví.
Vysvětlení kroků spojených s hledáním vektorů
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 následující strukturu položek uložených 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:
- "path": Cesta vlastnosti, která obsahuje vektory
- "datatype": Typ prvků vektoru (výchozí float32)
- "dimenze": Délka každého vektoru v cestě (výchozí hodnota 1536)
- "distanceFunction": Metrika použitá k výpočtu vzdálenosti/podobnosti (výchozí kosinus)
V našem příkladu s podrobnostmi o knize může zásada vektoru vypadat jako následující příklad JSON:
Database db = await client.CreateDatabaseIfNotExistsAsync("vector-benchmarking");
List<Embedding> embeddings = new List<Embedding>()
{
new Embedding()
{
Path = "/coverImageVector",
DataType = VectorDataType.Float32,
DistanceFunction = DistanceFunction.Cosine,
Dimensions = 8,
},
new Embedding()
{
Path = "/contentVector",
DataType = VectorDataType.Float32,
DistanceFunction = DistanceFunction.Cosine,
Dimensions = 10,
}
};
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. Funkce vektorového vyhledávání pro Azure Cosmos DB for NoSQL se v současné době podporuje jenom u nových kontejnerů, takže během vytváření kontejneru je potřeba použít zásadu vektoru a později ji nejde upravit. V tomto příkladu by zásady indexování vypadaly přibližně takto:
Collection<Embedding> collection = new Collection<Embedding>(embeddings);
ContainerProperties properties = new ContainerProperties(id: "vector-container", partitionKeyPath: "/id")
{
VectorEmbeddingPolicy = new(collection),
IndexingPolicy = new IndexingPolicy()
{
VectorIndexes = new()
{
new VectorIndexPath()
{
Path = "/vector",
Type = VectorIndexType.QuantizedFlat,
}
}
},
};
properties.IndexingPolicy.IncludedPaths.Add(new IncludedPath { Path = "/*" });
properties.IndexingPolicy.ExcludedPaths.Add(new ExcludedPath { Path = "/vector/*" });
Důležité
Vektorová cesta přidaná do oddílu "excludedPaths" zásad indexování, aby se zajistil optimalizovaný výkon pro vložení. Přidáním vektorové cesty do vyloučených cest způsobíte vyšší poplatky za RU a latenci při vkládání vektorů.
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, musíte nejdřív získat vkládání textu 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 .NET:
float[] embedding = {1f,2f,3f,4f,5f,6f,7f,8f,9f,10f};
var queryDef = new QueryDefinition(
query: $"SELECT c.title, VectorDistance(c.contentVector,@embedding) AS SimilarityScore FROM c ORDER BY VectorDistance(c.contentVector,@embedding)"
).WithParameter("@embedding", embedding);
using FeedIterator<Object> feed = container.GetItemQueryIterator<Object>(
queryDefinition: queryDef
);
while (feed.HasMoreResults)
{
FeedResponse<Object> response = await feed.ReadNextAsync();
foreach ( Object item in response)
{
Console.WriteLine($"Found item:\t{item}");
}
}