案例研究 - 應用知識庫 Part 2
應用知識庫 Part 2
在上一章節,我們建立了一個可以去應用知識庫的飯店 AI 客服,但是假如遇到 AI 找不到回答的情境時,應該要如何處理呢?本章我們延續上一章節繼續完善應用知識庫的飯店 AI 客服。
- Step 1:Router 判斷路徑
- Step 2:Push Message 顯示無結果的路徑
- Step 3:Update Context 清除歷史對話
- Step 4:Exit & Entry 讓用戶回到情境判斷
- Step 5:Stream LLM Completion Message 有結果的路徑處理
- Step 6:預覽 Bot
- Step 7:移除確認用的 Push Message
Step 1:Router 判斷路徑
刪除第五步的 Push Message
並加上 Router
來判斷是否有 Retrieve Knowledge
的結果。
- 假如失敗沒有結果,提示沒有結果並讓用戶回到情境判斷的
Listen Message
。 - 假如有結果,加上Stream LLM來回答。
Router 新增一個 Router 依據 If
、Else
等條件來決定工作流程執行的路徑。
- 新增Case 1 條件名稱可以自訂,此處改成
「有結果」
來幫助識別。選擇Expression
並輸入以下範例:
(() => {
// return the result of the expression
return faqs.nodes.length > 0;
})()
Step 2:Push Message 顯示無結果的路徑
在 Router 的 Else 出口
,新增一個 Push Message
來表達無結果時要顯示給用戶看的訊息。
- Message 選擇
Literal
的類型並輸入文字訊息例如「很抱歉,關於這個問題所知有限,暫時無法回答。」
- Optional: 可以將
Processor
的Description
改成容易識別的描述幫助工作流程的編排易讀性,例如改成「表達無結果」 - 儲存設定
Step 3:Update Context 清除歷史對話
接續 Push Message 後面新增一個 Update Context 的 Processor 來幫助我們清除歷史對話訊息。
- 屬性點擊
「+」
新增一個空白的變數 - 命名為 historyStart
- Type 請選
Expression
並輸入以下範例。 - Optional: 可以將
Processor
的Description
改成容易識別的描述幫助工作流程的編排易讀性,例如改成「清除歷史對話」 - 儲存設定
(() => {
// return the result of the expression
return historySize();
})()
historySize 為 Asgard 內建函數,historyStart
為先前在 Update Context
裡所新增的變數,historySize
是指訊息的總量,每一則訊息都會記算一筆,算到上一個對話為止,因此這裡是將 historyStart
更新為 historySize
,讓 AI 從新一輪的對話開始。
計數 | 訊息0 | 訊息1 | 訊息2 |
---|---|---|---|
對象 | bot | user | bot |
內容 | welcome | 今天天氣如何 | 很抱歉,關於這個問題所知有限,暫時無法回答。 |
Step 4:Exit & Entry
Exit
在 Update Context 後新增 Exit
並修改名稱與描述為「返回情境(直接聽取)」
。此時的 Exit 會作為接續其他工作流程的傳送點。
Entry
回到飯店 QA 的 Workflow 並新增一個進入點,可直接點擊上方的飯店QA回到 Workflow Sets
選取或是使用頂端列的選單切換,新增後修改名稱與描述為「直接聽取進入點」
,並將該節點連接到 Listen Message
。
將 Exit
與 Entry
連接便完成了 AI 找不到回答的流程處理,並能將用戶導向到先前設計的 Listen Message
去聆聽用戶問題並判斷是否為客服情境。
Step 5:Stream LLM Completion Message 有結果的路徑處理
接著來處理AI有找到結果的流程,此時我們希望AI可以像人一樣自然的回答用戶的問題,而不是像網頁搜尋一樣直接把搜尋結果列出來,此時需要呼叫大型語言模型並產生串流式的自然語言輸出(Stream LLM Completion Message)。
- Completion Model 選擇已經設定好的大型語言模型,或是可以點擊
「Add」
以新增 Completion Model 設定。 - Prompt 選擇
Template(Advance)
並輸入以下範例請求 AI:
你是飯店的客服助手,負責根據客戶的提問,到FAQ知識庫找尋相關文章,然後在確認FAQ知識庫中有客戶需要的答案以後,回答客戶的問題。
* 請注意,FAQ知識庫內的文章也有可能都不符合客戶的問題,此時也請誠實有禮貌的告訴客戶你並不知道答案。
* 這是你跟客戶的對話紀錄:
```
{{{history historyStart -1}}}
```
* 這是你從FAQ知識庫搜尋到的相關結果:
```
{{{toJson faqs}}}
```
Prompt 的設計很重要,此處我們讓 AI 能夠依據知識庫誠實回答用戶問題而不是胡亂回答。
toJson
是 Asgard 內建函數,由於 faqs 是陣列,此處使用 toJson 將 faqs 轉成 JSON。
- MaxTokens 設定消耗 Token 上限,此處選擇 Literal 類型並填入
4096
。Token 上限請依據選用的模型支援的範圍去設定,此處僅為範例。 - 儲存設定
- 將 Stream LLM Completion Message 接到第三步的 Update context
Step 6:預覽 Bot
至此我們將客服 AI 做了更完善的改良,客服 AI 除了能判斷是否為客服情境之外,還能搜尋知識庫內的知識做出自然語言的回應。點擊 Preview
來預覽並測試以下情境:
測試
測試一:非客服情境
測試二:是客服情境且知識庫有結果
測試三:是客服情境但知識庫無結果
Step 7:移除確認用的 Push Message
由於工作流程已能按照期望的流程執行,我們可以將確認用的 Push Message 節點
移除,保持客服 AI 回答時的畫面簡潔。
移除Retrieve Knowledge前的Push Message
將 LLM Completion
與 Retrieve Knowledge
連結起來即可。
此時再次預覽可以看到更簡潔的對話回覆。
▶️ 下一步
本章節我們完成了處理兩種以上路徑的工作流程,並加入了接續其他工作流程的傳送點功能,讓客服 AI 可以連續回答用戶的問題,且可以誠實的根據匯入的知識去回答。
接下來會介紹情境脫離的應用技巧,讓客服 AI 可以處理更複雜的工作流程。