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.

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.

Los conectores de almacén de vectores del kernel semántico admiten varias formas de generar embeddings. El desarrollador puede generar incrustaciones y pasarlas como parte de un registro al utilizar un VectorStoreCollection, o estas pueden generarse internamente dentro del VectorStoreCollection.

Permitir que el almacén de vectores genere incrustaciones

Puede configurar un generador de inserción en el almacén de vectores, lo que permite que las inserciones se generen automáticamente durante las operaciones upsert y search, lo que elimina la necesidad de preprocesamiento manual.

Para habilitar la generación automática de vectores en upsert, la propiedad vector del modelo de datos se define como el tipo de origen, por ejemplo, una cadena de texto, pero aún decorada con VectorStoreVectorPropertyAttribute.

    [VectorStoreVector(1536)]
    public string Embedding { get; set; }

Antes de realizar un upsert, la propiedad Embedding debe contener la cadena a partir de la cual se debe generar un vector. El tipo del vector almacenado en la base de datos (por ejemplo, float32, float16, etc.) se derivará del generador de inserción configurado.

Importante

Estas propiedades vectoriales no admiten la recuperación del vector generado o el texto original del que se generó el vector. Tampoco almacenan el texto original. Si es necesario almacenar el texto original, se debe agregar una propiedad Data independiente para almacenarlo.

Se admiten generadores de incrustación que implementan las Microsoft.Extensions.AI abstracciones y pueden configurarse en varios niveles.

  1. En el almacén de vectores: puede establecer un generador de inserción predeterminado para todo el almacén de vectores. Este generador se usará para todas las colecciones y propiedades a menos que se invalide.

    using Microsoft.Extensions.AI;
    using Microsoft.SemanticKernel.Connectors.Qdrant;
    using OpenAI;
    using Qdrant.Client;
    
    var embeddingGenerator = new OpenAIClient("your key")
        .GetEmbeddingClient("your chosen model")
        .AsIEmbeddingGenerator();
    
    var vectorStore = new QdrantVectorStore(
        new QdrantClient("localhost"),
        ownsClient: true,
        new QdrantVectorStoreOptions
        {
             EmbeddingGenerator = embeddingGenerator
        });
    
  2. En una colección: puede configurar un generador de inserción para una colección específica, reemplazando el generador de nivel de almacén.

    using Microsoft.Extensions.AI;
    using Microsoft.SemanticKernel.Connectors.Qdrant;
    using OpenAI;
    using Qdrant.Client;
    
    var embeddingGenerator = new OpenAIClient("your key")
        .GetEmbeddingClient("your chosen model")
        .AsIEmbeddingGenerator();
    
    var collectionOptions = new QdrantCollectionOptions
    {
        EmbeddingGenerator = embeddingGenerator
    };
    var collection = new QdrantCollection<ulong, MyRecord>(
        new QdrantClient("localhost"),
        "myCollection",
        ownsClient: true,
        collectionOptions);
    
  3. En una definición de registro: al definir propiedades mediante programación mediante VectorStoreCollectionDefinition, puede especificar un generador de inserción para todas las propiedades.

    using Microsoft.Extensions.AI;
    using Microsoft.Extensions.VectorData;
    using Microsoft.SemanticKernel.Connectors.Qdrant;
    using OpenAI;
    using Qdrant.Client;
    
    var embeddingGenerator = new OpenAIClient("your key")
        .GetEmbeddingClient("your chosen model")
        .AsIEmbeddingGenerator();
    
    var definition = new VectorStoreCollectionDefinition
    {
        EmbeddingGenerator = embeddingGenerator,
        Properties = new List<VectorStoreProperty>
        {
            new VectorStoreKeyProperty("Key", typeof(ulong)),
            new VectorStoreVectorProperty("DescriptionEmbedding", typeof(string), dimensions: 1536)
        }
    };
    
    var collectionOptions = new QdrantCollectionOptions
    {
        Definition = definition
    };
    var collection = new QdrantCollection<ulong, MyRecord>(
        new QdrantClient("localhost"),
        "myCollection",
        ownsClient: true,
        collectionOptions);
    
  4. En una definición de propiedad vectorial: al definir propiedades mediante programación, puede establecer un generador de inserción directamente en la propiedad .

    using Microsoft.Extensions.AI;
    using Microsoft.Extensions.VectorData;
    using OpenAI;
    
    var embeddingGenerator = new OpenAIClient("your key")
        .GetEmbeddingClient("your chosen model")
        .AsIEmbeddingGenerator();
    
    var vectorProperty = new VectorStoreVectorProperty("DescriptionEmbedding", typeof(string), dimensions: 1536)
    {
         EmbeddingGenerator = embeddingGenerator
    };
    

Ejemplo de uso

En el ejemplo siguiente se muestra cómo usar el generador de inserción para generar automáticamente vectores durante las operaciones upsert y search. Este enfoque simplifica los flujos de trabajo mediante la eliminación de la necesidad de precompletar incrustaciones manualmente.


// The data model
internal class FinanceInfo
{
    [VectorStoreKey]
    public string Key { get; set; } = string.Empty;

    [VectorStoreData]
    public string Text { get; set; } = string.Empty;

    // Note that the vector property is typed as a string, and
    // its value is derived from the Text property. The string
    // value will however be converted to a vector on upsert and
    // stored in the database as a vector.
    [VectorStoreVector(1536)]
    public string Embedding => this.Text;
}

// Create an OpenAI embedding generator.
var embeddingGenerator = new OpenAIClient("your key")
    .GetEmbeddingClient("your chosen model")
    .AsIEmbeddingGenerator();

// Use the embedding generator with the vector store.
var vectorStore = new InMemoryVectorStore(new() { EmbeddingGenerator = embeddingGenerator });
var collection = vectorStore.GetCollection<string, FinanceInfo>("finances");
await collection.EnsureCollectionExistsAsync();

// Create some test data.
string[] budgetInfo =
{
    "The budget for 2020 is EUR 100 000",
    "The budget for 2021 is EUR 120 000",
    "The budget for 2022 is EUR 150 000",
    "The budget for 2023 is EUR 200 000",
    "The budget for 2024 is EUR 364 000"
};

// Embeddings are generated automatically on upsert.
var records = budgetInfo.Select((input, index) => new FinanceInfo { Key = index.ToString(), Text = input });
await collection.UpsertAsync(records);

// Embeddings for the search is automatically generated on search.
var searchResult = collection.SearchAsync(
    "What is my budget for 2024?",
    top: 1);

// Output the matching result.
await foreach (var result in searchResult)
{
    Console.WriteLine($"Key: {result.Record.Key}, Text: {result.Record.Text}");
}

Generación de incrustaciones usted mismo

Construcción de un generador de incrustación

Consulte Generación de Embeddings para obtener ejemplos sobre cómo construir instancias de kernel semánticoITextEmbeddingGenerationService.

Consulte Microsoft.Extensions.AI.Abstracciones para obtener información sobre cómo construir Microsoft.Extensions.AI servicios de generación de embeddings.

Generación de incrustaciones en upsert con Kernel Semántico ITextEmbeddingGenerationService

public async Task GenerateEmbeddingsAndUpsertAsync(
    ITextEmbeddingGenerationService textEmbeddingGenerationService,
    VectorStoreCollection<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" }
    });
}

Generación de incrustaciones en la búsqueda con kernel semántico ITextEmbeddingGenerationService

public async Task GenerateEmbeddingsAndSearchAsync(
    ITextEmbeddingGenerationService textEmbeddingGenerationService,
    VectorStoreCollection<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.
    IAsyncEnumerable<VectorSearchResult<Hotel>> searchResult = collection.SearchAsync(searchEmbedding, top: 1);
    List<VectorSearchResult<Hotel>> resultItems = await searchResult.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 normalmente admiten la generación de vectores con varios 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 768 dimensiones 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.

[VectorStoreVector(Dimensions: 1536)]
public ReadOnlyMemory<float>? DescriptionEmbedding { get; set; }
new VectorStoreVectorProperty("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.