借助 .NET 开源库 Sdcb.DashScope 调用阿里云灵积通义千问 API

在昨天的博文中,我们通过 Semantic Kernel 调用了自己部署的通义千问开源大模型,但是自己部署通义千问对服务器的配置要求很高,即使使用抢占式按量实例,每次使用时启动服务器,使用完关闭服务器,也比较麻烦,而且越高级的大模型对服务器的配置越高。所以昨天的博文中使用了很低级的 Qwen-7B-Chat 模型,结果回答问题的效果很不理想,连博客园的网站域名都弄错了。

于是改变路线,尝试使用阿里云提供的模型服务灵积(DashScope),但是灵积没有提供兼容 OpenAI api 的 api,虽然提供了 SDK,但仅支持 Python 与 Java,望 SDK 心叹的同时准备今天试试自己写 C# 代码调用灵积提供的通义千问 api。

在动手写代码之前,不抱任何希望地去 nuget 官网碰碰运气,搜了搜 qwen,竟然惊喜地出现了一个搜索结果

有人在2个月之前就开始开发灵积的非官方 .NET SDK —— Sdcb.DashScope,而且1个月之前发布了1.0版,真是及时雨,给作者点赞。

通过这 nuget 包的 Source repository 链接找到对应的 github 仓库 https://github.com/sdcb/Sdcb.DashScope ,立即签出代码,其中有单元测试代码,先跑一个测试体验一下。

先到阿里云灵积控制台的“API-KEY管理”中创建 api key,然后在自己的电脑上通过 user-secrets 保存 api key

dotnet user-secrets init
dotnet user-secrets set DashScopeApiKey sk-xxxxxxxxxxx

选择其中一个测试

[Fact]
public async Task OnlineChatTest()
{
    using DashScopeClient c = new(_apiKey);
    ResponseWrapper<ChatOutput, ChatTokenUsage> result = await c.TextGeneration.Chat("qwen-turbo", [ChatMessage.FromUser("今天长沙天气如何?")], new ChatParameters
    {
        EnableSearch = true
    });
    _console.WriteLine(result.ToString());
}

跑一下

dotnet test --filter OnlineChatTest

输出结果如下

ResponseWrapper { RequestId = 89e760f7-dc21-9461-8144-68629fa1ad00, Output = ChatOutput { Text = 今天是2024年2月11日,星期日,长沙的天气情况为晴朗。具体来说,湿度为75%,最低气温为3.0摄氏度,最高气温可达18.0摄氏度。风向以东南风为主,白天气温适宜,风力较小,仅为1级。夜间依然保持晴朗,风向转为东南风,风力同样维持在1级。建议外出时注意保暖,因为虽然白天阳光明媚,但早晚温差较大。空气质量评分为良,空气质量指数为97,相对较好。, FinishReason = stop }, Usage = ChatTokenUsage { OutputTokens = 126, InputTokens = 5 } }

接着,自己写个 .NET 控制台程序体验一下

准备控制台项目

dotnet new console -n dashscop-sample
cd  dashscop-sample
dotnet add package Sdcb.DashScope
dotnet user-secrets init
dotnet user-secrets set DashScopeApiKey sk-xxxxxxxxxxx

添加 FrameworkReference

<ItemGroup>
  <FrameworkReference Include="Microsoft.AspNetCore.App"></FrameworkReference>
</ItemGroup>

在 Progam.cs 写实现代码,使用 qwen-max 通义千问千亿级别大模型回答一个简单的问题博客园是什么网站,看看效果

using Microsoft.Extensions.Configuration;
using Sdcb.DashScope;
using Sdcb.DashScope.TextGeneration;

IConfiguration config = new ConfigurationBuilder()
    .AddUserSecrets<Program>()
    .Build();

string apiKey = config.GetValue<string>("DashScopeApiKey") ?? "";

using DashScopeClient client = new(apiKey);

var result = await client.TextGeneration.Chat(
    "qwen-max",
    [ChatMessage.FromUser("博客园是什么网站")]);

Console.WriteLine(result.Output.Text);

public partial class Program
{ }

注:Sdcb.DashScope 贴心地提供了 ChatMessage.FromUser 方法

运行代码看看千亿级通义千问的回答(运行3次)

第1次的回答:

博客园是一个面向软件开发者的技术写作与分享平台,成立于2004年。它主要为程序员提供一个记录和分享技术知识、经验和见解的空间,内容涵盖编程语言、软件架构、算法、数据库、操作系统等多个领域。博客园在中国开发者社区中具有较高的知名度和影响力,吸引了大量IT从业人员和技术爱好者在此交流和学习。

第2次的回答:

博客园(www.cnblogs.com)是一个面向软件开发者的中文技术社区网站,创建于2004年。该网站主要提供博客空间服务,用户以软件开发者、IT从业人员以及对相关技术感兴趣的人员为主,他们在这里发表、分享和交流编程技术、架构设计、软件开发心得等各种专业技术文章。博客园在中国IT技术圈内具有较高的知名度和影响力。

第3次的回答:

博客园是一个专注于技术分享的中文博客平台,创建于2004年。该网站主要面向软件开发人员、IT专业人士以及对技术和知识分享感兴趣的人群,提供了一个发表和阅读原创技术文章的空间。用户可以在博客园上撰写和发布有关编程、系统架构、数据库、人工智能、云计算等各种IT技术领域的文章和心得,并与其他用户进行交流和讨论。

在博客园,许多知名的技术专家和行业大牛都有自己的博客空间,通过分享高质量的技术内容,博客园在IT技术领域内具有较高的影响力和知名度。

qwen-max 的回答果然比 Qwen-7B-Chat 强很多。

感谢 ZHOU Jie 给 .NET 社区带来的 Sdcb.DashScope

2023年3月6日更新:后来我们自己开发了 DashScope SDK for .NET,详见博文 https://www.cnblogs.com/cmt/p/18052469

posted @ 2024-02-11 14:55  dudu  阅读(1401)  评论(3编辑  收藏  举报