Compartir a través de


Generación de incrustaciones para conectores de almacén de vectores de kernel semántico

Advertencia

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

El kernel semántico admite la generación de incrustaciones con muchos servicios de INTELIGENCIA ARTIFICIAL populares de fábrica.

Estos servicios se pueden construir directamente o agregar a un contenedor de inserción de dependencias y resolverse desde allí.

Construcción de un generador de inserción

Puede construir instancias de los servicios de inserción de texto proporcionados directamente por kernel semántico. Todos implementan la ITextEmbeddingGenerationService interfaz.

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

También puede usar asistentes para registrarlos con un contenedor de inserción de dependencias.

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

Generación de incrustaciones

Para usar el ITextEmbeddingGenerationService objeto que creó, simplemente llame al GenerateEmbeddingAsync método en él.

Este es un ejemplo de generación de incrustaciones al cargar 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" }
    });
}

Este es un ejemplo de generación de incrustaciones al buscar.

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

Inserción de dimensiones

Normalmente, las bases de datos vectoriales requieren que especifique el número de dimensiones que tiene cada vector al crear la colección. Los diferentes modelos de inserción suelen admitir la generación de vectores con diferentes tamaños de dimensión. Por ejemplo, Open AI text-embedding-ada-002 genera vectores con 1536 dimensiones. Algunos modelos también permiten a un desarrollador elegir el número de dimensiones que desean en el vector de salida, por ejemplo, Google text-embedding-004 genera vectores con una dimensión de 768 de forma predeterminada, pero permite que un desarrollador elija cualquier número de dimensiones entre 1 y 768.

Es importante asegurarse de que los vectores generados por el modelo de inserción tengan el mismo número de dimensiones que el vector coincidente en la base de datos.

Si crea una colección mediante las abstracciones semánticas del almacén de vectores de kernel, debe especificar el número de dimensiones necesarias para cada propiedad vectorial a través de anotaciones o a través de la definición de registro. Estos son ejemplos de cómo establecer el número de dimensiones en 1536.

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

Sugerencia

Para obtener más información sobre cómo anotar el modelo de datos, consulte definición del modelo de datos.

Sugerencia

Para obtener más información sobre cómo crear una definición de registro, consulte definición del esquema con una definición de registro.

Próximamente

Más información próximamente.

Próximamente

Más información próximamente.