前言
在之前的章節中我們或多或少的已經接觸到了 Semantic Kernel
的 Plugins
,本章我們講詳細介紹如何使用外掛。
Semantic Kernel
的一大特點是擁有強大的外掛,透過結合自定義/預定義的外掛解決智慧業務的問題。讓傳統的程式碼和智慧外掛一起工作靈活地接入到應用場景簡化傳統應用向智慧化轉型的過程。
什麼是Plugins
?
我們知道LLMs
(大模型)的訓練資料和我們使用之間有時間差,還有一個問題 LLMs
對自己企業化內的知識認知有缺陷。OpenAI
透過外掛將ChatGPT
和第三方的應用程式之間進行連線,這些外掛使 ChatGPT
能夠與開發人員定義的 API
進行互動,從而增強 ChatGPT
的功能並允許有更廣泛的操作,如:
檢索實時資訊
,例如,體育賽事比分、股票價格、最新新聞等。檢索知識庫資訊
, 例如,公司文件、個人筆記等。協助使用者進行相關操作
,例如,預訂航班、公司內預定會議、訂餐等。
Semantic Kernel
遵循OpenAI
的外掛的外掛規範,可以很方便地接入和匯出外掛(如基於Bing, Microsoft 365
,OpenAI
的外掛),這樣可以讓開發人員很簡單地呼叫不同的外掛服務。除了相容OpenAI
的外掛外,Semantic Kernel
內也有屬於自己外掛定義的方式。不僅可以在規定模版格式上定義 Plugins
, 更可以在函式內定義 Plugins
.
從高層次上理解外掛是一組可以公開給 AI
應用程式和服務的功能。
外掛要提供在語義上描述其行為方式的詳細資訊,從函式的輸入、輸出到副作用,一切都需要以 AI
可以理解的方式進行描述.
定義外掛
在 Semantic Kernel 中定義 Plugins 外掛有兩種方式,第一種是透過模版定義外掛也叫Semantic Plugins
(語義外掛),第二種是透過函式建立外掛也叫 Native Plugins
(本地外掛)
Sermantic Plugins
透過模版定義外掛
我們知道可以透過Prompts
(提示詞工程)可以和LLMs
進行對話,我們在處理一系列特定業務過程中,可能不止一個Prompts
,可能是一組Prompts
的集合。我們可以把這些針對業務能力的Prompts
集合放到Semantic Kernel
的外掛集合內。
模版格式
在 Semantic Kernel
模版定義格式有固定的格式,Prompts
(提示詞)都放在 skprompt.txt
檔案內,而相關引數設定都放在 config.json
檔案內,檔案結構參考如下圖
const string ConfigFile = "config.json";
const string PromptFile = "skprompt.txt";
這些都是在
SK
寫死的配置,所以外掛內的命名一定要遵循這個規則!
|-plugins
|-Prompts
|-Translator
|-skprompt.txt
|-config.json
|-WriterPlugins
|-Joke
|-skprompt.txt
|-config.json
|-ShortPoem
|-skprompt.txt
|-config.json
skprompt.txt
我們先來看看 skprompt.txt
的定義,這裡一般是放置和業務相關的 Prompt
,可以支援多個引數,每個引數都放置在 {{$引數名}}
內,如以下格式:
Translate {{$input}} into {{$language}}
在之前的章節我們介紹過這是SK
裡 TemplateFormat
的預設格式"semantic-kernel"
config.json
這是配置相關的內容,隨了設定和 LLMs
相關的引數外,你也可以設定輸入的引數以及相關描述
{
"schema": 1,
"description": "Translate sentenses into a language of your choice",
"execution_settings": {
"default": {
"max_tokens": 2000,
"temperature": 0.7,
"top_p": 0.0,
"presence_penalty": 0.0,
"frequency_penalty": 0.0,
"stop_sequences": ["[done]"]
}
},
"input_variables": [
{
"name": "input",
"description": "sentense to translate",
"default": ""
},
{
"name": "language",
"description": "Language to translate to",
"default": ""
}
]
}
這其實就是對PromptTemplateConfig
提示詞模版配置類的 json
資料,最後在 SK
內會被反序列化到物件內。
// Load prompt configuration. Note: the configuration is optional.
var configPath = Path.Combine(functionDirectory, ConfigFile);
var promptConfig = File.Exists(configPath) ?
PromptTemplateConfig.FromJson(File.ReadAllText(configPath)) :
new PromptTemplateConfig();
之前我們對PromptTemplateConfig
類進行過詳細的講解,不熟悉的可以看看深入學習 Semantic Kernel:建立和配置 prompts functions。
從解決方案的角度看一下配置的目錄圖
註冊 Semantic Plugins
要從 Semantic Kernel
中要實現Semantic Plugins
模板化外掛的註冊,需要KernelExtensions
類中的CreatePluginFromPromptDirectory
擴充套件方法。
再開始之前在我們程式碼的解決方案Plugins
資料夾下對每一個skprompt.txt
和config.json
進行生成設定
核心程式碼
var kernel = Kernel.CreateBuilder()
.AddAzureOpenAIChatCompletion(config.ModelId, endpoint: config.Endpoint, apiKey: config.ApiKey)
.Build();
//註冊外掛
string folder = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Plugins");
kernel.ImportPluginFromPromptDirectory(folder);
string[] pluginNames = ["Prompts", "WriterPlugins"];
foreach (var pluginName in pluginNames)
{
kernel.ImportPluginFromPromptDirectory(Path.Combine(folder, pluginName));
}
//測試從外掛獲得funciton
var jokeKernelFunction = kernel.Plugins.GetFunction("Prompts", "Translator");
Console.WriteLine("System: 請輸入要翻譯的內容");
var userResuest = Console.ReadLine();
Console.WriteLine("System: 請輸入要翻譯的語言語種");
var language = Console.ReadLine();
var results = await jokeKernelFunction.InvokeAsync(kernel, new KernelArguments()
{
{"input", userResuest},
{"language", language}
});
Console.WriteLine($"Assistant: {results.ToString()}");
外掛名稱約定
ImportPluginFromPromptDirectory
這個方法在註冊外掛過程中如果沒有指定外掛名字會預設用資料夾名稱
pluginName ??= new DirectoryInfo(pluginDirectory).Name;
輸出
System: 請輸入要翻譯的內容
User: 那麼近那麼美週末去河北
System: 請輸入要翻譯的語言語種
User: 英文
Assistant: So close, so beautiful, go to Hebei for the weekend.
最後
本章我們詳細介紹瞭如何使用 Semantic Kernel
的外掛功能,包括外掛的概念、定義外掛的兩種方式(Semantic Plugins 和 Native Plugins)、以及如何註冊和呼叫 Semantic Plugins。透過外掛,我們可以擴充套件 ChatGPT
的功能,使其能夠與第三方應用程式進行連線,實現更廣泛的操作和服務。
透過註冊外掛並呼叫相應函式,我們可以實現諸如翻譯、笑話生成等功能。在下一篇中,我們將關注 Native Plugins
原生函式外掛的介紹。
參考文獻
- 開啟大模型的技能之門 - Plugins
- Understanding AI plugins in Semantic Kernel
示例程式碼
本文原始碼