前言
之前,做 ChatBot 時,收到使用者輸入,會先判斷它的意圖,
然後判斷要完成該意圖缺多少的內容,再一一地詢問使用者。
現在,透過 Semantic Kernel(SK),這些不足的資訊,可以透過ChatCompletionService
來幫我們。
以下就來看看要如何做到呢?
Agent 在 由 Semantic Kernel 中,由plugins, planners 及 persona(角色/人設) 三個核心組件組成。
這些組件是讓 Agent 能夠從使用者或其他系統獲取資訊,規劃如何使用資訊,並使用資訊來回應使用者或執行動作。
以下我們以一個幫助使用者請假的 HR Copilot 為例。
在取得使用者資訊後,Semantic Kernel 透過 ChatCompletionService
找尋要完成任務的plugins並呼叫它,
最後再將這些plugins的結果給使用者。
實作
建立 Console 程式,並加入以下套件,
1 | dotnet new console -n hragent -o hragent |
要完成這個簡單的請假計畫包含以下幾步, 1.取得請假的起、迄日期區間 2.請假假別 3.請假原因
所以我們要建立 Plugins 來讓 Agent 有請假的能力。
這個就是 Plugins 的作用,讓 Agent 增加技能。
所以就建立 LeavePlanner
類別,
裡面有 ApplyLeaveAsync
處理請假,ParseTimeRange
處理上/下午
時間區間,
Function 要設定 KernelFunction
,Description
也要寫清楚,
這樣 ChatCompletionService
才可以找得到它,如下,
1 | using Microsoft.SemanticKernel; |
接著將這些 Plugins 載入進來,並讓 Semantic Kernel 可以依語義自動去執行它們,
以下是 Program.cs
的程式碼,
1 | using Microsoft.Extensions.DependencyInjection; |
我們的 Agent 有了請假功能,所以將程式跑起來,
輸入我明天下午要到UUU訓練中心上 Azure AZ-900 課程,所以要請公假
,ChatCompletionService
會將明天
呼叫TimePlugin_Today
Function 解析出2024/1/5
,如下,
因為有下午,所以會呼叫ParseTimeRange
取得13:00~17:30
時間區段,
有了時間、假別、原因,就可以呼叫ApplyLeaveAsync
來進行請假,
所以最後 Agent 就會回,已請假完成等 Summary 的資訊,如下,
另一個範例,
以往我們通常會先將使用者的要求,找出它的意圖,及相關資訊,不足地方則程式控制來詢問使用者,
例如使用者只說我要請假,那程式則將必填的欄位透過程式一個一個詢問使用者。
ChatCompletionService
是透過語義的方式自動尋找可完成的Planner
並搭配許多Plugins
來完成使用者的要求,
如果使用者給的訊息,缺少 Function 需要的參數,則是由 Agent 自動詢問使用者取得來完成工作。
雖然這種方式很方便,但是透過 GPT 來整理相關的訊息會花費較長時間,
因為它將要將目前的ChatHistory
做整理。
參考資源
What is an agent?
plugins
planners
一人計,不如百人算:集合外數人的意見,可成客觀而有系統的結論(三個臭皮匠,湊個諸葛亮)。