聊天补全

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

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

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

重要

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

设置您的本地环境

某些 AI 服务可以托管在本地,可能需要一些设置。 下面是为支持这一点的人提供的说明。

没有本地配置。

安装所需的包

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

dotnet add package Microsoft.SemanticKernel.Connectors.AzureOpenAI

创建聊天完成服务

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

直接添加到内核

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

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

若要创建聊天完成服务,需要导入所需的模块并创建服务的实例。 下面是为每个 AI 服务提供商创建聊天完成服务的步骤。

提示

有三种方法可以向 AI 服务提供所需的信息。 可以直接通过构造函数提供信息,设置必要的环境变量,或在包含环境变量的项目目录中创建 .env 文件。 可以访问此页面来查找每个 AI 服务提供商的所有必需环境变量: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")

注意

AzureChatCompletion 服务还支持 Microsoft Entra 身份验证。 如果未提供 API 密钥,服务将尝试使用 Entra 令牌进行身份验证。

可以立即开始使用完成服务,或将聊天完成服务添加到内核。 可以使用以下代码将服务添加到内核。

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)

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

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

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

提示

如果不需要在内核中使用其他服务,则不需要将聊天完成服务添加到内核。 可以直接在代码中使用聊天完成服务。

使用聊天完成服务

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

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

在开始之前,如果尚未将服务注册到内核,则需要手动创建执行设置实例以使用聊天完成服务。

from semantic_kernel.connectors.ai.open_ai import OpenAIChatPromptExecutionSettings

execution_settings = OpenAIChatPromptExecutionSettings()

提示

若要查看可以在执行设置中配置的内容,可以在 源代码 中检查类定义,或查看 API 文档

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

非流式处理聊天完成

若要使用非流式处理聊天完成,可以使用以下代码从 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,
    settings=execution_settings,
)
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,
    settings=execution_settings,
)

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

注意

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

后续步骤

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