Использование соединителя Postgres Vector Store (предварительная версия)
Предупреждение
Функции хранилища векторов семантического ядра доступны в предварительной версии и улучшения, требующие критических изменений, могут по-прежнему возникать в ограниченных обстоятельствах перед выпуском.
Обзор
Соединитель Postgres Vector Store можно использовать для доступа к данным и управления ими в Postgres. Соединитель имеет следующие характеристики.
Область функций | Поддержка |
---|---|
Коллекция сопоставляется с | Таблица Postgres |
Поддерживаемые типы свойств ключей |
|
Поддерживаемые типы свойств данных |
|
Поддерживаемые типы свойств вектора | Память только для чтения<число с плавающей точкой> |
Поддерживаемые типы индексов | Hnsw |
Поддерживаемые функции для вычисления расстояния |
|
Поддерживаемые условия фильтров |
|
Поддержка нескольких векторов в записи | Да |
Поддерживается IsFilterable? | Нет |
Поддерживается ЛиFullTextSearchable? | Нет |
Поддерживается StoragePropertyName? | Да |
Начало работы
Добавьте в проект пакет NuGet соединителя Postgres Vector Store.
dotnet add package Microsoft.SemanticKernel.Connectors.Postgres --prerelease
Хранилище векторов можно добавить в контейнер внедрения зависимостей IServiceCollection
с помощью методов расширения, предоставляемых семантическим ядром.
В этом случае экземпляр класса Npgsql.NpgsqlDataSource
с включенными векторными возможностями также будет зарегистрирован в контейнере.
using Microsoft.SemanticKernel;
// Using IServiceCollection with ASP.NET Core.
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddPostgresVectorStore("Host=localhost;Port=5432;Username=postgres;Password=example;Database=postgres;");
Методы расширения, которые не принимают параметров, также предоставляются. Для них требуется, чтобы экземпляр класса Npgsql.NpgsqlDataSource
был отдельно зарегистрирован в контейнере внедрения зависимостей.
using Microsoft.Extensions.DependencyInjection;
using Microsoft.SemanticKernel;
using Npgsql;
// Using IServiceCollection with ASP.NET Core.
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddSingleton<NpgsqlDataSource>(sp =>
{
NpgsqlDataSourceBuilder dataSourceBuilder = new("Host=localhost;Port=5432;Username=postgres;Password=example;Database=postgres;");
dataSourceBuilder.UseVector();
return dataSourceBuilder.Build();
});
builder.Services.AddPostgresVectorStore();
Экземпляр Postgres Vector Store можно создать напрямую.
using Microsoft.SemanticKernel.Connectors.Postgres;
using Npgsql;
NpgsqlDataSourceBuilder dataSourceBuilder = new("Host=localhost;Port=5432;Username=postgres;Password=example;Database=postgres;");
dataSourceBuilder.UseVector();
var dataSource = dataSourceBuilder.Build();
var connection = new PostgresVectorStore(dataSource);
Можно создать прямую ссылку на именованную коллекцию.
using Microsoft.SemanticKernel.Connectors.Postgres;
using Npgsql;
NpgsqlDataSourceBuilder dataSourceBuilder = new("Host=localhost;Port=5432;Username=postgres;Password=example;Database=postgres;");
dataSourceBuilder.UseVector();
var dataSource = dataSourceBuilder.Build();
var collection = new PostgresVectorStoreRecordCollection<string, Hotel>(dataSource, "skhotels");
Сопоставление данных
Соединитель Postgres Vector Store предоставляет маппер по умолчанию при сопоставлении модели данных с хранилищем. В этом мэппере происходит прямое преобразование списка свойств в модели данных в столбцы в PostgreSQL.
Кроме того, можно переопределить поведение маппера по умолчанию, предоставив настраиваемый маппер через свойство PostgresVectorStoreRecordCollectionOptions<TRecord>.DictionaryCustomMapper
.
Переопределение имени свойства
Имена свойств можно переопределить для использования в хранилище, которое отличается от имен свойств в модели данных.
Переопределение имени свойства выполняется путем задания параметра StoragePropertyName
с помощью атрибутов свойств модели данных или определения записи.
Вот пример модели данных, в которой атрибуты установлены на StoragePropertyName
, и то, как это будет представлено в запросе PostgreSQL.
using Microsoft.Extensions.VectorData;
public class Hotel
{
[VectorStoreRecordKey]
public ulong HotelId { get; set; }
[VectorStoreRecordData(StoragePropertyName = "hotel_name")]
public string? HotelName { get; set; }
[VectorStoreRecordData(StoragePropertyName = "hotel_description")]
public string? Description { get; set; }
[VectorStoreRecordVector(Dimensions: 4, DistanceFunction.CosineDistance)]
public ReadOnlyMemory<float>? DescriptionEmbedding { get; set; }
}
CREATE TABLE public."Hotels" (
"HotelId" INTEGER NOT NULL,
"hotel_name" TEXT ,
"hotel_description" TEXT ,
"DescriptionEmbedding" VECTOR(4) ,
PRIMARY KEY ("HotelId")
);
Скоро
Дополнительные сведения в ближайшее время.