Semantic Kernel做為一個SDK,除了提供一個標準化的開發模式之外,也針對一些常用功能提供內建已標準化的Plugins,這些Plugins稱為開箱即用的Plugins,有助於增強Semantic Kernel能力,畢竟多數的開發者都希望有很多現成的套件或功能,能直接套用。本篇就來介紹至目前為止Semantic Kernel提供了哪些內建的Plugins。
由於Semantic Kernel支援不同程式語言,因此現行內建的Plugins在不同程式語言支援程式度並不相同,下表是來自官方文件,做為一個以 .net 為出發的SDK,可以發現C#版本通常是優先提供,完善度最高的
( 來源: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
要知道內建的Plugin提供哪些功能,以目前的變化來說,通常文件都更新的比較慢,而Semantic Kernel做為一個開源的SDK,好處就是我們隨時可以從github上查看,例如:
[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驅動風險是較高的。
using Microsoft.SemanticKernel.Plugins.Core;
注意:semantic kernel 1.0版將Skill更名為Plugin,因此正式版本的命名空間是Microsoft.SemanticKernel.Plugins.Core,而非目前官方文件上的Microsoft.SemanticKernel.CoreSkills
kernel.ImportFunctions(new FileIOPlugin(), "fileplugin");
注意:semantic kernel 1.0版將Skill更名為Plugin,因此正式版本的寫法為kernel.ImportFunctions,而非目前官方文件上的kernel.ImportSkill
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