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 as melhorias que exigem alterações significativas ainda podem ocorrer em circunstâncias limitadas antes do lançamento.
O Semantic Kernel dá suporte à geração de incorporações usando muitos serviços populares de IA prontos para uso.
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 Open AI 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");
Gerar 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 incorporações 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.
List<VectorSearchResult<Hotel>> searchResult = await collection.VectorizedSearchAsync(searchEmbedding).ToListAsync();
// Print the first search result.
Console.WriteLine("Score for first result: " + searchResult.FirstOrDefault()?.Score);
Console.WriteLine("Hotel description for first result: " + searchResult.FirstOrDefault()?.Record.Description);
}
Dimensões de inserçã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, Open AI text-embedding-ada-002
gera vetores com 1536 dimensões. 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 definindo seu esquema com uma definição de registro.
Em breve
Mais informações em breve.
Em breve
Mais informações em breve.