iT邦幫忙

2023 iThome 鐵人賽

DAY 22
0
AI & Data

OpenAI 從提示工程(Prompt Engineering)到語義核心(Semantic Kernel)的實踐系列 第 22

Semantic Kernel的實踐:Semantic Kernel - 開箱即用Plugins

  • 分享至 

  • xImage
  •  

前言

Semantic Kernel做為一個SDK,除了提供一個標準化的開發模式之外,也針對一些常用功能提供內建已標準化的Plugins,這些Plugins稱為開箱即用的Plugins,有助於增強Semantic Kernel能力,畢竟多數的開發者都希望有很多現成的套件或功能,能直接套用。本篇就來介紹至目前為止Semantic Kernel提供了哪些內建的Plugins。

Semantic Kernel 內建開箱即用Plugins

由於Semantic Kernel支援不同程式語言,因此現行內建的Plugins在不同程式語言支援程式度並不相同,下表是來自官方文件,做為一個以 .net 為出發的SDK,可以發現C#版本通常是優先提供,完善度最高的

https://ithelp.ithome.com.tw/upload/images/20231007/20126569iwN6wRitPd.png
( 來源:https://learn.microsoft.com/en-us/semantic-kernel/ai-orchestration/plugins/out-of-the-box-plugins?tabs=Csharp )

內建的Plugins隨著時間有可能會有增加的部份,因此也可以直接查看github,另外也非常歡迎參與貢獻,擴大Semantic Kernel社群規模
C# Plugin: https://github.com/microsoft/semantic-kernel/tree/main/dotnet/src/Plugins/Plugins.Core

注意:目前即將釋出的 Semantic Kernel 1.0版本,已將skill更名為Plugins,所以文件上看到的Skill名稱,在正式版本會是Plugin名稱,例如:FileIOSkill -> FileIOPlugin

開箱即用Plugins提供了哪些function呢

要知道內建的Plugin提供哪些功能,以目前的變化來說,通常文件都更新的比較慢,而Semantic Kernel做為一個開源的SDK,好處就是我們隨時可以從github上查看,例如:

  • FileIOPlugin,提供了ReadAsync及WriteAsync二個 native function
[SKFunction, Description("Read a file")]
public async Task<string> ReadAsync([Description("Source file")] string path)
{
    using var reader = File.OpenText(path);
    return await reader.ReadToEndAsync().ConfigureAwait(false);
}
[SKFunction, Description("Write a file")]
public async Task WriteAsync(
    [Description("Destination file")] string path,
    [Description("File content")] string content)
{
    byte[] text = Encoding.UTF8.GetBytes(content);
    if (File.Exists(path) && File.GetAttributes(path).HasFlag(FileAttributes.ReadOnly))
    {
        // Most environments will throw this with OpenWrite, but running inside docker on Linux will not.
        throw new UnauthorizedAccessException($"File is read-only: {path}");
    }

    using var writer = File.OpenWrite(path);
    await writer.WriteAsync(text, 0, text.Length).ConfigureAwait(false);
}

為什麼沒有DelAsync呢? 不負責的推測是,刪除資料這件事對系統影響層面較大,LLM應用基於Prompt運作,假如模型在判斷語義上發生了錯誤不準確,那麼誤刪除資料的情況是很有可能發生的,因此內建FileIOPlugin目前並未提供刪除function,而這也可以進一步提醒我們在開發LLM應用時,對於較具破壞性的功能層面需要多一些防謢機制,單靠Prompt驅動風險是較高的。

如何使用開箱即用Plugins

  • 命名空間,從github原碼看起來,內建的Plugins集中在Plugins.Core命名空間下,因此只要引用該命名空間即可
using Microsoft.SemanticKernel.Plugins.Core;

注意:semantic kernel 1.0版將Skill更名為Plugin,因此正式版本的命名空間是Microsoft.SemanticKernel.Plugins.Core,而非目前官方文件上的Microsoft.SemanticKernel.CoreSkills

  • 程式撰寫,ImportFunctions,第1個參數new plugins物件,第2參數則是自訂該plugin的別名,這個別名會影響在prompt裡調用native function的plugin名稱
kernel.ImportFunctions(new FileIOPlugin(), "fileplugin");

注意:semantic kernel 1.0版將Skill更名為Plugin,因此正式版本的寫法為kernel.ImportFunctions,而非目前官方文件上的kernel.ImportSkill

  • 在prompt中調用native function
const string promptTemplate = @"
建立檔案{{fileplugin.writeAsync}}";

var createFile = kernel.CreateSemanticFunction(promptTemplate, maxTokens: 150);

結語

Semantic Kernel做為一個SDK,除了架構設計標準化之外,自然希望能發展更多內建功能,提供更方便的LLM應用開發體驗,因此目前提供了一些內建的Plugins,同時做為一個開源的專案,當然也歡迎社群的貢獻,所以各位大神們如果找不到內建的Plugins,不如貢獻一個吧。

嗨,我是Ian,我喜歡分享與討論,今年跟2位朋友合著了一本ChatGPT主題書,如果你是一位開發者,這本書或許會有些幫助,https://www.tenlong.com.tw/products/9786263335189
這次的鐵人賽文章也會同時發佈於個人blog,歡迎關注我的blog : https://medium.com/@ianchen_27500


上一篇
Semantic Kernel的實踐:Semantic Kernel - Plugins開發篇- Native Function 多參數傳遞
下一篇
Semantic Kernel的實踐:Semantic Kernel - 認識 Connector連接器
系列文
OpenAI 從提示工程(Prompt Engineering)到語義核心(Semantic Kernel)的實踐30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言