前一篇介紹如何撰寫 Native Functions,並且示範如何在程式流程中依邏輯順序分別調用 Semantic Function與Native Function。但仍然少了那麼一點感覺,沒有達到期望的直接以Prompt輸入,LLM模型生成輸出這麼直覺,本篇就再來做個改裝唄。
範例採用C#程式語言,並以主控台應用程式做為示範,使用的是.net 7.0。
此外GPT模型使用的是Azure OpenAI GPT-4,事實也可以依需求改用OpenAI服務,而模型也可以改用GPT-3.5。
依設情境設想
LLM模型扮演著助理角色,會自動幫我發送信件給指定的客戶
所以這裡要解決的重點有2個,其中1個是取得指定客戶的連絡人,再來就是自動生成信件內容,這2個重點分別可以交給Native Function 與Semantic Function處理:
然後關鍵點在於Native Function找到的資料,如何與Semantic Function整合,具體方式就是我們在上一篇示範的。但是並不夠好,有沒有一種方式可以在Semantic Function的Prompt裡能自動調用Native Function,這樣一來做法就變成是Prompt input 而 Generative output。
public class Customer
{
[SKFunction, Description("取得客戶連絡人")]
public string GetCustomerContact(string cusCode)
{
//撰寫從CRM DataBase 取得客戶連絡人資料邏輯
//do something
return $"居匹踢";
}
}
{{CrmPlugin.GetCustomerContact $CusCode}}是個關鍵,這段內容代表了調用CrmPlugin這個Plugin裡的GetCustomerContact 這個Native Function,而$CusCode則是傳入給Native Function的變數值,此外要注意的是CrmPlugin這個名稱必須與kernel.ImportSkill時給的名稱一致。
你是一位行政助理,負責處理我所交辧的文書作業任務
現在,請幫我寫一封信給
"""
{{CrmPlugin.GetCustomerContact $CusCode}}
"""
內容是下星期1開始我將休假1個月,有任何緊急事項,可以連繫公司代理人
// Load native plugin into the kernel function collection
// Functions loaded here are available as "CrmPlugin.*"
var crmPlugin = kernel.ImportSkill(new Plugins.CrmPlugin.Customer(), "CrmPlugin");
// Import the Plugin from the plugins directory.
var pluginsDirectory = Path.Combine(System.IO.Directory.GetCurrentDirectory(), "Plugins");
var writePlugin = kernel.ImportSemanticSkillFromDirectory(pluginsDirectory, "WriterPlugin");
var contextVars = new ContextVariables()
{
["CusCode"] = "C2023001"
};
var result = await kernel.RunAsync(contextVars, writePlugin["Email"]);
Console.WriteLine(result);
範例原始碼 : https://github.com/iangithub/sklearn/tree/main/MixSemanticFunAndNativeFun
本篇根據前篇的範例進行調整,讓我們整個程式內"看起來"就像ChatGPT一樣,由Semantic Function的Prompt做輸入,然後就等著輸出,而中間調用Native Function的部份則隱藏在Semantic Function的Prompt裡。前後這二篇範例的寫法,展示了在開發LLM應用時的思維,是以傳統規則方式出發,或是以Prompt方式出發,下一篇我們來看如何傳入多個參數給Native Function。
嗨,我是Ian,我喜歡分享與討論,今年跟2位朋友合著了一本ChatGPT主題書,如果你是一位開發者,這本書或許會有些幫助,https://www.tenlong.com.tw/products/9786263335189
這次的鐵人賽文章也會同時發佈於個人blog,歡迎關注我的blog : https://medium.com/@ianchen_27500