码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 初步体验通过 Semantic Kernel 与自己部署的通义千问开源大模型进行对话


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

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

    • Intro to Semantic Kernel – Part One
    • Intro to Semantic Kernel – Part Two
    • Build a custom Copilot experience with your private data using and Kernel Memory
    • Semantic Kernel: The New Way to Create Artificial Intelligence Applications
    • Semantic Kernel: A bridge between large language models and your code

    为了方便学习与体验以及写代码实践 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 中的 scheme 与 host,也就是将 https://api.openai.com 替换为 http://localhost:8901,实现代码如下

    class QwenRedirectingHandler() : DelegatingHandler(new HttpClientHandler())
    {
        protected override Task SendAsync(
            HttpRequestMessage request, CancellationToken cancellationToken)
        {
            request.RequestUri = new UriBuilder(request.RequestUri!) { Scheme = "http", Host = "localhost", Port = 8901 }.Uri;
            return base.SendAsync(request, cancellationToken);
        }
    }
    

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

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

    错误来自通义千问的响应

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

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

    var prompt = @"博客园是什么网站";
    var summarize = kernel.CreateFunctionFromPrompt(prompt);
    var result = kernel.InvokeStreamingAsync(summarize);
    
    await foreach (var item in result)
    {
        Console.Write(item.ToString());
    }
    

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

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

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

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

    using Microsoft.Extensions.DependencyInjection;
    using Microsoft.SemanticKernel;
    
    var builder = Kernel.CreateBuilder();
    builder.AddOpenAIChatCompletion("gpt-3.5-turbo", "***");
    builder.Services.ConfigureHttpClientDefaults(b =>
        b.ConfigurePrimaryHttpMessageHandler(() => new QwenRedirectingHandler()));
    
    var kernel = builder.Build();
    
    var prompt = @"博客园是什么网站";
    var summarize = kernel.CreateFunctionFromPrompt(prompt);
    var result = kernel.InvokeStreamingAsync(summarize);
    
    await foreach (var item in result)
    {
        Console.Write(item.ToString());
    }
    
    class QwenRedirectingHandler() : DelegatingHandler(new HttpClientHandler())
    {
        protected override Task SendAsync(
            HttpRequestMessage request, CancellationToken cancellationToken)
        {
            request.RequestUri = new UriBuilder(request.RequestUri!) { Scheme = "http", Host = "localhost", Port = 8901 }.Uri;
            return base.SendAsync(request, cancellationToken);
        }
    }
    
  • 相关阅读:
    微信公众号window.open(url, '_blank');打不开网页
    【下班神器】python写自动关机程序并打包成exe文件
    济南申报高新技术企业不符合的条件
    【电源专题】不合理接地引发的典型问题及地环路隔离的方法
    集合的父亲之Map------(双列集合顶级接口)和遍历方式
    设计有效的异常测试用例:关注这些方向,保障软件稳定性
    关于实例变量、对象和引用
    53基于matlab的Tamura纹理特征提取
    Final IK⭐二、脚贴合平面 GrounderFBBIK 介绍
    python采集股票数据信息,含带完整源码~
  • 原文地址:https://www.cnblogs.com/dudu/p/18012653
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号