iT邦幫忙

2023 iThome 鐵人賽

DAY 27
0

前言

前面的文章陸續介紹了Semantic Kernel的核心組成,kernel、plugins、connector、Memory,接下來本篇要來介紹最後一個組成:planner 規劃器。planner 規劃器,我個人覺得是Semantic Kernel裡很神奇的一個組成,也是最能展現智慧運行的一個能力。

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

本文以Semantic Kernel v1.0.0 Beta1版號做為教學說明

planner 規劃器

首先我們回想一下先前的範例中,除了prompt template之外,其餘的部份其實程式碼撰寫起來與過去開發其它類型的應用差不多,在程式流程中程式開發人員預先規劃使用者的所有可能操作,再按部就班排定程式流程。而Semantic Kernel裡的planner 規劃器是自動依給定的"目標",視kernel物件所具有的能力(sk function/plugins)自動規劃調用哪些function,並且順序上也是自動安排。

而planner 規劃器本身即是一個function,由於是自動規劃,因此它有可能產生不符預期的作業順序或調用不適合的function,這有很大的因素取決於所給與的"目標"prompt以及sk function裡的語義描述,因為planner 規劃器本身會根據function裡語義描述來理解該function的用途。

https://ithelp.ithome.com.tw/upload/images/20231012/20126569obXfJG4cq0.png

( 資料來源: https://learn.microsoft.com/en-us/semantic-kernel/media/the-planner.png )

實際操作演練

  • 建立WriterPlugin包含2個semantic function

https://ithelp.ithome.com.tw/upload/images/20231012/20126569OK3BDqx0ut.png

  • semantic function - FacebookPoster,負責根據主題生成facebook貼文,請注意config.json裡的description屬性是決定planner 規劃器能否正確識別function用途的唯一標示。
你是一位facebook小編,撰寫下列主題的貼文,內容200個字以內,#zh-tw

{{$input}}

{
  "schema": 1,
  "type": "completion",
  "description": "產生facebook貼文",
  "completion": {
    "max_tokens": 2000,
    "temperature": 0.2,
    "top_p": 0.0,
    "presence_penalty": 0.0,
    "frequency_penalty": 0.0
  },
  "input": {
    "parameters": [
      {
        "name": "input",
        "description": "貼文主題",
        "defaultValue": ""
      }
    ]
  }
}
  • semantic function - FacebookPoster,負責根據主題生成facebook貼文,請注意config.json裡的description屬性是決定planner 規劃器能否正確識別function用途的唯一標示。
翻譯下列內容成為英文,並輸出原始中文資料及翻譯後的英文資料都要顯示出來,中英文內容分隔2行

{{$input}}
{
  "schema": 1,
  "type": "completion",
  "description": "翻譯",
  "completion": {
    "max_tokens": 2000,
    "temperature": 0.2,
    "top_p": 0.0,
    "presence_penalty": 0.0,
    "frequency_penalty": 0.0
  },
  "input": {
    "parameters": [
      {
        "name": "input",
        "description": "要翻譯的內容",
        "defaultValue": ""
      }
    ]
  }
}
  • kernel掛上Plugins
// Import the Plugin from the plugins directory.
var pluginsDirectory = Path.Combine(System.IO.Directory.GetCurrentDirectory(), "Plugins");
kernel.ImportSemanticFunctionsFromDirectory(pluginsDirectory,"WriterPlugin");
  • 建立planner,這裡建立的是SequentialPlanner,用於包含一系列步驟的計劃,請注意:建立planner時同時給了kernel物件,表示planner後續將使用kernel物件裡所包含的能力進行程式流程的安排。
 var planner = new SequentialPlanner(kernel);
  • 建立planner目標,依目標需求建立plan
var plan = await planner.CreatePlanAsync("寫一則關於chatgpt對教育場景影響的臉書貼文,然後翻譯該則貼文為英文.");
            
  • 調用plan,取得結果
var result = await kernel.RunAsync(plan);
Console.WriteLine("Result:");
Console.WriteLine(result.GetValue<string>());

https://ithelp.ithome.com.tw/upload/images/20231012/20126569A3d0AAjv7X.png

若想知道plan內容,可以由plan.Steps取得

https://ithelp.ithome.com.tw/upload/images/20231012/20126569GSFPXYNYUL.png

Console.WriteLine("Original plan:");

foreach (var step in plan.Steps)
{
    Console.WriteLine($"step : {step.Name}");
}

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

結語

Planner用於自動化安排作業步驟,而其中的關鍵還是回歸到文字語義上,就像真實場景去早餐店點餐,而廚師會自動安排料理的過程及程序,做為消費者只需要等待最後拿到餐點即可。然而這個能力很吃重理解力,因此建議採用高階模型來搭配,例如GPT-4。此外若商業程序不容易順序出錯,則不宜使用Planner規劃器做自動化的安排,這有可能導致錯誤的結果。

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


上一篇
Semantic Kernel的實踐:Semantic Kernel v1.0.0 Beta1 變化
下一篇
Semantic Kernel的實踐:Semantic Kernel - PromptTemplateEngine
系列文
OpenAI 從提示工程(Prompt Engineering)到語義核心(Semantic Kernel)的實踐30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言