Usando o conector de Armazenamento de Vetor Postgres (Pré-visualização)
Advertência
A funcionalidade de armazenamento vetorial do Semantic Kernel está em pré-visualização, e melhorias que exigem alterações significativas ainda podem ocorrer em circunstâncias limitadas antes do lançamento.
Visão geral
O conector Postgres Vetor Store pode ser usado para acessar e gerenciar dados no Postgres. O conector tem as seguintes características.
Área de Destaque | Suporte |
---|---|
Mapeamento da coleção para | Tabela Postgres |
Tipos de propriedade de chave suportados |
|
Tipos de propriedade de dados suportados |
|
Tipos de propriedade vetorial suportados | ReadOnlyMemory<float> |
Tipos de índice suportados | Hnsw |
Funções de distância suportadas |
|
Cláusulas de filtro suportadas |
|
Suporta vários vetores em um registro | Sim |
É o IsFilterable suportado? | Não |
IsFullTextSearchable é suportado? | Não |
¿StoragePropertyName suportado? | Sim |
Primeiros passos
Adicione o pacote NuGet do conector Postgres Vector Store ao seu projeto.
dotnet add package Microsoft.SemanticKernel.Connectors.Postgres --prerelease
Você pode adicionar o armazenamento de vetores ao contêiner de injeção de dependência IServiceCollection
usando métodos de extensão fornecidos pelo Semantic Kernel.
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 usam parâmetros também são fornecidos. Isto necessita que uma instância da classe Npgsql.NpgsqlDataSource
seja registada 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 uma instância do Postgres Vetor Store diretamente.
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 Postgres Vetor Store fornece um mapeador padrão ao mapear do modelo de dados para o armazenamento. Este 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 do mapeador padrão fornecendo um mapeador personalizado por meio da propriedade PostgresVectorStoreRecordCollectionOptions<TRecord>.DictionaryCustomMapper
.
Substituição do nome da propriedade
Você pode substituir os nomes de propriedade usados no armazenamento, que são diferentes dos nomes de propriedade no modelo de dados.
A substituição do nome da propriedade é realizada configurando a opção StoragePropertyName
nos atributos de propriedade do modelo de dados ou na definição de registo.
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")
);
Brevemente
Mais informações em breve.
JDBC
O conector JDBC pode ser usado para se conectar ao Postgres.