Partilhar via


Usando o conector Pinecone (Preview)

Aviso

A funcionalidade Semantic Kernel Vetor Store está em pré-visualização, e melhorias que exigem alterações de quebra ainda podem ocorrer em circunstâncias limitadas antes do lançamento.

Descrição geral

O conector Pinecone Vetor Store pode ser usado para acessar e gerenciar dados em Pinecone. O conector tem as seguintes características.

Área de funcionalidades Suporte
Mapas da coleção para Índice sem servidor Pinecone
Tipos de propriedade de chave suportados string
Tipos de propriedade de dados suportados
  • string
  • número inteiro
  • long
  • duplo
  • flutuante
  • booleano
  • decimal
  • enumeráveis do tipo string
Tipos de propriedade vetorial suportados Float ReadOnlyMemory<>
Tipos de índice suportados PGA (Algoritmo de gráfico de pinha)
Funções de distância suportadas
  • CossenoSimilaridade
  • DotProductSimilarity
  • Distância Euclidiana
Suporta vários vetores em um registro Não
IsFilterable suportado? Sim
IsFullTextSearchable suportado? Não
StoragePropertyName suportado? Sim

Introdução

Adicione o pacote NuGet do conector do Pinecone Vetor Store ao seu projeto.

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

Você pode adicionar o armazenamento vetorial ao contêiner de injeção de dependência disponível no KernelBuilder ou ao contêiner de IServiceCollection 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 requer 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 Pinecone Vetor Store 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 Vetor Store não suporta um mecanismo de agrupamento de registros em várias camadas. Coleções no mapa de abstração para um índice sem servidor Pinecone e nenhum segundo nível existe na abstraçã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 em vez disso 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 o armazenamento. Pinecone requer que as propriedades sejam mapeadas em id, metadados e agrupamentos de valores. O mapeador padrão usa as anotações de 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 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 do vetor Pinecone.

Substituição do nome da propriedade

Para propriedades de dados, você pode fornecer nomes de campo de substituição para usar no armazenamento que sejam diferentes dos nomes de propriedade no modelo de dados. Isso não é suportado para chaves, uma vez que uma chave tem um nome fixo em 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 do registro.

Aqui está um exemplo de um modelo de dados com StoragePropertyName conjunto em seus atributos e como isso será representado em 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.