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.
Per altri provider di servizi di intelligenza artificiale che supportano l'API di completamento della chat OpenAI (ad esempio, LLM Studio), è possibile usare il connettore di completamento della chat OpenAI.
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();
using Microsoft.SemanticKernel;
IKernelBuilder kernelBuilder = Kernel.CreateBuilder();
kernelBuilder.AddOpenAIChatCompletion(
modelId: "gpt-4",
apiKey: "YOUR_API_KEY",
orgId: "YOUR_ORG_ID", // Optional
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();
Importante
Il connettore di completamento chat Mistral è attualmente sperimentale. Per usarlo, è necessario aggiungere #pragma warning disable SKEXP0070.
using Microsoft.SemanticKernel;
#pragma warning disable SKEXP0070
IKernelBuilder kernelBuilder = Kernel.CreateBuilder();
kernelBuilder.AddMistralChatCompletion(
modelId: "NAME_OF_MODEL",
apiKey: "API_KEY",
endpoint: new Uri("YOUR_ENDPOINT"), // Optional
serviceId: "SERVICE_ID", // Optional; for targeting specific services within Semantic Kernel
httpClient: new HttpClient() // Optional; for customizing HTTP client
);
Kernel kernel = kernelBuilder.Build();
Importante
Il connettore di completamento della chat google è attualmente sperimentale. Per usarlo, è necessario aggiungere #pragma warning disable SKEXP0070.
using Microsoft.SemanticKernel;
using Microsoft.SemanticKernel.Connectors.Google;
#pragma warning disable SKEXP0070
IKernelBuilder kernelBuilder = Kernel.CreateBuilder();
kernelBuilder.AddGoogleAIGeminiChatCompletion(
modelId: "NAME_OF_MODEL",
apiKey: "API_KEY",
apiVersion: GoogleAIVersion.V1, // Optional
serviceId: "SERVICE_ID", // Optional; for targeting specific services within Semantic Kernel
httpClient: new HttpClient() // Optional; for customizing HTTP client
);
Kernel kernel = kernelBuilder.Build();
Importante
Il connettore di completamento hugging face chat è attualmente sperimentale. Per usarlo, è necessario aggiungere #pragma warning disable SKEXP0070.
using Microsoft.SemanticKernel;
#pragma warning disable SKEXP0070
IKernelBuilder kernelBuilder = Kernel.CreateBuilder();
kernelBuilder.AddHuggingFaceChatCompletion(
model: "NAME_OF_MODEL",
apiKey: "API_KEY",
endpoint: new Uri("YOUR_ENDPOINT"), // Optional
serviceId: "SERVICE_ID", // Optional; for targeting specific services within Semantic Kernel
httpClient: new HttpClient() // Optional; for customizing HTTP client
);
Kernel kernel = kernelBuilder.Build();
Per altri provider di servizi di intelligenza artificiale che supportano l'API di completamento della chat OpenAI (ad esempio, LLM Studio), è possibile usare il codice seguente per riutilizzare il connettore di completamento chat OpenAI esistente.
Importante
L'uso di endpoint personalizzati con il connettore OpenAI è attualmente sperimentale. Per usarlo, è necessario aggiungere #pragma warning disable SKEXP0010.
using Microsoft.SemanticKernel;
#pragma warning disable SKEXP0010
IKernelBuilder kernelBuilder = Kernel.CreateBuilder();
kernelBuilder.AddOpenAIChatCompletion(
modelId: "NAME_OF_MODEL",
apiKey: "API_KEY",
endpoint: new Uri("YOUR_ENDPOINT"), // Used to point to your service
serviceId: "SERVICE_ID", // Optional; for targeting specific services within Semantic Kernel
httpClient: new HttpClient() // Optional; for customizing HTTP client
);
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);
});
using Microsoft.SemanticKernel;
var builder = Host.CreateApplicationBuilder(args);
builder.Services.AddOpenAIChatCompletion(
modelId: "gpt-4",
apiKey: "YOUR_API_KEY",
orgId: "YOUR_ORG_ID", // Optional; for OpenAI deployment
serviceId: "YOUR_SERVICE_ID" // Optional; for targeting specific services within Semantic Kernel
);
builder.Services.AddTransient((serviceProvider)=> {
return new Kernel(serviceProvider);
});
Importante
Il connettore di completamento chat Mistral è attualmente sperimentale. Per usarlo, è necessario aggiungere #pragma warning disable SKEXP0070.
using Microsoft.SemanticKernel;
var builder = Host.CreateApplicationBuilder(args);
#pragma warning disable SKEXP0070
builder.Services.AddMistralChatCompletion(
modelId: "NAME_OF_MODEL",
apiKey: "API_KEY",
endpoint: new Uri("YOUR_ENDPOINT"), // Optional
serviceId: "SERVICE_ID" // Optional; for targeting specific services within Semantic Kernel
);
builder.Services.AddTransient((serviceProvider)=> {
return new Kernel(serviceProvider);
});
Importante
Il connettore di completamento della chat google è attualmente sperimentale. Per usarlo, è necessario aggiungere #pragma warning disable SKEXP0070.
using Microsoft.SemanticKernel;
using Microsoft.SemanticKernel.Connectors.Google;
var builder = Host.CreateApplicationBuilder(args);
#pragma warning disable SKEXP0070
builder.Services.AddGoogleAIGeminiChatCompletion(
modelId: "NAME_OF_MODEL",
apiKey: "API_KEY",
apiVersion: GoogleAIVersion.V1, // Optional
serviceId: "SERVICE_ID" // Optional; for targeting specific services within Semantic Kernel
);
builder.Services.AddTransient((serviceProvider)=> {
return new Kernel(serviceProvider);
});
Importante
Il connettore di completamento hugging face chat è attualmente sperimentale. Per usarlo, è necessario aggiungere #pragma warning disable SKEXP0070.
using Microsoft.SemanticKernel;
using Microsoft.SemanticKernel.Connectors.Google;
var builder = Host.CreateApplicationBuilder(args);
#pragma warning disable SKEXP0070
builder.Services.AddHuggingFaceChatCompletion(
model: "NAME_OF_MODEL",
apiKey: "API_KEY",
endpoint: new Uri("YOUR_ENDPOINT"), // Optional
serviceId: "SERVICE_ID" // Optional; for targeting specific services within Semantic Kernel
);
builder.Services.AddTransient((serviceProvider)=> {
return new Kernel(serviceProvider);
});
Per altri provider di servizi di intelligenza artificiale che supportano l'API di completamento della chat OpenAI (ad esempio, LLM Studio), è possibile usare il codice seguente per riutilizzare il connettore di completamento chat OpenAI esistente.
Importante
L'uso di endpoint personalizzati con il connettore OpenAI è attualmente sperimentale. Per usarlo, è necessario aggiungere #pragma warning disable SKEXP0010.
using Microsoft.SemanticKernel;
var builder = Host.CreateApplicationBuilder(args);
#pragma warning disable SKEXP0010
builder.Services.AddOpenAIChatCompletion(
modelId: "NAME_OF_MODEL",
apiKey: "API_KEY",
endpoint: new Uri("YOUR_ENDPOINT"), // Used to point to your service
serviceId: "SERVICE_ID", // Optional; for targeting specific services within Semantic Kernel
httpClient: new HttpClient() // Optional; for customizing HTTP client
);
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
);
using Microsoft.SemanticKernel.Connectors.OpenAI;
OpenAIChatCompletionService chatCompletionService = new (
modelId: "gpt-4",
apiKey: "YOUR_API_KEY",
organization: "YOUR_ORG_ID", // Optional
httpClient: new HttpClient() // Optional; if not provided, the HttpClient from the kernel will be used
);
Importante
Il connettore di completamento chat Mistral è attualmente sperimentale. Per usarlo, è necessario aggiungere #pragma warning disable SKEXP0070.
using Microsoft.SemanticKernel.Connectors.MistralAI;
#pragma warning disable SKEXP0070
MistralAIChatCompletionService chatCompletionService = new (
modelId: "NAME_OF_MODEL",
apiKey: "API_KEY",
endpoint: new Uri("YOUR_ENDPOINT"), // Optional
httpClient: new HttpClient() // Optional; for customizing HTTP client
);
Importante
Il connettore di completamento della chat google è attualmente sperimentale. Per usarlo, è necessario aggiungere #pragma warning disable SKEXP0070.
using Microsoft.SemanticKernel.Connectors.Google;
#pragma warning disable SKEXP0070
GoogleAIGeminiChatCompletionService chatCompletionService = new (
modelId: "NAME_OF_MODEL",
apiKey: "API_KEY",
apiVersion: GoogleAIVersion.V1, // Optional
httpClient: new HttpClient() // Optional; for customizing HTTP client
);
Importante
Il connettore di completamento hugging face chat è attualmente sperimentale. Per usarlo, è necessario aggiungere #pragma warning disable SKEXP0070.
using Microsoft.SemanticKernel.Connectors.OpenAI;
OpenAIChatCompletionService chatCompletionService = new (
modelId: "gpt-4",
apiKey: "YOUR_API_KEY",
organization: "YOUR_ORG_ID", // Optional
httpClient: new HttpClient() // Optional; if not provided, the HttpClient from the kernel will be used
);
Per altri provider di servizi di intelligenza artificiale che supportano l'API di completamento della chat OpenAI (ad esempio, LLM Studio), è possibile usare il codice seguente per riutilizzare il connettore di completamento chat OpenAI esistente.
Importante
L'uso di endpoint personalizzati con il connettore OpenAI è attualmente sperimentale. Per usarlo, è necessario aggiungere #pragma warning disable SKEXP0010.
using Microsoft.SemanticKernel.Connectors.OpenAI;
#pragma warning disable SKEXP0010
OpenAIChatCompletionService chatCompletionService = new (
modelId: "gpt-4",
apiKey: "YOUR_API_KEY",
organization: "YOUR_ORG_ID", // Optional
endpoint: new Uri("YOUR_ENDPOINT"), // Used to point to your service
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
))
from semantic_kernel import Kernel
from semantic_kernel.connectors.ai.open_ai import OpenAIChatCompletion
# Initialize the kernel
kernel = Kernel()
# Add the Azure OpenAI chat completion service
kernel.add_service(OpenAIChatCompletion(
ai_model_id="my-deployment",
api_key="my-api-key",
org_id="my-org-id", # Optional
service_id="my-service-id", # Optional; for targeting specific services within Semantic Kernel
))
Per altri provider di servizi di intelligenza artificiale che supportano l'API di completamento della chat OpenAI (ad esempio, LLM Studio), è possibile usare il codice seguente per riutilizzare il connettore di completamento chat OpenAI esistente.
from semantic_kernel import Kernel
# Initialize the kernel
kernel = Kernel()
# Add the Azure OpenAI chat completion service
kernel.add_service(OpenAIChatCompletion(
ai_model_id="my-deployment",
api_key="my-api-key",
org_id="my-org-id", # Optional
base_url="https://my-custom-deployment.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
)
from semantic_kernel.connectors.ai.open_ai import OpenAIChatCompletion
chat_completion_service = OpenAIChatCompletion(
ai_model_id="my-deployment",
api_key="my-api-key",
org_id="my-org-id", # Optional
service_id="my-service-id", # Optional; for targeting specific services within Semantic Kernel
)
Per altri provider di servizi di intelligenza artificiale che supportano l'API di completamento della chat OpenAI (ad esempio, LLM Studio), è possibile usare il codice seguente per riutilizzare il connettore di completamento chat OpenAI esistente.
from semantic_kernel.connectors.ai.open_ai import OpenAIChatCompletion
chat_completion_service = OpenAIChatCompletion(
ai_model_id="my-deployment",
api_key="my-api-key",
org_id="my-org-id", # Optional
base_url="https://my-custom-deployment.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: