Поделиться через


Использование соединителя Postgres Vector Store (предварительная версия)

Предупреждение

Функции хранилища векторов семантического ядра доступны в предварительной версии и улучшения, требующие критических изменений, могут по-прежнему возникать в ограниченных обстоятельствах перед выпуском.

Обзор

Соединитель Postgres Vector Store можно использовать для доступа к данным и управления ими в Postgres. Соединитель имеет следующие характеристики.

Область функций Поддержка
Коллекция сопоставляется с Таблица Postgres
Поддерживаемые типы свойств ключей
  • короткий
  • int
  • длинный
  • струна
  • Guid
Поддерживаемые типы свойств данных
  • bool
  • короткий
  • int
  • длинный
  • плавать
  • двойной
  • десятичный
  • струна
  • Дата и время
  • DateTimeOffset
  • Guid
  • байт[]
  • bool Enumerables
  • короткие перечисления
  • int Перечисляемые
  • длинные перечисления
  • Перечисляемые типы float
  • двойные перечисления
  • перечисляемые десятичные значения
  • строковые перечисления
  • Перечисляемые объекты DateTime
  • Перечисления DateTimeOffset
  • Перечисление GUID
Поддерживаемые типы свойств вектора Память только для чтения<число с плавающей точкой>
Поддерживаемые типы индексов Hnsw
Поддерживаемые функции для вычисления расстояния
  • CosineDistance
  • CosineSimilarity
  • DotProductSimilarity
  • EuclideanDistance
  • Манхэттенское расстояние
Поддерживаемые условия фильтров
  • AnyTagEqualTo
  • EqualTo
Поддержка нескольких векторов в записи Да
Поддерживается 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")
);

Скоро

Дополнительные сведения в ближайшее время.

JDBC

Соединитель JDBC можно использовать для подключения к Postgres.