Usando o conector do Postgres Vector Store (versão prévia)
Aviso
A funcionalidade semântica do Repositório de Vetores kernel está em versão prévia e melhorias que exigem alterações significativas ainda podem ocorrer em circunstâncias limitadas antes do lançamento.
Visão geral
O conector do Postgres Vector Store pode ser usado para acessar e gerenciar dados no Postgres. O conector tem as seguintes características.
Área de Funcionalidade | Apoio |
---|---|
A coleção é mapeada para | Tabela Postgres |
Tipos de propriedade de chave com suporte |
|
Tipos de propriedade de dados com suporte |
|
Tipos de propriedade de vetor com suporte | ReadOnlyMemory<float> |
Tipos de índice com suporte | Hnsw |
Funções de distância suportadas |
|
Cláusulas de filtro com suporte |
|
Dá suporte a vários vetores em um registro | Sim |
Há suporte para o IsFilterable? | Não |
Há suporte para o IsFullTextSearchable? | Não |
O StoragePropertyName é suportado? | Sim |
Introdução
Adicione o pacote NuGet do conector do Postgres Vector Store ao seu projeto.
dotnet add package Microsoft.SemanticKernel.Connectors.Postgres --prerelease
Você pode adicionar o repositório de vetores ao contêiner de injeção de dependência IServiceCollection
usando métodos de extensão fornecidos pelo Kernel Semântico.
Nesse caso, uma instância da classe Npgsql.NpgsqlDataSource
, que tem recursos de vetor habilitados, também será registrada no contêiner.
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;");
Métodos de extensão que não têm parâmetros também são fornecidos. Isso exige que uma instância da classe Npgsql.NpgsqlDataSource
seja registrada separadamente no contêiner de injeção de dependência.
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();
Você pode construir diretamente uma instância do Repositório de Vetores do Postgres.
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);
É possível construir uma referência direta a uma coleção nomeada.
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");
Mapeamento de dados
O conector do Postgres Vector Store fornece um mapeador padrão ao mapear do modelo de dados para o armazenamento. Esse mapeador faz uma conversão direta da lista de propriedades no modelo de dados para as colunas no Postgres.
Também é possível substituir o comportamento de mapeador padrão fornecendo um mapeador personalizado por meio da propriedade PostgresVectorStoreRecordCollectionOptions<TRecord>.DictionaryCustomMapper
.
Substituição do nome da propriedade
Você pode substituir nomes de propriedades a serem usados no armazenamento que são diferentes dos nomes de propriedade no modelo de dados.
A substituição do nome da propriedade é feita definindo a opção StoragePropertyName
por meio dos atributos de propriedade do modelo de dados ou da definição de registro.
Aqui está um exemplo de um modelo de dados com StoragePropertyName
definido em seus atributos e como isso será representado na consulta Postgres.
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")
);
Em breve
Mais informações em breve.
JDBC
O conector JDBC pode ser usado para se conectar ao Postgres.