Condividi tramite


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.

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 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.AzureOpenAI

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.

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.AzureOpenAI;

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 creare un servizio di completamento della chat, è necessario importare i moduli necessari e creare un'istanza del servizio. Di seguito sono riportati i passaggi per creare un servizio di completamento della chat per ogni provider di servizi di intelligenza artificiale.

Suggerimento

Esistono tre metodi per fornire le informazioni necessarie ai servizi di intelligenza artificiale. È possibile fornire le informazioni direttamente tramite il costruttore, impostare le variabili di ambiente necessarie oppure creare un file con estensione env all'interno della directory del progetto contenente le variabili di ambiente. È possibile visitare questa pagina per trovare tutte le variabili di ambiente necessarie per ogni provider di servizi di intelligenza artificiale: https://github.com/microsoft/semantic-kernel/blob/main/python/samples/concepts/setup/ALL_SETTINGS.md

from semantic_kernel.connectors.ai.open_ai import AzureChatCompletion

chat_completion_service = AzureChatCompletion(
    deployment_name="my-deployment",  
    api_key="my-api-key",
    endpoint="my-api-endpoint", # Used to point to your service
    service_id="my-service-id", # Optional; for targeting specific services within Semantic Kernel
)

# You can do the following if you have set the necessary environment variables or created a .env file
chat_completion_service = AzureChatCompletion(service_id="my-service-id")

Nota

Il servizio AzureChatCompletion supporta anche 'autenticazione di Microsoft Entra. Se non si specifica una chiave API, il servizio tenterà di eseguire l'autenticazione usando il token Entra.

È possibile iniziare subito a usare il servizio di completamento o aggiungere il servizio di completamento della chat a un kernel. È possibile usare il codice seguente per aggiungere un servizio al kernel.

from semantic_kernel import Kernel

# Initialize the kernel
kernel = Kernel()

# Add the chat completion service created above to the kernel
kernel.add_service(chat_completion_service)

È possibile creare direttamente istanze del servizio di completamento della chat e aggiungerle a un kernel o usarle direttamente nel codice senza inserirle nel kernel. Il codice seguente illustra come creare un servizio di completamento della chat e aggiungerlo al kernel.

import com.azure.ai.openai.OpenAIAsyncClient;
import com.azure.ai.openai.OpenAIClientBuilder;
import com.microsoft.semantickernel.Kernel;
import com.microsoft.semantickernel.services.chatcompletion.ChatCompletionService;

// Create the client
OpenAIAsyncClient client = new OpenAIClientBuilder()
    .credential(azureOpenAIClientCredentials)
    .endpoint(azureOpenAIClientEndpoint)
    .buildAsyncClient();

// Create the chat completion service
ChatCompletionService openAIChatCompletion = OpenAIChatCompletion.builder()
    .withOpenAIAsyncClient(client)
    .withModelId(modelId)
    .build();

// Initialize the kernel
Kernel kernel = Kernel.builder()
    .withAIService(ChatCompletionService.class, openAIChatCompletion)
    .build();

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

# Retrieve the chat completion service by type
chat_completion_service = kernel.get_service(type=ChatCompletionClientBase)

# Retrieve the chat completion service by id
chat_completion_service = kernel.get_service(service_id="my-service-id")

# Retrieve the default inference settings
execution_settings = kernel.get_prompt_execution_settings_from_service_id("my-service-id")
ChatCompletionService chatCompletionService = kernel.getService(ChatCompletionService.class);

Mancia

L'aggiunta del servizio di completamento della chat al kernel non è necessaria se non è necessario usare altri servizi nel kernel. È possibile usare il servizio di completamento della chat direttamente nel codice.

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:

  • In modalità non-streaming: attendi che il servizio generi un'intera risposta prima di restituirla all'utente.
  • streaming: singoli blocchi della risposta vengono generati e restituiti all'utente man mano che vengono creati.

Prima di iniziare, è necessario creare manualmente un'istanza delle impostazioni di esecuzione per usare il servizio di completamento della chat se il servizio non è stato registrato con il kernel.

from semantic_kernel.connectors.ai.open_ai import OpenAIChatPromptExecutionSettings

execution_settings = OpenAIChatPromptExecutionSettings()

Consiglio

Per vedere cosa è possibile configurare nelle impostazioni di esecuzione, è possibile controllare la definizione della classe nel codice sorgente o consultare la documentazione dell'API .

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_content(
    chat_history=history,
    settings=execution_settings,
)
ChatHistory history = new ChatHistory();
history.addUserMessage("Hello, how are you?");

InvocationContext optionalInvocationContext = null;

List<ChatMessageContent<?>> response = chatCompletionService.getChatMessageContentsAsync(
    history,
    kernel,
    optionalInvocationContext
);

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_content(
    chat_history=history,
    settings=execution_settings,
)

async for chunk in response:
    print(chunk, end="")

Nota

Il kernel semantico per Java non supporta il modello di risposta di streaming.

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: