Compartir a través de


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

Advertencia

La funcionalidad de Almacén de Vectores del Kernel Semántico está en vista previa, y las mejoras que requieren cambios disruptivos pueden producirse en circunstancias limitadas antes del lanzamiento.

El "Semantic Kernel" admite la generación de "embeddings" con muchos servicios populares de inteligencia artificial de manera nativa.

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 incrustación

Puede construir instancias de los servicios de representación de texto proporcionados directamente por el Kernel Semántico. Todos implementan la ITextEmbeddingGenerationService interfaz.

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

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 objeto ITextEmbeddingGenerationService que creó, simplemente llame al método GenerateEmbeddingAsync 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.
    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);
}

Sugerencia

Para obtener más información sobre cómo generar embeddings, consulte generación de embeddings en el kernel semántico.

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, OpenAI 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 utilizando las abstracciones del Almacén de Vectores del Kernel Semántico, debe especificar el número de dimensiones necesarias para cada propiedad vectorial, ya sea mediante anotaciones o a través de la definición del 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.