AI应用开发之路-准备:发起第2个开源小项目 SemanticKernel.DashScope
上周我们发布了与AI应用开发相关的第1个开源小项目 —— DashScope SDK for .NET,今天我们再发布一个开源小项目 —— SemanticKernel.DashScope,今天这个项目才是主角,因为我们想基于 Semantic Kernel 开发大模型应用。
首先分享几个与 Semantic Kernel 与 DashScope 相关的消息:
- Java 1.0 Release Candidate for Semantic Kernel 发布了,SK 不仅是 .NET 版的 AI 应用开发框架,土豪的微软正在同时开发三个技术平台的版本 —— .NET, Java, Python ,为了AI,微软也是够拼。
- DashScope 开始支持 function calling,2月22日我们提交工单咨询阿里云 DashScope 是否支持 function calling,阿里云回复说不支持,这周发现开始支持了,阿里云的动作够快。
- 限时免费的通义千问系列大模型18号要开始收费了,我们现在使用的 qwen-max 就属于限时免费款。
【阿里云】灵积大模型服务平台通义千问系列大模型将于2024年3月18日调整计费。请您查看最新定价计费说明。查看地址:https://t.aliyun.com/U/4ij1a1 。感谢您的使用
下面简单介绍一下今天的主角,github 仓库地址 https://github.com/cnblogs/semantic-kernel-dashscope
这个开源项目不仅实现了支持 Semantic Kernel 的 DashScope Connector,还实现了支持 Kernel Memory 的 DashScope Extension,所以分成了2个子项目:
- SemanticKernel.DashScope:实现了3个接口
IChatCompletionService
与ITextGenerationService
以及ITextEmbeddingGenerationService
,对应的 nuget 包是 Cnblogs.SemanticKernel.Connectors.DashScope - KernelMemory.DashScope:实现了2个接口
ITextEmbeddingGenerator
与ITextEmbeddingGenerator
, 对应的 nuget 包是 Cnblogs.KernelMemory.AI.DashScope
下面通过简单的示例代码快速体验一下。
先体验 Cnblogs.SemanticKernel.Connectors.DashScope
安装 nuget 包
dotnet add package Cnblogs.SemanticKernel.Connectors.DashScope
写一个简单的控制台程序与通义千问 qwn-max 大模型进行对话
var builder = Kernel.CreateBuilder();
builder.Services.AddDashScopeChatCompletion(apiKey, "qwen-max");
var kernel = builder.Build();
var prompt = "博客园是什么样网站,用简练的语言回答";
var result = await kernel.InvokePromptAsync(prompt);
Console.WriteLine(result);
运行程序,通义千问的回答如下:
博客园是一个面向软件开发和技术爱好者的中文技术博客平台,用户可以在该网站上创建、分享和交流编程知识、技术文章、行业动态等内容。它致力于为程序员及互联网相关人员提供一个高质量的内容创作与分享社区,促进技术信息的传播与交流。
接着体验 Cnblogs.KernelMemory.AI.DashScope
安装 nuget 包
dotnet add package Microsoft.KernelMemory.Core
dotnet add package Cnblogs.KernelMemory.AI.DashScope
写一个简单的控制台程序,使用园子的第一款简陋鼠标垫,是否是您值得拥有的周边这篇博文进行 RAG(Retrieval Augmented Generation) 与通义千问大模型进行对话
var memory = new KernelMemoryBuilder()
.WithDashScopeDefaults(apiKey)
.Build<MemoryServerless>();
await memory.ImportWebPageAsync("https://www.cnblogs.com/cmt/p/17974346");
var question = "博客园鼠标垫在哪买";
var answer = await memory.AskAsync(question);
Console.WriteLine($"{answer.Result}");
上面的代码很简单,但背后比较复杂,Kernel Memory 做了很多事情,比如 memory.ImportWebPageAsync
方法执行时完成了博文内容的抓取、内容分割(partition)、调用 DashScope api 生成 embedding 向量并保存至向量数据库,从下面的日志可以看出来
info: Microsoft.KernelMemory.Pipeline.BaseOrchestrator[0]
Queueing upload of 1 files for further processing [request f3626f2e67ad451a959d056b4a9e3fbd202403130328152696707]
info: Microsoft.KernelMemory.Pipeline.BaseOrchestrator[0]
File uploaded: content.url, 38 bytes
info: Microsoft.KernelMemory.Pipeline.BaseOrchestrator[0]
Handler 'extract' processed pipeline 'default/f3626f2e67ad451a959d056b4a9e3fbd202403130328152696707' successfully
info: Microsoft.KernelMemory.Pipeline.BaseOrchestrator[0]
Handler 'partition' processed pipeline 'default/f3626f2e67ad451a959d056b4a9e3fbd202403130328152696707' successfully
info: Microsoft.KernelMemory.Pipeline.BaseOrchestrator[0]
Handler 'gen_embeddings' processed pipeline 'default/f3626f2e67ad451a959d056b4a9e3fbd202403130328152696707' successfully
info: Microsoft.KernelMemory.Pipeline.BaseOrchestrator[0]
Handler 'save_records' processed pipeline 'default/f3626f2e67ad451a959d056b4a9e3fbd202403130328152696707' successfully
info: Microsoft.KernelMemory.Pipeline.BaseOrchestrator[0]
Pipeline 'default/f3626f2e67ad451a959d056b4a9e3fbd202403130328152696707' complete
在通过 memory.AskAsync
方法发送提示词时,不仅包含用户输入的提示词,而且会根据用户输入的提示词调用 DashScope api 生成提示词的 embedding 向量,并且用这个向量在向量数据库中进行语义搜索,将搜索到的结果与用户输入的提示词一起发送给大模型(这就是RAG)。
通义千问 qwen-max 大模型训练时并没有关于博客园鼠标垫的数据,所以如果不进行 RAG,通义千问不会给出想要的答案。
有了 Kernel Memory,使用 RAG 变得很简单,看看下面采用 RAG 的回答效果
博客园鼠标垫可以在淘宝上购买,具体购买方式有两种:
1. 淘宝搜索“博客园”,找到相关店铺和商品链接进行购买。
2. 直接通过提供的淘宝店购买链接购买:https://item.taobao.com/item.htm?id=761724714914
另外,如果不想在淘宝店购买,还可以选择添加园子的企业微信进行购买。
对比一下,不采用 RAG,直接问通义千问
很抱歉,我无法提供最新、实时的购物信息,包括博客园是否售卖鼠标垫以及购买途径。博客园(Cnblogs)是一个面向软件开发者的IT技术博客平台,并非商品销售网站,一般不会直接售卖鼠标垫等实物商品。
如果您想购买鼠标垫,可以尝试在各大电商平台如淘宝、京东、苏宁易购等搜索相关商品进行选购。
RAG的效果很明显。
欢迎大家关注这个开源项目,欢迎反馈,欢迎提交 PR https://github.com/cnblogs/semantic-kernel-dashscope
接下来我们会尝试实现对 function calling 的支持。
19:34 更新:DashScope SDK for .NET 现已支持 function calling