Compartilhar via


Usando o conector Pinecone (versão prévia)

Aviso

A funcionalidade do Repositório de Vetores do Kernel Semântico está em versão prévia e as melhorias que exigem alterações significativas ainda podem ocorrer em circunstâncias limitadas antes do lançamento.

Visão geral

O conector do Repositório de Vetores da Pinha pode ser usado para acessar e gerenciar dados na Pinha. O conector tem as seguintes características.

Área de recurso Suporte
A coleção é mapeada para Índice sem servidor Pinecone
Tipos de propriedade de chave com suporte string
Tipos de propriedade de dados com suporte
  • string
  • INT
  • longo
  • duplo
  • float
  • bool
  • decimal
  • enumeráveis do tipo string
Tipos de propriedade de vetor com suporte Float ReadOnlyMemory<>
Tipos de índice com suporte PGA (Algoritmo de Gráfico de Pinha)
Funções de distância suportadas
  • Semelhança de cosseno
  • DotProductSimilarity
  • Distância Euclidiana
Suporta vários vetores em um registro Não
IsFilterable suportado? Sim
IsFullTextSearchable suportado? Não
StoragePropertyName com suporte? Sim

Introdução

Adicione o pacote NuGet do conector do Repositório de Vetores de Pinha ao seu projeto.

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

Você pode adicionar o repositório de vetores ao contêiner de injeção de dependência disponível no KernelBuilder ou ao IServiceCollection contêiner de injeção de dependência usando métodos de extensão fornecidos pelo Semantic Kernel.

using Microsoft.SemanticKernel;

// Using Kernel Builder.
var kernelBuilder = Kernel
    .CreateBuilder()
    .AddPineconeVectorStore(pineconeApiKey);
using Microsoft.SemanticKernel;

// Using IServiceCollection with ASP.NET Core.
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddPineconeVectorStore(pineconeApiKey);

Métodos de extensão que não usam parâmetros também são fornecidos. Isso exige que uma instância do PineconeClient seja registrada separadamente com o contêiner de injeção de dependência.

using Microsoft.Extensions.DependencyInjection;
using Microsoft.SemanticKernel;
using PineconeClient = Pinecone.PineconeClient;

// Using Kernel Builder.
var kernelBuilder = Kernel.CreateBuilder();
kernelBuilder.Services.AddSingleton<PineconeClient>(
    sp => new PineconeClient(pineconeApiKey));
kernelBuilder.AddPineconeVectorStore();
using Microsoft.Extensions.DependencyInjection;
using Microsoft.SemanticKernel;
using PineconeClient = Pinecone.PineconeClient;

// Using IServiceCollection with ASP.NET Core.
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddSingleton<PineconeClient>(
    sp => new PineconeClient(pineconeApiKey));
builder.Services.AddPineconeVectorStore();

Você pode construir uma instância do Repositório de Vetores de Pinha diretamente.

using Microsoft.SemanticKernel.Connectors.Pinecone;
using PineconeClient = Pinecone.PineconeClient;

var vectorStore = new PineconeVectorStore(
    new PineconeClient(pineconeApiKey));

É possível construir uma referência direta a uma coleção nomeada.

using Microsoft.SemanticKernel.Connectors.Pinecone;
using PineconeClient = Pinecone.PineconeClient;

var collection = new PineconeVectorStoreRecordCollection<Hotel>(
    new PineconeClient(pineconeApiKey),
    "skhotels");

Namespace de índice

A abstração do Repositório de Vetores não oferece suporte a um mecanismo de agrupamento de registros de várias camadas. As coleções na abstração são mapeadas para um índice sem servidor Pinecone e não existe nenhum segundo nível na abstração. O Pinecone suporta um segundo nível de agrupamento chamado namespaces.

Por padrão, o conector Pinecone passará null como o namespace para todas as operações. No entanto, é possível passar um único namespace para a coleção Pinecone ao construí-la e usá-lo para todas as operações.

using Microsoft.SemanticKernel.Connectors.Pinecone;
using PineconeClient = Pinecone.PineconeClient;

var collection = new PineconeVectorStoreRecordCollection<Hotel>(
    new PineconeClient(pineconeApiKey),
    "skhotels",
    new() { IndexNamespace = "seasidehotels" });

Mapeamento de dados

O conector Pinecone fornece um mapeador padrão ao mapear dados do modelo de dados para armazenamento. O Pinecone requer que as propriedades sejam mapeadas em agrupamentos de id, metadados e valores. O mapeador padrão usa as anotações do modelo ou a definição de registro para determinar o tipo de cada propriedade e fazer esse mapeamento.

  • A propriedade do modelo de dados anotada como uma chave será mapeada para a propriedade id do Pinecone.
  • As propriedades do modelo de dados anotadas como dados serão mapeadas para o objeto de metadados Pinecone.
  • A propriedade do modelo de dados anotada como um vetor será mapeada para a propriedade vetorial Pinecone.

Substituição do nome da propriedade

Para propriedades de dados, você pode fornecer nomes de campo de substituição a serem usados no armazenamento que sejam diferentes dos nomes de propriedade no modelo de dados. Isso não é suportado para chaves, pois uma chave tem um nome fixo no Pinecone. Também não é suportado para vetores, uma vez que o vetor é armazenado sob um nome valuesfixo . A substituição do nome da propriedade é feita definindo a StoragePropertyName opção por meio dos atributos do modelo de dados ou da definição de registro.

Aqui está um exemplo de um modelo de dados com StoragePropertyName conjunto em seus atributos e como isso será representado no Pinecone.

using Microsoft.Extensions.VectorData;

public class Hotel
{
    [VectorStoreRecordKey]
    public ulong HotelId { get; set; }

    [VectorStoreRecordData(IsFilterable = true, StoragePropertyName = "hotel_name")]
    public string HotelName { get; set; }

    [VectorStoreRecordData(IsFullTextSearchable = true, StoragePropertyName = "hotel_description")]
    public string Description { get; set; }

    [VectorStoreRecordVector(Dimensions: 4, DistanceFunction.CosineDistance, IndexKind.Hnsw)]
    public ReadOnlyMemory<float>? DescriptionEmbedding { get; set; }
}
{
    "id": "h1", 
    "values": [0.9, 0.1, 0.1, 0.1], 
    "metadata": { "hotel_name": "Hotel Happy", "hotel_description": "A place where everyone can be happy." }
}

O conector Pinecone ainda não está disponível em Python.

O conector Pinecone ainda não está disponível em Java.