Semantic Kernel进阶:多模型的支持

     大家可能已经知道,Semantic Kernel默认主要支持两款模型:OpenAIAzureOpenAI。对于开发者来说,这显然是不够的,尤其是当我们希望对接国内的一些强大模型,比如百度的文心一言、阿里的通义千问、搜狗的百川、智谱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语言模型,为用户提供更加丰富和个性化的服务。开源项目的力量,让开发者的路更为宽广。希望这篇博文对同行们有所帮助,也欢迎交流探讨。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值