在前一篇文章中,探討了Semantic Functions的Inline寫法,透過Prompt Engineering的概念,展現了LLM模型的能力。然而,Inline寫法的一個明顯問題是不利於重用(reuse)。因此,在本篇中,將介紹Semantic Functions的另一種寫法,可以使用Semantic functions達到重用(reuse)的效果。
範例採用C#程式語言,並以主控台應用程式做為示範,使用的是.net 7.0。
此外GPT模型使用的是Azure OpenAI GPT-4,事實也可以依需求改用OpenAI服務,而模型也可以改用GPT-3.5。
為了實現 Semantic Functions 的重用(reuse)效果,必須對 Semantic Functions 進行結構化的調整,透過三個簡單的步驟便能完成。
例如這個範例,Plugins\WriterPlugin\FairyTales
- Plugins表示all Plugins的總目錄
- WriterPlugin表示有個"寫作"的Plugin
- 最後FairyTales則表示在"寫作"的Plugin裡,有個FairyTales童話故事的function
{
"type": "completion",
"description": "產生facebook貼文",
"completion": {
"max_tokens": 500,
"temperature": 0.2,
"top_p": 0.0,
"presence_penalty": 0.0,
"frequency_penalty": 0.0
},
"input": {
"parameters": [
{
"name": "post_subject",
"description": "貼文主題",
"defaultValue": ""
}
]
}
}
你是一位facebook小編,請使用輕鬆灰諧的語氣,撰寫下列主題的貼文,內容500個字以內,#zh-tw
###
{{$post_subject}}
###
以前一篇的few-shot範例進行改寫
var kernel = new KernelBuilder()
.WithAzureChatCompletionService(
deploy_model, // Azure OpenAI Deployment Name
aoai_Endpoint, // Azure OpenAI Endpoint
api_Key // Azure OpenAI Key
).Build();
// Import the Plugin from the plugins directory.
var pluginsDirectory = Path.Combine(System.IO.Directory.GetCurrentDirectory(), "Plugins");
var plugin = kernel.ImportSemanticSkillFromDirectory(pluginsDirectory, "WriterPlugin");
//few-shot,帶入方文山詞創作範例
string fewshot_sample = @"
竹籬上 停留著 蜻蜓
玻璃瓶裡插滿 小小 森林
青春 嫩綠的很 鮮明
百葉窗 折射的 光影
像有著心事的 一張 表情
而你 低頭拆信 想知道關於我的事情
月色搖晃樹影 穿梭在熱帶雨林
你離去的原因從來不說明
你的謊像陷阱我最後才清醒
幸福只是水中的倒影
月色搖晃樹影穿梭在熱帶雨林
悲傷的雨不停全身血淋淋
那深陷在沼澤我不堪的愛情
是我無能為力的傷心
蘆葦花開歲已寒 若霜又降路遙漫長
牆外是誰在吟唱 鳳求凰
梨園台上 西皮二黃
卻少了妳 無人問暖
誰在彼岸 天涯一方
在夢裡我醞釀著情緒
等回憶等那一種熟悉
人世間最溫柔的消息
是曾經被你擁入懷裡
";
var contextVars = new ContextVariables()
{
["fewshot_sample"] = fewshot_sample,
["post_subject"] = "ChatGPT對校園教育的衝擊"
};
var result = (await kernel.RunAsync(contextVars, plugin["FacebookPoster"])).Result;
範例原始碼 : https://github.com/iangithub/sklearn/tree/main/SerializingSemanticFunction
本篇內容說明如何對Semantic Functions進行結構化處理,經過結構化後,Semantic Functions能夠在不同的程式片段中實現重用(reuse),並且將來要調整時也會比較方便。
結構化後的Semantic functions便可以輕鬆的在各個不同的程式片段內達到重用reuse的效果,並且將來要調整時也會比較方便。下一篇系列文章,將再進一步整合開箱即用的Semantic Kernel內建的Plugins。
嗨,我是Ian,我喜歡分享與討論,今年跟2位朋友合著了一本ChatGPT主題書,如果你是一位開發者,這本書或許會有些幫助,https://www.tenlong.com.tw/products/9786263335189
這次的鐵人賽文章也會同時發佈於個人blog,歡迎關注我的blog : https://medium.com/@ianchen_27500