iT邦幫忙

2023 iThome 鐵人賽

DAY 20
0
AI & Data

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

Semantic Kernel的實踐:Semantic Kernel - Plugins開發篇 Semantic Function調用Native Function

  • 分享至 

  • xImage
  •  

前言

前一篇介紹如何撰寫 Native Functions,並且示範如何在程式流程中依邏輯順序分別調用 Semantic Function與Native Function。但仍然少了那麼一點感覺,沒有達到期望的直接以Prompt輸入,LLM模型生成輸出這麼直覺,本篇就再來做個改裝唄。

範例採用C#程式語言,並以主控台應用程式做為示範,使用的是.net 7.0。
此外GPT模型使用的是Azure OpenAI GPT-4,事實也可以依需求改用OpenAI服務,而模型也可以改用GPT-3.5。

Semantic Function調用Native Function

依設情境設想

LLM模型扮演著助理角色,會自動幫我發送信件給指定的客戶

所以這裡要解決的重點有2個,其中1個是取得指定客戶的連絡人,再來就是自動生成信件內容,這2個重點分別可以交給Native Function 與Semantic Function處理:

  • Native Function:連接CRM系統取客戶的連絡人資料
  • Semantic Function:自動生成信件內容

然後關鍵點在於Native Function找到的資料,如何與Semantic Function整合,具體方式就是我們在上一篇示範的。但是並不夠好,有沒有一種方式可以在Semantic Function的Prompt裡能自動調用Native Function,這樣一來做法就變成是Prompt input 而 Generative output。

  • 首先撰寫好Native Function
public class Customer
{
    [SKFunction, Description("取得客戶連絡人")]
    public string GetCustomerContact(string cusCode)
    {
        //撰寫從CRM DataBase 取得客戶連絡人資料邏輯
        //do something
        return $"居匹踢";
    }
}
  • 接著Semantic Function,並且在Prompt裡能調用Native Function。

{{CrmPlugin.GetCustomerContact $CusCode}}是個關鍵,這段內容代表了調用CrmPlugin這個Plugin裡的GetCustomerContact 這個Native Function,而$CusCode則是傳入給Native Function的變數值,此外要注意的是CrmPlugin這個名稱必須與kernel.ImportSkill時給的名稱一致。

你是一位行政助理,負責處理我所交辧的文書作業任務
現在,請幫我寫一封信給
"""
{{CrmPlugin.GetCustomerContact $CusCode}}
"""
內容是下星期1開始我將休假1個月,有任何緊急事項,可以連繫公司代理人
  • Kernel 載入Native Function,並賦予Plugin一個名稱"CrmPlugin"(這個名稱會影響到Semantic Function的Prompt如何指定Native Function)
// Load native plugin into the kernel function collection
// Functions loaded here are available as "CrmPlugin.*"
var crmPlugin = kernel.ImportSkill(new Plugins.CrmPlugin.Customer(), "CrmPlugin");
  • Kernel 載入Semantic Function,並且配置$CusCode變數值。
 // 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"
};

  • 接著主程式直接調用Semantic Function
var result = await kernel.RunAsync(contextVars, writePlugin["Email"]);
Console.WriteLine(result);
  • 生成結果
    https://ithelp.ithome.com.tw/upload/images/20231005/20126569XKfFJTCWzd.png

範例原始碼 : 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


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

尚未有邦友留言

立即登入留言