Использование соединителя Хранилища векторов Azure CosmosDB NoSQL (предварительная версия)
Предупреждение
Функции хранилища векторов семантического ядра доступны в предварительной версии и улучшения, требующие критических изменений, могут по-прежнему возникать в ограниченных обстоятельствах перед выпуском.
Обзор
Соединитель Хранилища векторов Azure CosmosDB NoSQL можно использовать для доступа к данным и управления ими в Azure CosmosDB NoSQL. Соединитель имеет следующие характеристики.
Область функций | Поддержка |
---|---|
Коллекция сопоставляется с | Контейнер NoSQL Azure Cosmos DB |
Поддерживаемые типы свойств ключей |
|
Поддерживаемые типы свойств данных |
|
Поддерживаемые типы свойств вектора |
|
Поддерживаемые типы индексов |
|
Поддерживаемые функции расстояния |
|
Поддерживаемые предложения фильтров |
|
Поддержка нескольких векторов в записи | Да |
Поддерживается IsFilterable? | Да |
Поддерживается ЛиFullTextSearchable? | Да |
Поддерживается StoragePropertyName? | Нет, используйте JsonSerializerOptions и JsonPropertyNameAttribute вместо этого.
Дополнительные сведения см. здесь. |
Ограничения
При инициализации CosmosClient
вручную необходимо указать CosmosClientOptions.UseSystemTextJsonSerializerWithOptions
из-за ограничений в сериализаторе по умолчанию. Этот параметр можно задать для JsonSerializerOptions.Default
или настроить с другими параметрами сериализатора в соответствии с конкретными потребностями конфигурации.
var cosmosClient = new CosmosClient(connectionString, new CosmosClientOptions()
{
UseSystemTextJsonSerializerWithOptions = JsonSerializerOptions.Default,
});
Начало работы
Добавьте в проект пакет NuGet соединителя Azure CosmosDB NoSQL Vector Store.
dotnet add package Microsoft.SemanticKernel.Connectors.AzureCosmosDBNoSQL --prerelease
Хранилище векторов можно добавить в контейнер внедрения зависимостей, доступный в KernelBuilder
контейнере внедрения зависимостей или в IServiceCollection
контейнер внедрения зависимостей, используя методы расширения, предоставляемые семантического ядра.
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);
Методы расширения, которые не принимают параметров, также предоставляются. Для них требуется, чтобы экземпляр Microsoft.Azure.Cosmos.Database
регистрировался отдельно в контейнере внедрения зависимостей.
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();
Вы можете напрямую создать экземпляр Хранилища векторов Azure CosmosDB NoSQL.
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);
Можно создать прямую ссылку на именованную коллекцию.
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");
Сопоставление данных
Соединитель Хранилища векторов Azure CosmosDB NoSQL предоставляет инструмент сопоставления по умолчанию при сопоставлении из модели данных в хранилище.
Этот модуль сопоставления выполняет прямое преобразование списка свойств модели данных в поля в Azure CosmosDB NoSQL и использует System.Text.Json.JsonSerializer
для преобразования в схему хранилища. Это означает, что использование объекта JsonPropertyNameAttribute
поддерживается, если требуется другое имя хранилища для имени свойства модели данных. Единственным исключением является ключ записи, сопоставленной с полем базы данных с именем id
, так как все записи NoSQL CosmosDB должны использовать это имя для идентификаторов.
Также можно использовать пользовательский JsonSerializerOptions
экземпляр с настраиваемой политикой именования свойств. Чтобы включить это, JsonSerializerOptions
необходимо передать в AzureCosmosDBNoSQLVectorStoreRecordCollection
строительство.
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 });
Используя приведенный выше пользовательский код JsonSerializerOptions
, который используется SnakeCaseUpper
, следующая модель данных будет сопоставлена с приведенным ниже 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],
}
Использование ключа раздела
В соединителе Azure Cosmos DB для NoSQL свойство ключа секции по умолчанию установлено на свойство ключа — id
. Свойство PartitionKeyPropertyName
в классе AzureCosmosDBNoSQLVectorStoreRecordCollectionOptions<TRecord>
позволяет указать другое свойство в качестве ключа секции.
Класс AzureCosmosDBNoSQLVectorStoreRecordCollection
поддерживает два ключевых типа: string
и AzureCosmosDBNoSQLCompositeKey
.
AzureCosmosDBNoSQLCompositeKey
состоит из RecordKey
и PartitionKey
.
Если свойство ключа секции не задано (и используется свойство ключа по умолчанию), string
ключи можно использовать для операций с записями базы данных. Однако если задано свойство ключа раздела, рекомендуется использовать AzureCosmosDBNoSQLCompositeKey
для предоставления значений ключа и ключа раздела.
Укажите имя свойства ключа раздела:
var options = new AzureCosmosDBNoSQLVectorStoreRecordCollectionOptions<Hotel>
{
PartitionKeyPropertyName = nameof(Hotel.HotelName)
};
var collection = new AzureCosmosDBNoSQLVectorStoreRecordCollection<Hotel>(database, "collection-name", options)
as IVectorStoreRecordCollection<AzureCosmosDBNoSQLCompositeKey, Hotel>;
Получение с использованием ключа разбивки:
var record = await collection.GetAsync(new AzureCosmosDBNoSQLCompositeKey("hotel-id", "hotel-name"));
Скоро
Дополнительные сведения в ближайшее время.
Скоро
Дополнительные сведения в ближайшее время.