Indexování a vektory dotazů ve službě Azure Cosmos DB for NoSQL v .NET
PLATÍ PRO: NoSQL
Vektorové vyhledávání ve službě Azure Cosmos DB for NoSQL je aktuálně funkce ve verzi Preview. Před použitím musíte 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 .NET SDK služby Azure Cosmos DB preview (3.41.0-preview.0)
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í se v současné době nepodporuje u existujících kontejnerů, takže je potřeba vytvořit nový kontejner a zadat zásadu vkládání vektorů na úrovni kontejneru a zásadu indexování vektorů při vytváření kontejneru.
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ů.
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, 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 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}");
}
}