iT邦幫忙

2023 iThome 鐵人賽

DAY 17
0
AI & Data

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

Semantic Kernel的實踐:Semantic Kernel - Plugins開發篇 Semantic functions (Part 1)

  • 分享至 

  • xImage
  •  

前言

前一篇我們認識了Plugins以及它在Semantic Kernel裡的作用,本篇就開始動手來打造Plugins,首先來看的semantic functions,在上一篇內容有提到Plugins分成2類,分別是Semantic functions與Native functions,其中semantic functions的組成以Prompt為主,透過Prompt engineering叫LLM模型做它本身就能做的事情,像是文本生成、改寫、翻譯等文本生成的任務。

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

Inline Semantic Functions

Semantic Functions 依寫作方式有不同的做法,其中一種做法是"內嵌",做法是直接將Semantic Functions寫在單一程式內容裡,這種做法因無法在不同程式做reuse,所以通常是特定專用的情況才會採取這個寫法。(有寫過網頁的開發者,可以想像類似一段CSS或JS直接寫在某個HTML裡)。

  • 首先,同樣先建立kernel物件
var kernel = new KernelBuilder()
			 .WithAzureChatCompletionService(
			  deploy_model,   // Azure OpenAI Deployment Name
			  aoai_Endpoint, // Azure OpenAI Endpoint
			  api_Key  // Azure OpenAI Key
			 ).Build();
  • 接著寫好Semantic Functions,其實也就是個Prompt Template,這裡可以充分使用各式各樣的Prompt engineering技巧。有需要建立參數的話,可以使用{{參數名稱}}定義參數在Prompt Template裡面。

這裡有個需要注意的地方,當你只需要一個參數時,這個參數名稱請直接使用input這個變數名稱,待會後面可以直接做資料的輸入。

const string funcDefinition = @"
            你是一位facebook小編,請使用輕鬆灰諧的語氣,撰寫下列主題的貼文,內容500個字以內,#zh-tw
            ###
            {{$input}}
            ###
            ";
  • 將Semantic Functions與kernel物件做結合,這個階段除了放入剛剛定義好的Prompt Template,也包含調用GPT模型的API參數值。而skillName與functionName,則分別是Plugin名稱(新版本會改參數名稱為PluginName),而functionName則該Plugin裡的功能名稱,例如一個"WriterPlugin",具有translate,summary功能,這裡的translate,summary就functionName。最後description是用自然語言描述這個function的作用,這會使用在Semantic Kernel Planner機制,description寫的好,有助於Planner理解,在自動進行工作流安排會更精確。
var excuseFunction = kernel.CreateSemanticFunction(funcDefinition,
                skillName: "FacebookAgent", functionName: "Post",
                maxTokens: 2000, temperature: 0.2,
                description: "產生facebook貼文");
  • 最後調用Semantic Function,範例中的"ChatGPT對校園教育的衝擊"會被自動對應到Prompt Template裡的{{$input}}參數,並取得模型回應的結果
var result = await kernel.RunAsync(@"ChatGPT對校園教育的衝擊", excuseFunction);
  • 生成貼文內容
    https://ithelp.ithome.com.tw/upload/images/20231002/20126569n0KEQyvdg4.png

客制化 Semantic Functions 參數名稱

上一個範例在Prompt Template裡僅使用1個參數,而參數名稱直接使用預設名稱{{$input}},但如果想客制化的話要怎麼做?,也很簡單,這時候只需要建立ContextVariables物件就可以做的到。
直接延用上一個範例做改寫。

  • 首先Prompt Template改為其它的參數名稱
const string funcDefinition = @"
你是一位facebook小編,請使用輕鬆灰諧的語氣,撰寫下列主題的貼文,內容500個字以內,#zh-tw
###
{{$post_subject}}
###
";
  • 建立ContextVariables物件,並把Prompt Template的參數及值設定進去
var contextVars = new ContextVariables()
    {
        ["post_subject"] = "ChatGPT對校園教育的衝擊"
    };
  • 修改調用語法,將ContextVariables物件與Semantic Function物件傳入
var result = await kernel.RunAsync(excuseFunction, contextVars);
  • 生成貼文內容
    https://ithelp.ithome.com.tw/upload/images/20231002/201265697vr4a5gqe8.png

多個參數 Semantic Functions 參數+Few Shot 運用

接下來這個範例,同時示範如何在Semantic Functions使用多個參數,以及結合Few Shot 運用。同樣延續前面的範例,納入Few Shot技巧,讓模型學習寫作風格後,再依主題要求產生文案內容

  • 修改Prompt Template,置入Few Shot
const string funcDefinition = @"
你是一位facebook小編,請先思考一下下列提供的範例寫作風格
###
{{$fewshot_sample}}
###

接著撰寫下列主題的貼文,內容500個字以內,#zh-tw
###
{{$post_subject}}
###
";
  • 備妥fewshot_sample參數值
//few-shot,帶入方文山詞創作範例
            string fewshot_sample = @"
竹籬上 停留著 蜻蜓
玻璃瓶裡插滿 小小 森林
青春 嫩綠的很 鮮明

百葉窗 折射的 光影
像有著心事的 一張 表情
而你 低頭拆信 想知道關於我的事情

月色搖晃樹影 穿梭在熱帶雨林
你離去的原因從來不說明
你的謊像陷阱我最後才清醒
幸福只是水中的倒影

月色搖晃樹影穿梭在熱帶雨林
悲傷的雨不停全身血淋淋
那深陷在沼澤我不堪的愛情
是我無能為力的傷心

蘆葦花開歲已寒 若霜又降路遙漫長
牆外是誰在吟唱 鳳求凰
梨園台上 西皮二黃
卻少了妳 無人問暖
誰在彼岸 天涯一方

在夢裡我醞釀著情緒
等回憶等那一種熟悉
人世間最溫柔的消息
是曾經被你擁入懷裡
";
  • 建立ContextVariables物件,並把Prompt Template的參數及值設定進去
var contextVars = new ContextVariables()
        {
            ["fewshot_sample"] = fewshot_sample,
            ["post_subject"] = "ChatGPT對校園教育的衝擊"
        };
  • 調用取得生成結果
var result = await kernel.RunAsync(excuseFunction, contextVars);
  • 生成貼文內容
    https://ithelp.ithome.com.tw/upload/images/20231002/20126569NJaMA5y2JI.png

範例原始碼 : https://github.com/iangithub/sklearn/tree/main/InlineSemanticFunction

結語

本篇內容說明如何使用inline的方式建立Semantic functions,更運用prompt engineering 提升Semantic functions能力,然而inline的撰寫方式不利於reuse,所以接下來我們會說明如何建立便於reuse的Semantic functions。

嗨,我是Ian,我喜歡分享與討論,今年跟2位朋友合著了一本ChatGPT主題書,如果你是一位開發者,這本書或許會有些幫助,https://www.tenlong.com.tw/products/9786263335189
這次的鐵人賽文章也會同時發佈於個人blog,歡迎關注我的blog : https://medium.com/@ianchen_27500


上一篇
Semantic Kernel的實踐:Semantic Kernel - 認識 plugins
下一篇
Semantic Kernel的實踐:Semantic Kernel - Plugins開發篇 Semantic functions (Part 2)
系列文
OpenAI 從提示工程(Prompt Engineering)到語義核心(Semantic Kernel)的實踐30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言