SK 目前提供了多个AI 提供商的Connector,但仅OpenAI 和Azure OpenAI 两种Connector(连接器)属于正式可用状态,国内开发者而言并不能访问国外大模型,因此如何使用国内大模型(通义、智谱等)玩转 Semantic Kernel呢?好在,SK 在设计时也考虑了这个问题,接下来就来以智谱AI大模型为例来解密答案。
由于SK 默认仅提供了OpenAI 和Azure OpenAI 两种Connector(连接器),因此如果需要使用智谱大模型,有四种做法:
- 指定自定义
Endpoint
实现。 - 指定自定义
OpenAIClient
。 - 使用代理,诸如OneApi
- 自行实现 Connectors
注册智谱大模型
北京智谱华章科技有限公司(简称“智谱AI”)致力于打造新一代认知智能大模型,专注于做大模型的中国创新。打造了AIGC模型及产品矩阵,包括通用大模型、超拟人大模型、图像大模型、向量大模型等,并且支持使用您的私有数据对模型进行微调。包括AI提效助手智谱清言(chatglm.cn)、高效率代码模型CodeGeeX、多模态理解模型CogVLM和文生图模型CogView等,涵盖了文生文、图片和视频的生成及理解、代码生成、向量嵌入。
使用智谱大模型
#r "nuget: Microsoft.SemanticKernel"
指定自定义 Endpoint
该方式为实验功能,需要手动禁用warning:#pragma warning disable SKEXP0010
#pragma warning disable SKEXP0010
using Microsoft.SemanticKernel;
using Microsoft.SemanticKernel.ChatCompletion;
using Microsoft.SemanticKernel.Connectors.OpenAI;
using Microsoft.Extensions.DependencyInjection;
// 引入交互式的内核命名空间,以便用户输入
using PolyglotKernel= Microsoft.DotNet.Interactive.Kernel;
var zhipuApiKey = await PolyglotKernel.GetInputAsync("请输入您的智谱API Key:");
// Create kernel builder
var builder = Kernel.CreateBuilder();
var zhipuEndpoint = new Uri("https://open.bigmodel.cn/api/paas/v4/");
builder.AddOpenAIChatCompletion(
modelId: "glm-4-flash", // 可选模型编码:glm-4-plus、glm-4-0520、glm-4 、glm-4-air、glm-4-airx、glm-4-long、 glm-4-flash(免费)
apiKey: zhipuApiKey,
endpoint: zhipuEndpoint);
// Build kernel
var kernel = builder.Build();
var response = await kernel.InvokePromptAsync("介绍下智谱AI的产品和服务");
response.Display();
指定自定义OpenAIClient
using Microsoft.SemanticKernel;
using Microsoft.SemanticKernel.ChatCompletion;
using Microsoft.SemanticKernel.Connectors.OpenAI;
using Microsoft.Extensions.DependencyInjection;
using OpenAI;
using System.ClientModel;
// 引入交互式的内核命名空间,以便用户输入
using PolyglotKernel= Microsoft.DotNet.Interactive.Kernel;
var zhipuApiKey = await PolyglotKernel.GetInputAsync("请输入您的智谱API Key:");
// Create kernel builder
var builder = Kernel.CreateBuilder();
var zhipuEndpoint = new Uri("https://open.bigmodel.cn/api/paas/v4/");
OpenAIClientOptions clientOptions = new OpenAIClientOptions();
clientOptions.Endpoint = zhipuEndpoint;
// 创建自定义的OpenAI客户端
OpenAIClient client = new(new ApiKeyCredential(zhipuApiKey), clientOptions);
// Add OpenAI Chat completion
builder.AddOpenAIChatCompletion(
modelId: "glm-4-flash", // 可选模型编码:glm-4-plus、glm-4-0520、glm-4 、glm-4-air、glm-4-airx、glm-4-long、 glm-4-flash(免费)
openAIClient: client);
// Build kernel
var kernel = builder.Build();
var response = await kernel.InvokePromptAsync("智谱AI有哪些模型,请直接返回模型列表。");
response.Display();
使用OneApi 对接流行大模型
OneApi 是一个GitHub 开源项目,帮助开发者通过标准的 OpenAI API 格式访问所有的大模型。(https://github.com/songquanpeng/one-api)
借助OneApi,开发者可以忽略模型间的API 差异,通过统一的OpenAI的格式,实现对各大模型的透明调用。
对于开发者而言,仅需要将 OpenAI 的网址改成你部署的 One API 系统的网址、将 OpenAI 的 API Key 改成你的令牌即可。One API 将代理用户向实际的大模型发出请求并接收响应,如下图所示:
graph LR
A(用户)
A --->|使用 One API 分发的 key 进行请求| B(One API)
B -->|中继请求| C(OpenAI)
B -->|中继请求| D(Azure)
B -->|中继请求| E(其他 OpenAI API 格式下游渠道)
B -->|中继并修改请求体和返回体| F(非 OpenAI API 格式下游渠道)
使用Docker安装 OneApi
使用SQLite部署:
docker run --name one-api -d --restart always \
-p 3000:3000 -e TZ=Asia/Shanghai \
-v /home/data/one-api:/data justsong/one-api
部署成功后, 使用docker ps | grep one-api
进行确认:
$ docker ps | grep one-api
12f025568eab justsong/one-api "/one-api" 3 minutes ago Up 3 minutes 0.0.0.0:3000->3000/tcp one-api
然后直接访问 http://localhost:3000/ 即可打开 One Api 管理界面,默认用户名密码是:root/123456
。登录后设置相应的模型。
#r "nuget: Microsoft.SemanticKernel"
对接OneAPI
#pragma warning disable SKEXP0010
using Microsoft.SemanticKernel;
using Microsoft.SemanticKernel.ChatCompletion;
using Microsoft.SemanticKernel.Connectors.OpenAI;
using Microsoft.Extensions.DependencyInjection;
// 引入交互式的内核命名空间,以便用户输入
using PolyglotKernel= Microsoft.DotNet.Interactive.Kernel;
// var oneApiKey = await PolyglotKernel.GetInputAsync("请输入您的OneAPI Key:");
//这里就是oneapi的key
var oneApiKey = "sk-9y9939P3ufwHaltcB95d91F3D9D64303Ad799e991f4700F1";
// Create kernel builder
var builder = Kernel.CreateBuilder();
var oneApiEndpoint = new Uri("http://localhost:3000/v1");
// modelId,是oneapi的设置
builder.AddOpenAIChatCompletion(
modelId: "lite",
apiKey: oneApiKey,
endpoint: oneApiEndpoint);
// Build kernel
var kernel = builder.Build();
var response = await kernel.InvokePromptAsync("介绍下OneApi的使用场景和优势");
response.Display();
t: oneApiEndpoint);
// Build kernel
var kernel = builder.Build();
var response = await kernel.InvokePromptAsync(“介绍下OneApi的使用场景和优势”);
response.Display();