Condividi tramite


Generazione di incorporamento del testo nel kernel semantico

Con la generazione di incorporamento del testo, è possibile usare un modello di intelligenza artificiale per generare vettori (ovvero incorporamenti). Questi vettori codificano il significato semantico del testo in modo che le equazioni matematiche possano essere usate su due vettori per confrontare la somiglianza del testo originale. Ciò è utile per scenari come la Generazione Aumentata tramite Recupero (RAG), in cui vogliamo cercare un database di informazioni per testo correlato a una query dell'utente. Qualsiasi informazione corrispondente può quindi essere fornita come input per il completamento della chat, in modo che il modello di intelligenza artificiale abbia più contesto quando risponde alla query dell'utente.

Quando si sceglie un modello di incorporamento, è necessario considerare quanto segue:

  • Qual è la dimensione dei vettori generati dal modello ed è configurabile, in quanto ciò influirà sui costi di archiviazione vettoriali.
  • Quale tipo di elementi contiene i vettori generati, ad esempio float32, float16 e così via, in quanto ciò influirà sul costo di archiviazione vettoriale.
  • Quanto velocemente genera vettori?
  • Quanto costa la generazione?

Suggerimento

Per altre informazioni sull'archiviazione e la ricerca di vettori, vedere Che cosa sono i connettori dell'archivio vettoriale del kernel semantico?

Suggerimento

Per altre informazioni sull'uso di RAG con archivi vettoriali nel kernel semantico, vedere Come usare gli archivi vettoriali con la ricerca di testo del kernel semantico e Che cosa sono i plug-in ricerca del testo del kernel semantico?

Configurazione dell'ambiente locale

Alcuni dei servizi di intelligenza artificiale possono essere ospitati localmente e potrebbero richiedere alcune configurazioni. Di seguito sono riportate le istruzioni per coloro che supportano questa operazione.

Nessuna configurazione locale.

Installazione dei pacchetti necessari

Prima di aggiungere la generazione di incorporamento al kernel, è necessario installare i pacchetti necessari. Di seguito sono riportati i pacchetti che è necessario installare per ogni provider di servizi di intelligenza artificiale.

dotnet add package Microsoft.SemanticKernel.Connectors.AzureOpenAI

Creazione di servizi di generazione di incorporamento di testo

Dopo aver installato i pacchetti necessari, è possibile creare un servizio di generazione di incorporamento del testo. Di seguito sono riportati i diversi modi in cui è possibile generare servizi di creazione di incorporamenti utilizzando il Kernel Semantico.

Aggiunta diretta al kernel

Per aggiungere un servizio di generazione di incorporamento di testo, è possibile usare il codice seguente per aggiungerlo al provider di servizi interni del kernel.

Importante

Il connettore Azure OpenAI per la generazione di embedding è attualmente sperimentale. Per usarlo, è necessario aggiungere #pragma warning disable SKEXP0010.

using Microsoft.SemanticKernel;

#pragma warning disable SKEXP0010
IKernelBuilder kernelBuilder = Kernel.CreateBuilder();
kernelBuilder.AddAzureOpenAITextEmbeddingGeneration(
    deploymentName: "NAME_OF_YOUR_DEPLOYMENT", // Name of deployment, e.g. "text-embedding-ada-002".
    endpoint: "YOUR_AZURE_ENDPOINT",           // Name of Azure OpenAI service endpoint, e.g. https://myaiservice.openai.azure.com.
    apiKey: "YOUR_API_KEY",
    modelId: "MODEL_ID",          // Optional name of the underlying model if the deployment name doesn't match the model name, e.g. text-embedding-ada-002.
    serviceId: "YOUR_SERVICE_ID", // Optional; for targeting specific services within Semantic Kernel.
    httpClient: new HttpClient(), // Optional; if not provided, the HttpClient from the kernel will be used.
    dimensions: 1536              // Optional number of dimensions to generate embeddings with.
);
Kernel kernel = kernelBuilder.Build();

Uso dell'iniezione delle dipendenze

Se si usa l'iniezione delle dipendenze, è probabile che si voglia aggiungere i servizi di generazione di embedding del testo direttamente al provider di servizi. Ciò è utile se si desidera creare singletons dei tuoi servizi di generazione di incorporamenti e riutilizzarli in kernel transitori.

Importante

Il connettore per la generazione degli incorporamenti OpenAI di Azure è attualmente sperimentale. Per usarlo, è necessario aggiungere #pragma warning disable SKEXP0010.

using Microsoft.SemanticKernel;

var builder = Host.CreateApplicationBuilder(args);

#pragma warning disable SKEXP0010
builder.Services.AddAzureOpenAITextEmbeddingGeneration(
    deploymentName: "NAME_OF_YOUR_DEPLOYMENT", // Name of deployment, e.g. "text-embedding-ada-002".
    endpoint: "YOUR_AZURE_ENDPOINT",           // Name of Azure OpenAI service endpoint, e.g. https://myaiservice.openai.azure.com.
    apiKey: "YOUR_API_KEY",
    modelId: "MODEL_ID",          // Optional name of the underlying model if the deployment name doesn't match the model name, e.g. text-embedding-ada-002.
    serviceId: "YOUR_SERVICE_ID", // Optional; for targeting specific services within Semantic Kernel.
    dimensions: 1536              // Optional number of dimensions to generate embeddings with.
);

builder.Services.AddTransient((serviceProvider)=> {
    return new Kernel(serviceProvider);
});

Creazione di istanze autonome

Infine, è possibile creare direttamente istanze del servizio in modo che sia possibile aggiungerle a un kernel in un secondo momento o usarle direttamente nel codice senza mai inserirle nel kernel o in un provider di servizi.

Importante

Il connettore di generazione di incorporamento OpenAI di Azure è attualmente sperimentale. Per usarlo, è necessario aggiungere #pragma warning disable SKEXP0010.

using Microsoft.SemanticKernel.Connectors.AzureOpenAI;

#pragma warning disable SKEXP0010
AzureOpenAITextEmbeddingGenerationService textEmbeddingGenerationService = new (
    deploymentName: "NAME_OF_YOUR_DEPLOYMENT", // Name of deployment, e.g. "text-embedding-ada-002".
    endpoint: "YOUR_AZURE_ENDPOINT",           // Name of Azure OpenAI service endpoint, e.g. https://myaiservice.openai.azure.com.
    apiKey: "YOUR_API_KEY",
    modelId: "MODEL_ID",          // Optional name of the underlying model if the deployment name doesn't match the model name, e.g. text-embedding-ada-002.
    httpClient: new HttpClient(), // Optional; if not provided, the HttpClient from the kernel will be used.
    dimensions: 1536              // Optional number of dimensions to generate embeddings with.
);

Uso dei servizi di generazione di incorporamento di testo

Tutti i servizi di generazione di incorporamento di testo implementano l'ITextEmbeddingGenerationService con un singolo metodo GenerateEmbeddingsAsync che può generare vettori ReadOnlyMemory<float> dai valori di string forniti. Un metodo di estensione GenerateEmbeddingAsync è disponibile anche per le versioni a valore singolo della stessa azione.

Ecco un esempio di come richiamare il servizio con più valori.

IList<ReadOnlyMemory<float>> embeddings =
    await textEmbeddingGenerationService.GenerateEmbeddingsAsync(
    [
        "sample text 1",
        "sample text 2"
    ]);

Di seguito è riportato un esempio di come richiamare il servizio con un singolo valore.

using Microsoft.SemanticKernel.Embeddings;

ReadOnlyMemory<float> embedding =
    await textEmbeddingGenerationService.GenerateEmbeddingAsync("sample text");

Prossimamente

Altre informazioni saranno presto disponibili.

Prossimamente

Altre informazioni saranno presto disponibili.