Condividi tramite


Generazione di incorporamenti per i connettori dell'archivio vettoriale del kernel semantico

Avviso

La funzionalità di archiviazione vettoriale del kernel semantico è in anteprima e i miglioramenti che richiedono modifiche di rilievo possono ancora verificarsi in circostanze limitate prima del rilascio.

Il kernel semantico supporta la generazione di incorporamenti usando molti servizi di intelligenza artificiale più diffusi.

Questi servizi possono essere costruiti direttamente o aggiunti a un contenitore di inserimento delle dipendenze e risolti da questa posizione.

Costruzione di un generatore di incorporamento

È possibile costruire direttamente istanze dei servizi di incorporamento del testo forniti dal kernel semantico. Implementano tutti l'interfaccia ITextEmbeddingGenerationService .

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

È anche possibile usare gli helper per registrarli con un contenitore di inserimento delle dipendenze.

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

Generazione di incorporamenti

Per usare l'oggetto ITextEmbeddingGenerationService creato, è sufficiente chiamare il GenerateEmbeddingAsync metodo su di esso.

Di seguito è riportato un esempio di generazione di incorporamenti durante il caricamento dei record.

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

Di seguito è riportato un esempio di generazione di incorporamenti durante la ricerca.

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

Dimensioni di incorporamento

I database vettoriali richiedono in genere di specificare il numero di dimensioni di ogni vettore durante la creazione della raccolta. I diversi modelli di incorporamento supportano in genere la generazione di vettori con dimensioni diverse. Ad esempio, Open AI text-embedding-ada-002 genera vettori con 1536 dimensioni. Alcuni modelli consentono anche a uno sviluppatore di scegliere il numero di dimensioni desiderate nel vettore di output, ad esempio Google text-embedding-004 produce vettori con 768 dimensioni per impostazione predefinita, ma consente a uno sviluppatore di scegliere qualsiasi numero di dimensioni compreso tra 1 e 768.

È importante assicurarsi che i vettori generati dal modello di incorporamento abbiano lo stesso numero di dimensioni del vettore corrispondente nel database.

Se si crea una raccolta usando le astrazioni Semantic Kernel Vector Store, è necessario specificare il numero di dimensioni necessarie per ogni proprietà vector tramite annotazioni o tramite la definizione del record. Di seguito sono riportati alcuni esempi di impostazione del numero di dimensioni su 1536.

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

Suggerimento

Per altre informazioni su come annotare il modello di dati, vedere Definizione del modello di dati.

Suggerimento

Per altre informazioni sulla creazione di una definizione di record, vedere Definizione dello schema con una definizione di record.

Presto disponibile

Altre informazioni saranno presto disponibili.

Presto disponibile

Altre informazioni saranno presto disponibili.