Completamento della chat

Con il completamento della chat, è possibile simulare una conversazione back-and-forth con un agente di intelligenza artificiale. Questo è naturalmente utile per la creazione di chat bot, ma può anche essere usato per la creazione di agenti autonomi che possono completare processi aziendali, generare codice e altro ancora. Come tipo di modello principale fornito da OpenAI, Google, Mistral, Facebook e altri, il completamento della chat è il servizio di intelligenza artificiale più comune che verrà aggiunto al progetto Semantic Kernel.

Quando si sceglie un modello di completamento della chat, è necessario considerare quanto segue:

  • Quali modalità supportano il modello (ad esempio, testo, immagine, audio e così via)?
  • Supporta la chiamata a funzioni?
  • Quanto velocemente riceve e genera i token?
  • Quanto costa ogni token?

Importante

Di tutte le domande precedenti, l'aspetto più importante è se il modello supporta la chiamata di funzione. In caso contrario, non sarà possibile usare il modello per chiamare il codice esistente. La maggior parte dei modelli più recenti di OpenAI, Google, Mistral e Amazon supporta tutte le chiamate di funzione. Tuttavia, il supporto di modelli linguistici di piccole dimensioni è ancora limitato.

Installazione dei pacchetti necessari

Prima di aggiungere il completamento della chat 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.OpenAI

Creazione di servizi di completamento della chat

Dopo aver installato i pacchetti necessari, è possibile creare servizi di completamento della chat. Di seguito sono riportati i diversi modi in cui è possibile creare servizi di completamento della chat usando il kernel semantico.

Aggiunta diretta al kernel

Per aggiungere un servizio di completamento della chat, è possibile usare il codice seguente per aggiungerlo al provider del servizio interno del kernel.

dotnet add package Microsoft.SemanticKernel.Connectors.OpenAI
using Microsoft.SemanticKernel;

IKernelBuilder kernelBuilder = Kernel.CreateBuilder();
kernelBuilder.AddAzureOpenAIChatCompletion(
    deploymentName: "NAME_OF_YOUR_DEPLOYMENT",
    apiKey: "YOUR_API_KEY",
    endpoint: "YOUR_AZURE_ENDPOINT",
    modelId: "gpt-4", // Optional name of the underlying model if the deployment name doesn't match the model name
    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
);
Kernel kernel = kernelBuilder.Build();

Uso dell'inserimento delle dipendenze

Se si usa l'inserimento delle dipendenze, è probabile che si voglia aggiungere i servizi di intelligenza artificiale direttamente al provider di servizi. Ciò è utile se si vuole creare singleton dei servizi di intelligenza artificiale e riutilizzarli in kernel temporanei.

using Microsoft.SemanticKernel;

var builder = Host.CreateApplicationBuilder(args);

builder.Services.AddAzureOpenAIChatCompletion(
    deploymentName: "NAME_OF_YOUR_DEPLOYMENT",
    apiKey: "YOUR_API_KEY",
    endpoint: "YOUR_AZURE_ENDPOINT",
    modelId: "gpt-4", // Optional name of the underlying model if the deployment name doesn't match the model name
    serviceId: "YOUR_SERVICE_ID" // Optional; for targeting specific services within Semantic Kernel
);

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.

using Microsoft.SemanticKernel.Connectors.OpenAI;

AzureOpenAIChatCompletionService chatCompletionService = new (
    deploymentName: "NAME_OF_YOUR_DEPLOYMENT",
    apiKey: "YOUR_API_KEY",
    endpoint: "YOUR_AZURE_ENDPOINT",
    modelId: "gpt-4", // Optional name of the underlying model if the deployment name doesn't match the model name
    httpClient: new HttpClient() // Optional; if not provided, the HttpClient from the kernel will be used
);

Per aggiungere un servizio di completamento della chat, è possibile usare il codice seguente per aggiungerlo al kernel.

from semantic_kernel import Kernel
from semantic_kernel.connectors.ai.open_ai import AzureChatCompletion

# Initialize the kernel
kernel = Kernel()

# Add the Azure OpenAI chat completion service
kernel.add_service(AzureChatCompletion(
    deployment_name="my-deployment",
    api_key="my-api-key",
    base_url="https://my-deployment.azurewebsites.net", # Used to point to your service
    service_id="my-service-id", # Optional; for targeting specific services within Semantic Kernel
))

È anche possibile creare istanze del servizio direttamente in modo che sia possibile aggiungerle a un kernel in un secondo momento o usarle direttamente nel codice senza inserirle nel kernel.

from semantic_kernel.connectors.ai.open_ai import AzureChatCompletion

chat_completion_service = AzureChatCompletion(
    deployment_name="my-deployment",
    api_key="my-api-key",
    base_url="https://my-deployment.azurewebsites.net", # Used to point to your service
    service_id="my-service-id", # Optional; for targeting specific services within Semantic Kernel
)

Recupero dei servizi di completamento della chat

Dopo aver aggiunto i servizi di completamento della chat al kernel, è possibile recuperarli usando il metodo get service. Di seguito è riportato un esempio di come recuperare un servizio di completamento della chat dal kernel.

var chatCompletionService = kernel.GetRequiredService<IChatCompletionService>();
from semantic_kernel.connectors.ai.chat_completion_client_base import ChatCompletionClientBase

chat_completion_service = kernel.get_service(type=ChatCompletionClientBase)

Uso dei servizi di completamento della chat

Ora che si dispone di un servizio di completamento della chat, è possibile usarlo per generare risposte da un agente di intelligenza artificiale. Esistono due modi principali per usare un servizio di completamento della chat:

  • Non in streaming: attendere che il servizio generi un'intera risposta prima di restituirla all'utente.
  • Streaming: i singoli blocchi della risposta vengono generati e restituiti all'utente man mano che vengono creati.

Di seguito sono riportati i due modi in cui è possibile usare un servizio di completamento della chat per generare risposte.

Completamento di chat non in streaming

Per usare il completamento della chat non in streaming, è possibile usare il codice seguente per generare una risposta dall'agente di intelligenza artificiale.

ChatHistory history = [];
history.AddUserMessage("Hello, how are you?");

var response = await chatCompletionService.GetChatMessageContentAsync(
    history,
    kernel: kernel
);
chat_history = ChatHistory()
chat_history.add_user_message("Hello, how are you?")

response = (await chat_completion.get_chat_message_contents(
    chat_history=history,
    kernel=kernel,
))[0]

Completamento della chat in streaming

Per usare il completamento della chat in streaming, è possibile usare il codice seguente per generare una risposta dall'agente di intelligenza artificiale.

ChatHistory history = [];
history.AddUserMessage("Hello, how are you?");

var response = chatCompletionService.GetStreamingChatMessageContentsAsync(
    chatHistory: history,
    kernel: kernel
);

await foreach (var chunk in response)
{
    Console.Write(chunk);
}
chat_history = ChatHistory()
chat_history.add_user_message("Hello, how are you?")

response = chat_completion.get_streaming_chat_message_contents(
    chat_history=history,
    kernel=kernel,
)

async for chunk in response:
    print(chunk)

Passaggi successivi

Dopo aver aggiunto servizi di completamento della chat al progetto Semantic Kernel, è possibile iniziare a creare conversazioni con l'agente di intelligenza artificiale. Per altre informazioni sull'uso di un servizio di completamento chat, vedere gli articoli seguenti: