Partager via


Utilisation du connecteur Postgres Vector Store (préversion)

Avertissement

La fonctionnalité de magasin de vecteurs du noyau sémantique est en préversion et des améliorations nécessitant des modifications majeures peuvent encore se produire dans des circonstances limitées avant leur mise en production.

Aperçu

Le connecteur Postgres Vector Store peut être utilisé pour accéder aux données et les gérer dans Postgres. Le connecteur présente les caractéristiques suivantes.

Zone de fonctionnalités Soutien
Correspondances de collection avec Table Postgres
Types de propriétés de clé pris en charge
  • court
  • Int
  • long
  • corde
  • Guid
Types de propriétés de données pris en charge
  • bool
  • court
  • Int
  • long
  • flotter
  • double
  • décimal
  • corde
  • Date et heure
  • DateTimeOffset
  • Guid
  • byte[]
  • bool Enumerables
  • Courts énumérables
  • énumérables int
  • énumérables longs
  • flottants énumérables
  • énumérables doubles
  • Énumérables décimales
  • énumérables de chaînes
  • Énumérables de DateTime
  • Énumérables de DateTimeOffset
  • Énumérables GUID
Types de propriétés vectorielles pris en charge ReadOnlyMemory<float>
Types d’index pris en charge Hnsw
Fonctions de distance prises en charge
  • CosineDistance
  • CosineSimilarity
  • DotProductSimilarity
  • EuclideanDistance
  • ManhattanDistance
Clauses de filtre prises en charge
  • AnyTagEqualTo
  • EqualTo
Prend en charge plusieurs vecteurs dans un enregistrement Oui
La fonctionnalité IsFilterable est-elle prise en charge ? Non
IsFullTextSearchable est-il pris en charge ? Non
Le StoragePropertyName est-il pris en charge ? Oui

Commencer

Ajoutez le package NuGet du connecteur Postgres Vector Store à votre projet.

dotnet add package Microsoft.SemanticKernel.Connectors.Postgres --prerelease

Vous pouvez ajouter le magasin de vecteurs au conteneur d’injection de dépendances IServiceCollection à l’aide de méthodes d’extension fournies par le noyau sémantique.

Dans ce cas, une instance de la classe Npgsql.NpgsqlDataSource, qui a des fonctionnalités vectorielles activées, est également inscrite auprès du conteneur.

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;");

Les méthodes d’extension qui ne prennent aucun paramètre sont également fournies. Celles-ci nécessitent qu’une instance de la classe Npgsql.NpgsqlDataSource soit inscrite séparément auprès du conteneur d’injection de dépendances.

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();

Vous pouvez construire une instance postgres Vector Store directement.

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);

Il est possible de construire une référence directe à une collection nommée.

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");

Mappage des données

Le connecteur Postgres Vector Store fournit un mappeur par défaut lors du mappage du modèle de données au stockage. Ce mappeur effectue une conversion directe de la liste des propriétés du modèle de données vers les colonnes dans Postgres.

Il est également possible de remplacer le comportement du mappeur par défaut en fournissant un mappeur personnalisé via la propriété PostgresVectorStoreRecordCollectionOptions<TRecord>.DictionaryCustomMapper.

Surcharge du nom de propriété

Vous pouvez remplacer les noms de propriétés utilisés dans le stockage, qui sont différents de ceux du modèle de données. Le remplacement du nom de propriété est effectué en définissant l’option StoragePropertyName via les attributs de propriété du modèle de données ou la définition d’enregistrement.

Voici un exemple de modèle de données avec StoragePropertyName défini sur ses attributs et comment cela sera représenté dans la requête 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")
);

À venir

Plus d’informations prochainement.

JDBC

Le connecteur JDBC peut être utilisé pour se connecter à Postgres.