经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 大数据/云/AI » 人工智能基础 » 查看文章
初步体验通过 Semantic Kernel 与自己部署的通义千问开源大模型进行对话
来源:cnblogs  作者:dudu  时间:2024/2/18 9:04:44  对本文有异议

春节之前被 Semantic Kernel 所吸引,开始了解它,学习它。

在写这篇博文之前读了一些英文博文,顺便在这里分享一下:

为了方便学习与体验以及写代码实践 Semantic Kernel,打算自己部署一个对中文友好的开源大模型,于是选择了通义千问

根据通义千问开源仓库中的 README,经过一番折腾,终于部署成功,详见博文 以容器方式部署通义千问 Qwen

紧接着就是尝试通过 Semantic Kernel 与自己部署的通义千问进行对话,在昨天晚上睡觉前初步尝试成功,通过这篇博文记录一下。

主要面临的问题是 Semantic Kernel 与通义千问之间互不支持(内置支持),Semantic Kernel 目前只内置支持 OpenAI 与 Azure OpenAI。幸运的是,通义千问实现了一个四两拔千斤的巧妙能力——提供了兼容 OpenAI api 的 api,于是这个大问题迎刃而解为一个小问题——如何欺骗 Semantic Kernel 让它在请求 OpenAI api 时改道请求自己部署的通义千问模型服务?

在 Semantic Kernel github issue 的一个评论中发现了一个移花接木的巧妙方法——通过 DelegatingHandler 修改 HttpClient 请求的 url。

对应到这里的场景就是修改所请求的 OpenAI api url 中的 schemehost,也就是将 https://api.openai.com 替换为 http://localhost:8901,实现代码如下

  1. class QwenRedirectingHandler() : DelegatingHandler(new HttpClientHandler())
  2. {
  3. protected override Task<HttpResponseMessage> SendAsync(
  4. HttpRequestMessage request, CancellationToken cancellationToken)
  5. {
  6. request.RequestUri = new UriBuilder(request.RequestUri!) { Scheme = "http", Host = "localhost", Port = 8901 }.Uri;
  7. return base.SendAsync(request, cancellationToken);
  8. }
  9. }

移花接木之后本以为初步体验小功告成,却遇到一个小挫折,在用下面的代码发送 prompt 时报错

  1. var prompt = @"博客园是什么网站";
  2. var result = await kernel.InvokePromptAsync(prompt);
  3. Console.WriteLine(result);

错误来自通义千问的响应

  1. {"detail":"Invalid request: Expecting at least one user message."}

后来参考公众号文章利用阿里通义千问和Semantic Kernel,10分钟搭建知识助手中的代码解决了

  1. var prompt = @"<message role=""user"">博客园是什么网站</message>";
  2. var summarize = kernel.CreateFunctionFromPrompt(prompt);
  3. var result = kernel.InvokeStreamingAsync(summarize);
  4. await foreach (var item in result)
  5. {
  6. Console.Write(item.ToString());
  7. }

解决这个问题后,控制台就能看到来自通义千问慢吞吞的吐字回答:

博客园(CNG.cn)是中国最大的IT社区,也是一个专业的程序员学习交流的平台。它提供了一个可以让程序员交流思想、分享经验的环境,并且有多重功能支持用户创建个人博客和参与讨论。

注:这里使用的通义千问模型版本是 Qwen-7B-Chat

到此,初步体验 Semantic Kernel 就小功告成了,下面是完整代码。

  1. using Microsoft.Extensions.DependencyInjection;
  2. using Microsoft.SemanticKernel;
  3. var builder = Kernel.CreateBuilder();
  4. builder.AddOpenAIChatCompletion("gpt-3.5-turbo", "***");
  5. builder.Services.ConfigureHttpClientDefaults(b =>
  6. b.ConfigurePrimaryHttpMessageHandler(() => new QwenRedirectingHandler()));
  7. var kernel = builder.Build();
  8. var prompt = @"<message role=""user"">博客园是什么网站</message>";
  9. var summarize = kernel.CreateFunctionFromPrompt(prompt);
  10. var result = kernel.InvokeStreamingAsync(summarize);
  11. await foreach (var item in result)
  12. {
  13. Console.Write(item.ToString());
  14. }
  15. class QwenRedirectingHandler() : DelegatingHandler(new HttpClientHandler())
  16. {
  17. protected override Task<HttpResponseMessage> SendAsync(
  18. HttpRequestMessage request, CancellationToken cancellationToken)
  19. {
  20. request.RequestUri = new UriBuilder(request.RequestUri!) { Scheme = "http", Host = "localhost", Port = 8901 }.Uri;
  21. return base.SendAsync(request, cancellationToken);
  22. }
  23. }

原文链接:https://www.cnblogs.com/dudu/p/18012653

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号