Compartilhar via


Gerando inserções para conectores do Repositório de Vetores do Kernel Semântico

Aviso

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

O Semantic Kernel oferece suporte à geração de incorporações usando muitos serviços populares de IA disponíveis de forma acessível.

Esses serviços podem ser construídos diretamente ou adicionados a um contêiner de injeção de dependência e resolvidos a partir daí.

Construindo um gerador de incorporação

Você pode construir instâncias dos serviços de inserção de texto fornecidos diretamente pelo Semantic Kernel. Todos eles implementam a ITextEmbeddingGenerationService interface.

// Constructing an Azure OpenAI embedding generation service directly.
ITextEmbeddingGenerationService azureOpenAITES = new AzureOpenAITextEmbeddingGenerationService(
    "text-embedding-ada-002",
    "https://{myservice}.openai.azure.com/",
    "apikey");

// Constructing an Olama embedding generation service directly.
ITextEmbeddingGenerationService olamaTES = new OllamaTextEmbeddingGenerationService(
    "mxbai-embed-large",
    new Uri("http://localhost:11434"));

Você também pode usar auxiliares para registrá-los em um contêiner de injeção de dependência.

// Registering Google AI embedding generation service with a service collection.
var services = new ServiceCollection();
services.AddGoogleAIEmbeddingGeneration("text-embedding-004", "apiKey");

// Registering Mistral AI embedding generation service with the dependency injection container on
// the kernel builder.
var kernelBuilder = Kernel
    .CreateBuilder()
    .AddMistralTextEmbeddingGeneration("mistral-embed", "apiKey");

Gerando embeddings

Para usar o ITextEmbeddingGenerationService que você criou, basta chamar o GenerateEmbeddingAsync método nele.

Aqui está um exemplo de geração de incorporações ao fazer upload de registros.

public async Task GenerateEmbeddingsAndUpsertAsync(
    ITextEmbeddingGenerationService textEmbeddingGenerationService,
    IVectorStoreRecordCollection<ulong, Hotel> collection)
{
    // Upsert a record.
    string descriptionText = "A place where everyone can be happy.";
    ulong hotelId = 1;

    // Generate the embedding.
    ReadOnlyMemory<float> embedding =
        await textEmbeddingGenerationService.GenerateEmbeddingAsync(descriptionText);

    // Create a record and upsert with the already generated embedding.
    await collection.UpsertAsync(new Hotel
    {
        HotelId = hotelId,
        HotelName = "Hotel Happy",
        Description = descriptionText,
        DescriptionEmbedding = embedding,
        Tags = new[] { "luxury", "pool" }
    });
}

Aqui está um exemplo de geração de embeddings ao pesquisar.

public async Task GenerateEmbeddingsAndSearchAsync(
    ITextEmbeddingGenerationService textEmbeddingGenerationService,
    IVectorStoreRecordCollection<ulong, Hotel> collection)
{
    // Upsert a record.
    string descriptionText = "Find me a hotel with happiness in mind.";

    // Generate the embedding.
    ReadOnlyMemory<float> searchEmbedding =
        await textEmbeddingGenerationService.GenerateEmbeddingAsync(descriptionText);

    // Search using the already generated embedding.
    VectorSearchResults<Hotel> searchResult = await collection.VectorizedSearchAsync(searchEmbedding);
    List<VectorSearchResult<Hotel>> resultItems = await searchResult.Results.ToListAsync();

    // Print the first search result.
    Console.WriteLine("Score for first result: " + resultItems.FirstOrDefault()?.Score);
    Console.WriteLine("Hotel description for first result: " + resultItems.FirstOrDefault()?.Record.Description);
}

Dica

Para obter mais informações sobre como gerar inserções, consulte Geração de inserção no kernel semântico.

Dimensões de incorporação

Os bancos de dados vetoriais normalmente exigem que você especifique o número de dimensões que cada vetor tem ao criar a coleção. Diferentes modelos de incorporação normalmente suportam a geração de vetores com diferentes tamanhos de dimensão. Por exemplo, o text-embedding-ada-002 OpenAI gera vetores com dimensões 1536. Alguns modelos também permitem que um desenvolvedor escolha o número de dimensões que deseja no vetor de saída, por exemplo, o Google text-embedding-004 produz vetores com dimensão 768 por padrão, mas permite que um desenvolvedor escolha qualquer número de dimensões entre 1 e 768.

É importante garantir que os vetores gerados pelo modelo de incorporação tenham o mesmo número de dimensões que o vetor correspondente no banco de dados.

Se estiver criando uma coleção usando as abstrações do Repositório de Vetores do Kernel Semântico, você precisará especificar o número de dimensões necessárias para cada propriedade de vetor por meio de anotações ou por meio da definição de registro. Aqui estão exemplos de como definir o número de dimensões como 1536.

[VectorStoreRecordVector(Dimensions: 1536)]
public ReadOnlyMemory<float>? DescriptionEmbedding { get; set; }
new VectorStoreRecordVectorProperty("DescriptionEmbedding", typeof(float)) { Dimensions = 1536 }

Dica

Para obter mais informações sobre como anotar seu modelo de dados, consulte definindo seu modelo de dados.

Dica

Para obter mais informações sobre como criar uma definição de registro, consulte a seção sobre a definição do seu esquema com uma definição de registro.

Em breve

Mais informações em breve.

Em breve

Mais informações em breve.