到目前為所寫的Native Function都是只有一個參數的,但現實場景中多個參數的運用是很常見的需求,本篇內容就來介紹如何建立與使用多參數的Native Function。
範例採用C#程式語言,並以主控台應用程式做為示範,使用的是.net 7.0。
此外GPT模型使用的是Azure OpenAI GPT-4,事實也可以依需求改用OpenAI服務,而模型也可以改用GPT-3.5。
至目前為止本系列文中的範例皆採用Microsoft.SemanticKernel套件,版號為0.24.230918.1-preview,然而下週Semantic Kernel預計會正式發行1.0版,因此後面文章若遇到1.0版發行,則會直接使用1.0版,而前面文章的範例,也會另行找時間更新,github上的程式碼也會同時更新。
[SKFunction, Description("根據客戶代碼及區域,取得客戶連絡人")]
public string GetCustomerContactV2(SKContext context)
{
//撰寫從CRM DataBase 取得客戶連絡人資料邏輯
//do something
return $"{context.Variables["CusCode"]}-{context.Variables["Area"]} 居匹踢";
}
你是一位行政助理,負責處理我所交辧的文書作業任務
現在,請幫我寫一封信給
"""
{{CrmPlugin.GetCustomerContactV2}}
"""
內容是下星期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",
["Area"] = "KH"
};
var result = await kernel.RunAsync(contextVars, writePlugin["Email2"]);
觀看SKContext的建構子,在產生SKContext物件時需要ContextVariables參數,因此可以知道當native function被調用時,所注入的SKContext物件會包含所有的傳送到function的參數
public SKContext(
ContextVariables? variables = null,
IReadOnlySkillCollection? skills = null,
ILoggerFactory? loggerFactory = null)
{
this.Variables = variables ?? new();
this.Skills = skills ?? NullReadOnlySkillCollection.Instance;
this.LoggerFactory = loggerFactory ?? NullLoggerFactory.Instance;
this._culture = CultureInfo.CurrentCulture;
}
範例原始碼 : https://github.com/iangithub/sklearn/tree/main/MixSemanticFunAndNativeFun
本篇探討如何為Native Function 實現傳送多參數的機制,這個機制的核心關鍵就在SKContext 物件。當Native Function被調用時,會自動注入SKContext 物件,而此物件會包含所有由ContextVariables物件配置的參數值,因此便能實現多參數的傳送。下一篇將介紹semantic kernel內建開箱即用的Plugins。
嗨,我是Ian,我喜歡分享與討論,今年跟2位朋友合著了一本ChatGPT主題書,如果你是一位開發者,這本書或許會有些幫助,https://www.tenlong.com.tw/products/9786263335189
這次的鐵人賽文章也會同時發佈於個人blog,歡迎關注我的blog : https://medium.com/@ianchen_27500