前言
在探索 Semantic Kernel 在客服 ChatBot 中的應用中,
提供一個Plugin
並設定ToolCallBehavior.AutoInvokeKernelFunctions
,
Semantic Kernel 就會自動依使用者意圖幫我們收集使用者的資訊並呼叫Plugin
,
直到完成使用者的問題。為什麼它會如此聰明呢? 就讓我們深入了解一番 …
OpenAI Function calling 機制
OpenAI Function calling的功能,
可以判斷使用者的問題來決定是否要呼叫訊息中提供的Functions,例如,
1 | { |
如果需要呼叫某個Function則會回傳要呼叫該Function的內容(Function Name 及 參數),例如,
1 | { |
- 註:因為要 Call Function,所以 message 中的
content
的值為null
如果Function所需的參數沒在上述對話記錄中,Open AI 則會回問題跟使用者取得資料。
當我們收到 Open AI 需要我們呼叫Function的資訊,
我們的程式就去執行該Function並帶入參數,
取得結果後,將該結果加到對話記錄之中,
再讓 Open AI 判斷需要再執行別的Function或是將總結給使用者,例如,
1 | { |
最後 OpenAI 判斷不需要再呼叫Function,就將結果回傳給使用者,例如,
1 | { |
ToolCallBehavior.EnableKernelFunctions
以下我們設定ToolCallBehavior.EnableKernelFunctions
來看OpenAI Function calling的過程,
1.建立 Semantic Kernel ,並載入TimePlugin
Plugin
1 | var chatDeploymentName = "aoai的 chat model,例如 gpt4-32k"; |
2.設定對話流程
先將systemMessage
寫到對話記錄之中,並依對話過程來加入ChatHistory chatMessages
之中
1 | IChatCompletionService chatCompletionService = kernel.GetRequiredService<IChatCompletionService>(); |
3.處理 OpenAI 回傳的結果
設定ToolCallBehavior
為ToolCallBehavior.EnableKernelFunctions
,
取得 OpenAI 回傳的結果,來判斷需要呼叫Function與否,
1 | private async Task<ChatMessageContent> GetEndResult(ChatHistory chatMessages, Kernel kernel) |
每次呼叫完Function後,就將結果加入chatMessages
(角色為:Tool
),
最後要加上讓 OpenAI 判斷還有無需要呼叫Function,
沒有的話,就將結果傳回給 OpenAI 進行總結,回覆給使用者。
測試結果如下,
- 註:以下為使用 SK 版本
1 | Microsoft.SemanticKernel 1.6.3 |
參考資源
OpenAI Function calling
探索 Semantic Kernel 在客服 ChatBot 中的應用
一爭二醜,一讓二有: 人與人之間,若能彼此謙讓,則雙方可以得益;遇事斤斤計較,則不僅雙方受到損失,更為別人製造機會。