Compartir a través de


Uso del conector de almacenamiento de vectores para Postgres (versión preliminar)

Advertencia

La funcionalidad del Almacén de vectores del núcleo semántico está en versión preliminar, y las mejoras que requieren cambios importantes pueden producirse en circunstancias limitadas antes del lanzamiento.

Visión general

El conector del almacén de vectores de Postgres se puede usar para acceder a los datos de Postgres y administrarlos. El conector tiene las siguientes características.

Área de características Apoyo
La colección se asigna a Tabla Postgres
Tipos de propiedades de clave admitidos
  • corto
  • Int
  • largo
  • cadena
  • Guía
Tipos de propiedad de datos admitidos
  • Bool
  • corto
  • Int
  • largo
  • flotar
  • doble
  • decimal
  • cuerda
  • FechaHora
  • Desplazamiento de Fecha y Hora
  • Guid
  • byte[]
  • bool enumerables
  • enumerables cortos
  • int (enumerables)
  • enumerables largos
  • tipo flotante Enumerables
  • Enumerables de tipo doble
  • Enumerables decimales
  • string Enumerables
  • Enumerables de FechaHora
  • DateTimeOffset Enumerables
  • Guid Enumerables
Tipos de propiedades vectoriales admitidos Memoria de solo lectura<float>
Tipos de índice admitidos Hnsw
Funciones de distancia admitidas
  • CosineDistance
  • CosineSimilarity
  • DotProductSimilarity
  • EuclideanDistance
  • ManhattanDistance
Cláusulas de filtro admitidas
  • AnyTagEqualTo
  • EqualTo
Admite varios vectores en un registro
¿Se admite IsFilterable? No
¿Se admite IsFullTextSearchable? No
¿Se admite StoragePropertyName?

Empezar

Agregue el paquete NuGet del conector del almacén de vectores de Postgres a su proyecto.

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

Puede agregar el almacén de vectores al contenedor de inserción de dependencias IServiceCollection mediante métodos de extensión proporcionados por el Kernel Semántico.

En este caso, una instancia de la clase Npgsql.NpgsqlDataSource, que tiene habilitadas las funcionalidades de vector, también se registrará con el contenedor.

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

También se proporcionan métodos de extensión que no toman parámetros. Estos requieren que una instancia de la clase Npgsql.NpgsqlDataSource se registre por separado con el contenedor de inserción de dependencias.

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

Puede construir una instancia de Postgres Vector Store directamente.

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

Es posible construir una referencia directa a una colección con nombre.

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

Asignación de datos

El conector del almacén de vectores de Postgres proporciona un mapeador predeterminado para mapear del modelo de datos al almacenamiento. Este mapeador realiza una conversión directa de la lista de propiedades del modelo de datos a las columnas de PostgreSQL.

También es posible invalidar el comportamiento predeterminado del asignador proporcionando un asignador personalizado a través de la propiedad PostgresVectorStoreRecordCollectionOptions<TRecord>.DictionaryCustomMapper.

Invalidación del nombre de propiedad

Puede invalidar los nombres de propiedad que se usarán en el almacenamiento que sea diferente a los nombres de propiedad del modelo de datos. La anulación del nombre de propiedad se realiza al establecer la opción StoragePropertyName a través de los atributos de propiedad del modelo de datos o de la definición de registro.

Este es un ejemplo de un modelo de datos con StoragePropertyName establecido en sus atributos y cómo se representará en la 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")
);

Próximamente

Más información próximamente.

JDBC

El conector JDBC se puede usar para conectarse a Postgres.