本篇要來介紹在Semantic Kernel裡,如果要依序執行多個semantic function並且共享上下文,該如何進行?這樣的需求會滿常見的,舉例來說,我需要ChatGPT先幫忙修飾文本內容,接著再把修飾後的文本進行翻譯處理,所以程序就會變成第2個步驟必須依賴第1個步驟生成的結果。
範例採用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上的程式碼也會同時更新。
semantic kernel內有個很特別的變數名為"input",這個變數允許我們將一個semantic function的輸出做為下一個semantic function的輸入,因此如果要依序執行多個semantic function並且共享上下文,就可以利用這個特殊變數來達成。
你是一位facebook小編,撰寫下列主題的貼文,內容200個字以內,#zh-tw
{{$input}}
第二個semantic function的skprompt
翻譯下列內容成為英文,並輸出原始中文資料及翻譯後的英文資料都要顯示出來,中英文內容分隔2行
{{$input}}
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");
//叫用GPT模型等得生成結果
var result = await kernel.RunAsync(new ContextVariables("ChatGPT對校園教育的衝擊")
, plugin["FacebookPoster"]
, plugin["Translate"]);
範例原始碼 : https://github.com/iangithub/sklearn/tree/main/ChainSemanticFunc
本篇透過kernel.RunAsync方法搭配input變數,實現依序執行semantic function並且共享上下文的應用情境。而這也是semantic kernel帶給開發者的優勢,透過semantic kernel已架構的模式,便可以輕鬆實現實務開發上面對的通用需求。
嗨,我是Ian,我喜歡分享與討論,今年跟2位朋友合著了一本ChatGPT主題書,如果你是一位開發者,這本書或許會有些幫助,https://www.tenlong.com.tw/products/9786263335189
這次的鐵人賽文章也會同時發佈於個人blog,歡迎關注我的blog : https://medium.com/@ianchen_27500