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個子項目:

下面通過簡單的示例代碼快速體驗一下。

先體驗 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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章