大家可能已经知道,Semantic Kernel默认主要支持两款模型:OpenAI和AzureOpenAI。对于开发者来说,这显然是不够的,尤其是当我们希望对接国内的一些强大模型,比如百度的文心一言、阿里的通义千问、搜狗的百川、智谱ChatGLM、科大讯飞的星火等。那么,我们应该怎么做呢?
答案就是利用一个叫做"one-api"的开源项目。
项目地址:https://github.com/songquanpeng/one-api
核心功能
-
支持多种大模型,覆盖国内外主流AI模型服务。
-
配置简单,镜像、代理一应俱全。
-
负载均衡访问多个渠道,保证服务的稳定性和高可用性。
-
支持stream模式,可实现更为自然的交互体验。
-
多机部署支持,拓展性强。
-
安全的令牌管理和兑换码管理功能。
-
方便的通道管理以及用户分组管理。
-
支持模型映射和自动重试功能。
-
支持绘图接口,拓宽模型应用范围。
-
通过Cloudflare AI Gateway,简化网络配置。
关于部署
one-api支持Docker部署,操作简便,维护成本低。支持使用SQLite或MySQL数据库,具体命令如下:
# 使用 SQLite 的部署命令:
docker run --name one-api -d --restart always -p 3000:3000 -e TZ=Asia/Shanghai -v /home/ubuntu/data/one-api:/data justsong/one-api
# 使用 MySQL 的部署命令,在上面的基础上添加 `-e SQL_DSN="root:123456@tcp(localhost:3306)/oneapi"`,请自行修改数据库连接参数,不清楚如何修改请参见下面环境变量一节。
# 例如:
docker run --name one-api -d --restart always -p 3000:3000 -e SQL_DSN="root:123456@tcp(localhost:3306)/oneapi" -e TZ=Asia/Shanghai -v /home/ubuntu/data/one-api:/data justsong/one-api
其中,-p 3000:3000
中的第一个 3000
是宿主机的端口,可以根据需要进行修改。
数据和日志将会保存在宿主机的 /home/ubuntu/data/one-api
目录,请确保该目录存在且具有写入权限,或者更改为合适的目录。
部署起来后,就可以使用one-api将其他模型转换为openai的格式了,并且one-api支持对模型的负载均衡,以及鉴权等操作。这个时候SK就可以对接了。
然后SK默认又没有提供openai的Endpoint接口,那我们该怎么办呢?
新建一个 OpenAIHttpClientHandler 类:
public class OpenAIHttpClientHandler : HttpClientHandler
{
protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
if (request.RequestUri.LocalPath == "/v1/chat/completions")
{
UriBuilder uriBuilder = new UriBuilder(request.RequestUri)
{
// 这里是你要修改的 URL
Scheme = "",
Host = "",
Path = "oneapi/v1/chat/completions",
};
request.RequestUri = uriBuilder.Uri;
}
// 接着,调用基类的 SendAsync 方法将你的修改后的请求发出去
HttpResponseMessage response = await base.SendAsync(request, cancellationToken);
return response;
}
}
然后我们依赖注入的地方也需要修改一下:
var handler = new OpenAIHttpClientHandler();
services.AddTransient<IKernel>((serviceProvider) =>
{
var kernel = Kernel.Builder
.WithLoggerFactory(LoggerFactory.Create(builder =>
{
builder.SetMinimumLevel(LogLevel.Information);
builder.AddConsole();
}))
.WithOpenAIChatCompletionService(
modelId: OpenAIOptions.Model,
apiKey: OpenAIOptions.Key,
httpClient: new HttpClient(handler))
.Build();
return kernel;
});
上面的代码展示了如何通过自定义HttpClientHandler将Semantic Kernel的请求重定向到one-api。
这个时候,我们就可以使用OpenAIHttpClientHandler,去对openai的接口进行拦截替换成自己oneapi的代理了
one-api是个非常不错的模型连接器项目,不仅SK,其余开源组件也可以基于这个项目来对接各种模型。
总结来说,通过one-api的多模型支撑和灵活的部署配置,我们可以更好地利用不同的AI语言模型,为用户提供更加丰富和个性化的服务。开源项目的力量,让开发者的路更为宽广。希望这篇博文对同行们有所帮助,也欢迎交流探讨。