Použití konektoru Azure CosmosDB NoSQL Vector Store (Preview)
Upozorňující
Funkce sémantického úložiště vektorů jádra je ve verzi Preview a vylepšení, která vyžadují zásadní změny, se můžou vyskytovat za omezených okolností před vydáním.
Přehled
Konektor Azure CosmosDB NoSQL Vector Store je možné použít k přístupu k datům v NoSQL a jejich správě. Konektor má následující charakteristiky.
Oblast funkcí | Technická podpora |
---|---|
Kolekce map na | Kontejner NoSQL služby Azure Cosmos DB |
Podporované typy vlastností klíče |
|
Podporované typy datových vlastností |
|
Podporované typy vektorových vlastností |
|
Podporované typy indexů |
|
Podporované funkce vzdálenosti |
|
Podporované klauzule filtru |
|
Podporuje více vektorů v záznamu. | Ano |
Je podporováno Filtrování? | Ano |
Podporuje se IsFullTextSearchable? | Ano |
StoragePropertyName se podporuje? | Ne, použijte JsonSerializerOptions a JsonPropertyNameAttribute místo toho.
Další informace najdete tady. |
Omezení
Při inicializaci CosmosClient
ručně je nutné zadat CosmosClientOptions.UseSystemTextJsonSerializerWithOptions
kvůli omezením ve výchozím serializátoru. Tuto možnost můžete nastavit na JsonSerializerOptions.Default
nebo přizpůsobit pomocí dalších možností serializátoru, aby vyhovovala konkrétním potřebám konfigurace.
var cosmosClient = new CosmosClient(connectionString, new CosmosClientOptions()
{
UseSystemTextJsonSerializerWithOptions = JsonSerializerOptions.Default,
});
Začínáme
Do projektu přidejte balíček NuGet konektoru NoSQL NoSQL Vector Store.
dotnet add package Microsoft.SemanticKernel.Connectors.AzureCosmosDBNoSQL --prerelease
Vektorové úložiště můžete přidat do kontejneru injektáže závislostí dostupného KernelBuilder
v IServiceCollection
kontejneru injektáže závislostí nebo do kontejneru injektáže závislostí pomocí rozšiřujících metod poskytovaných sémantickým jádrem.
using Microsoft.SemanticKernel;
// Using Kernel Builder.
var kernelBuilder = Kernel
.CreateBuilder()
.AddAzureCosmosDBNoSQLVectorStore(connectionString, databaseName);
using Microsoft.SemanticKernel;
// Using IServiceCollection with ASP.NET Core.
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddAzureCosmosDBNoSQLVectorStore(connectionString, databaseName);
K dispozici jsou také metody rozšíření, které nepoužívají žádné parametry. Vyžadují samostatnou registraci instance Microsoft.Azure.Cosmos.Database
kontejneru injektáže závislostí.
using Microsoft.Azure.Cosmos;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.SemanticKernel;
// Using Kernel Builder.
var kernelBuilder = Kernel.CreateBuilder();
kernelBuilder.Services.AddSingleton<Database>(
sp =>
{
var cosmosClient = new CosmosClient(connectionString, new CosmosClientOptions()
{
// When initializing CosmosClient manually, setting this property is required
// due to limitations in default serializer.
UseSystemTextJsonSerializerWithOptions = JsonSerializerOptions.Default,
});
return cosmosClient.GetDatabase(databaseName);
});
kernelBuilder.AddAzureCosmosDBNoSQLVectorStore();
using Microsoft.Azure.Cosmos;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.SemanticKernel;
// Using IServiceCollection with ASP.NET Core.
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddSingleton<Database>(
sp =>
{
var cosmosClient = new CosmosClient(connectionString, new CosmosClientOptions()
{
// When initializing CosmosClient manually, setting this property is required
// due to limitations in default serializer.
UseSystemTextJsonSerializerWithOptions = JsonSerializerOptions.Default,
});
return cosmosClient.GetDatabase(databaseName);
});
builder.Services.AddAzureCosmosDBNoSQLVectorStore();
Instanci Azure CosmosDB NoSQL Vector Store můžete vytvořit přímo.
using Microsoft.Azure.Cosmos;
using Microsoft.SemanticKernel.Connectors.AzureCosmosDBNoSQL;
var cosmosClient = new CosmosClient(connectionString, new CosmosClientOptions()
{
// When initializing CosmosClient manually, setting this property is required
// due to limitations in default serializer.
UseSystemTextJsonSerializerWithOptions = JsonSerializerOptions.Default,
});
var database = cosmosClient.GetDatabase(databaseName);
var vectorStore = new AzureCosmosDBNoSQLVectorStore(database);
Je možné vytvořit přímý odkaz na pojmenovanou kolekci.
using Microsoft.Azure.Cosmos;
using Microsoft.SemanticKernel.Connectors.AzureCosmosDBNoSQL;
var cosmosClient = new CosmosClient(connectionString, new CosmosClientOptions()
{
// When initializing CosmosClient manually, setting this property is required
// due to limitations in default serializer.
UseSystemTextJsonSerializerWithOptions = JsonSerializerOptions.Default,
});
var database = cosmosClient.GetDatabase(databaseName);
var collection = new AzureCosmosDBNoSQLVectorStoreRecordCollection<Hotel>(
database,
"skhotels");
Mapování dat
Konektor Azure CosmosDB NoSQL Vector Store poskytuje výchozí mapovač při mapování z datového modelu do úložiště.
Tento mapovač provede přímý převod seznamu vlastností datového modelu na pole v NoSQL služby Azure CosmosDB a používá System.Text.Json.JsonSerializer
k převodu na schéma úložiště. To znamená, že použití tohoto objektu JsonPropertyNameAttribute
se podporuje, pokud se vyžaduje jiný název úložiště s názvem vlastnosti datového modelu. Jedinou výjimkou je klíč záznamu, který je namapován na pole databáze s názvem id
, protože všechny záznamy NoSQL služby Cosmos DB musí pro ID používat tento název.
Vlastní instanci je také možné použít JsonSerializerOptions
s vlastní zásadou pojmenování vlastností. Aby to bylo možné, JsonSerializerOptions
musí být předána AzureCosmosDBNoSQLVectorStoreRecordCollection
do konstrukce.
using System.Text.Json;
using Microsoft.Azure.Cosmos;
using Microsoft.SemanticKernel.Connectors.AzureCosmosDBNoSQL;
var jsonSerializerOptions = new JsonSerializerOptions { PropertyNamingPolicy = JsonNamingPolicy.SnakeCaseUpper };
var cosmosClient = new CosmosClient(connectionString, new CosmosClientOptions()
{
// When initializing CosmosClient manually, setting this property is required
// due to limitations in default serializer.
UseSystemTextJsonSerializerWithOptions = jsonSerializerOptions
});
var database = cosmosClient.GetDatabase(databaseName);
var collection = new AzureCosmosDBNoSQLVectorStoreRecordCollection<Hotel>(
database,
"skhotels",
new() { JsonSerializerOptions = jsonSerializerOptions });
Pomocí výše uvedeného vlastního JsonSerializerOptions
modelu, který používá SnakeCaseUpper
, se následující datový model namapuje na následující json.
using System.Text.Json.Serialization;
using Microsoft.Extensions.VectorData;
public class Hotel
{
[VectorStoreRecordKey]
public ulong HotelId { get; set; }
[VectorStoreRecordData(IsFilterable = true)]
public string HotelName { get; set; }
[VectorStoreRecordData(IsFullTextSearchable = true)]
public string Description { get; set; }
[JsonPropertyName("HOTEL_DESCRIPTION_EMBEDDING")]
[VectorStoreRecordVector(4, DistanceFunction.EuclideanDistance, IndexKind.QuantizedFlat)]
public ReadOnlyMemory<float>? DescriptionEmbedding { get; set; }
}
{
"id": 1,
"HOTEL_NAME": "Hotel Happy",
"DESCRIPTION": "A place where everyone can be happy.",
"HOTEL_DESCRIPTION_EMBEDDING": [0.9, 0.1, 0.1, 0.1],
}
Použití klíče oddílu
Ve výchozím nastavení je vlastnost klíče oddílu v konektoru Azure Cosmos DB for NoSQL nastavena na vlastnost klíče – id
. Vlastnost PartitionKeyPropertyName
ve třídě AzureCosmosDBNoSQLVectorStoreRecordCollectionOptions<TRecord>
umožňuje zadat jinou vlastnost jako klíč oddílu.
Třída AzureCosmosDBNoSQLVectorStoreRecordCollection
podporuje dva typy klíčů: string
a AzureCosmosDBNoSQLCompositeKey
.
AzureCosmosDBNoSQLCompositeKey
se skládá z RecordKey
a PartitionKey
.
Pokud vlastnost klíče oddílu není nastavená (a použije se výchozí vlastnost klíče), lze string
klíče použít pro operace se záznamy databáze. Pokud je však zadána vlastnost klíče oddílu, doporučuje se použít AzureCosmosDBNoSQLCompositeKey
k zadání hodnot klíče i klíče oddílu.
Zadejte název vlastnosti klíče oddílu:
var options = new AzureCosmosDBNoSQLVectorStoreRecordCollectionOptions<Hotel>
{
PartitionKeyPropertyName = nameof(Hotel.HotelName)
};
var collection = new AzureCosmosDBNoSQLVectorStoreRecordCollection<Hotel>(database, "collection-name", options)
as IVectorStoreRecordCollection<AzureCosmosDBNoSQLCompositeKey, Hotel>;
Získat pomocí klíče oddílu:
var record = await collection.GetAsync(new AzureCosmosDBNoSQLCompositeKey("hotel-id", "hotel-name"));
Již brzy
Další informace budou brzy k dispozici.
Již brzy
Další informace budou brzy k dispozici.