使用 Microsoft.SemanticKernel 与国产大模型 API 集成实现对话系统

0 阅读4分钟

近年来,随着 国产大模型 的崛起,很多开发者和企业选择将其集成到自己的应用中,以满足对人工智能技术的需求。在本文中,我们将展示如何使用 Microsoft.SemanticKernel 库与国产大模型 API 集成,构建一个支持对话系统的应用程序。

我们将以 Zhipu AI(智谱AI) 作为示例,展示如何将其作为后端服务,替换掉 OpenAI API,从而使用国产大模型。

一、前期准备

在开始开发之前,需要做以下准备:

1. 安装 Microsoft.SemanticKernel 包

Microsoft.SemanticKernel 是一个开源框架,可以帮助开发者更便捷地与大型语言模型(如 OpenAI、Google、或其他厂商提供的模型)进行交互。

我们需要首先安装这个 NuGet 包。

使用 NuGet 包管理器安装
  1. 打开你的 Visual Studio 项目。
  2. 右键点击 解决方案资源管理器 中的项目,选择 Manage NuGet Packages
  3. NuGet 包管理器 中,选择 浏览 标签页,搜索 Microsoft.SemanticKernel
  4. 找到该包后,点击 安装
使用 NuGet 控制台安装

你也可以通过 NuGet 控制台 来安装:

Install-Package Microsoft.SemanticKernel -Version 1.59.0
使用 .NET CLI 安装

如果你喜欢命令行操作,可以在项目目录下使用以下命令:

dotnet add package Microsoft.SemanticKernel --version 1.59.0

2. 获取国产大模型 API 密钥

不同的国产大模型提供不同的 API 访问方式。以 Zhipu AI 为例,开发者需要在其平台上申请 API 密钥,才能使用该模型的功能。你需要登录到 Zhipu OpenAI API 提供商的官网,申请并获取你的 API 密钥。

二、项目代码实现

在本部分,我们将展示如何使用 Microsoft.SemanticKernel 库与 Zhipu AI 的 API 集成,构建一个简单的对话系统。

1. 设置 SemanticKernel 内核和 API 配置

首先,我们创建一个 SemanticKernel 内核,并设置与 Zhipu OpenAI API 的通信配置。

using Microsoft.SemanticKernel;
using Microsoft.SemanticKernel.ChatCompletion;

var kernelBuilder = Kernel.CreateBuilder();
var httpClient = new HttpClient(new ZhipuOpenAIHttpClientHandler());
var builder = kernelBuilder.AddOpenAIChatCompletion(modelId: "glm-4-flash-250414", // 这里可以替换成你自己的模型 ID
    apiKey: "你的API密钥", httpClient: httpClient);

var kernel = builder.Build();
var chatCompletionService = kernel.GetRequiredService<IChatCompletionService>();

在这段代码中,我们创建了一个 kernelBuilder,它用于初始化 SemanticKernel 内核。在 AddOpenAIChatCompletion 方法中,我们配置了模型 ID 和 API 密钥,并指定了自定义的 HTTP 客户端处理器,通过 httpClient 与 Zhipu OpenAI API 进行交互。

2. 用户输入和模型回复的交互逻辑

接下来,我们实现了与用户的对话交互。用户输入内容后,我们将其传递给 AI 模型,获取模型的回复,并在控制台中显示。

var history = new ChatHistory();
string? userInput;
do
{
    // 收集用户输入
    Console.Write("User > ");
    userInput = Console.ReadLine();

    // 将用户输入添加到对话历史
    history.AddUserMessage(userInput);

    // 获取模型的回复
    var result = await chatCompletionService.GetChatMessageContentAsync(history, kernel: kernel);

    // 输出结果
    Console.WriteLine("Assistant > " + result);

    // 将模型的回复添加到对话历史
    history.AddMessage(result.Role, result.Content ?? string.Empty);
} while (userInput is not null);

这段代码实现了一个简单的 命令行聊天系统,用户可以输入问题或命令,系统会通过 Zhipu AI 获取回答,并将对话历史保存在 ChatHistory 对象中。

3. 自定义 HTTP 客户端处理器

由于 Zhipu OpenAI 提供了与 OpenAI 兼容的 API 接口,但主机和路径可能不同,我们需要创建一个自定义的 HTTP 请求处理器,以便将请求正确路由到 Zhipu 的 API 地址。

public class ZhipuOpenAIHttpClientHandler : HttpClientHandler
{
    protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
    {
        // 如果请求路径是 /v1/chat/completions,重定向请求到 Zhipu OpenAI API
        switch (request.RequestUri?.LocalPath)
        {
            case "/v1/chat/completions":
                var uriBuilder = new UriBuilder(request.RequestUri)
                {
                    Scheme = "https",
                    Host = "open.bigmodel.cn", // Zhipu OpenAI API 的主机地址
                    Path = "api/paas/v4/chat/completions", // 适配的接口路径
                };
                request.RequestUri = uriBuilder.Uri;
                break;
        }

        // 发起请求并返回响应
        HttpResponseMessage response = await base.SendAsync(request, cancellationToken);
        return response;
    }
}

这段代码通过自定义的 ZhipuOpenAIHttpClientHandler 类,拦截并修改请求 URL,使得原本发往 OpenAI 的请求能够被转发到 Zhipu OpenAI API。这个操作是通过 HttpClientHandler 类来实现的。

三、总结

通过以上步骤,我们成功将 Microsoft.SemanticKernel国产大模型(如 Zhipu OpenAI)的 API 集成,实现了一个能够与用户进行对话的简单系统。以下是本教程的关键点:

  1. 安装 Microsoft.SemanticKernel 库,提供与大型语言模型的集成功能。
  2. 使用 Zhipu OpenAI(或其他国产大模型)API 作为后端模型。
  3. 创建自定义的 HTTP 请求处理器,确保请求被正确路由到 Zhipu 的 API。
  4. 实现一个简单的对话系统,支持用户与 AI 进行互动,并保持对话历史。

这种集成方式不仅适用于开发者构建自定义对话系统,也可以帮助企业利用国产大模型实现本地化的 AI 应用。通过 Microsoft.SemanticKernel,你可以轻松地替换不同的 AI 后端服务,实现灵活的模型切换和定制。