聊天补全

通过聊天完成,可以模拟与 AI 代理的来回聊天。 这当然适用于创建聊天机器人,但它也可用于创建自治代理,这些代理可以完成业务流程、生成代码等。 作为 OpenAI、Google、Mistral、Facebook 等提供的主要模型类型,聊天完成是将添加到语义内核项目的最常见 AI 服务。

选取聊天完成模型时,需要考虑以下事项:

  • 模型支持哪些形式(例如文本、图像、音频等)?
  • 它是否支持函数调用?
  • 接收和生成令牌的速度有多快?
  • 每个令牌的成本是多少?

重要

在上述所有问题中,最重要的是模型是否支持函数调用。 否则,将无法使用模型调用现有代码。 OpenAI、Google、Mistral 和 Amazon 的大部分最新模型都支持调用函数。 但是,对小型语言模型的支持仍然有限。

安装所需的包

在将聊天完成添加到内核之前,需要安装所需的包。 下面是需要为每个 AI 服务提供商安装的包。

dotnet add package Microsoft.SemanticKernel.Connectors.OpenAI

创建聊天完成服务

安装所需的包后,可以创建聊天完成服务。 下面是使用语义内核创建聊天完成服务的几种方法。

直接添加到内核

若要添加聊天完成服务,可以使用以下代码将其添加到内核的内部服务提供商。

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

使用依赖项注入

如果使用依赖项注入,则可能需要将 AI 服务直接添加到服务提供商。 如果要创建 AI 服务的单一实例并在暂时性内核中重复使用它们,这非常有用。

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

若要添加聊天完成服务,可以使用以下代码将其添加到内核。

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

可以直接创建聊天完成服务的实例,并将它们添加到内核,或者在代码中直接使用它们,而无需将它们注入内核。 以下代码演示如何创建聊天完成服务并将其添加到内核。

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

检索聊天完成服务

将聊天完成服务添加到内核后,可以使用 get 服务方法检索它们。 下面是如何从内核检索聊天完成服务的示例。

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

chat_completion_service = kernel.get_service(type=ChatCompletionClientBase)
ChatCompletionService chatCompletionService = kernel.getService(ChatCompletionService.class);

使用聊天完成服务

有了聊天完成服务后,即可使用它从 AI 代理生成响应。 使用聊天完成服务有两种主要方法:

  • 非流式处理:等待服务生成整个响应,然后再将其返回给用户。
  • 流式处理:生成响应的各个区块,并在创建响应时返回给用户。

下面是使用聊天完成服务生成响应的两种方法。

非流式处理聊天完成

若要使用非流式处理聊天完成,可以使用以下代码从 AI 代理生成响应。

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

InvocationContext optionalInvocationContext = null;

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

流式聊天完成

若要使用流式聊天完成,可以使用以下代码从 AI 代理生成响应。

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,
    kernel=kernel,
)

async for chunk in response:
    print(chunk)

注意

Java 的语义内核不支持流式处理响应模型。

后续步骤

将聊天完成服务添加到语义内核项目后,即可开始与 AI 代理创建对话。 若要详细了解如何使用聊天完成服务,请查看以下文章: