案例研究 - 讓客服 AI 更聰明
讓客服 AI 更聰明
用戶描述不清楚問題?Asgard的設計小技巧讓您可以引導用戶問對問題,讓客服AI更聰明。
- Step 1:Retrieve Knowledge 將歷史對話紀錄用於檢索知識庫
- Step 2:Router 是否有相似問題
- Step 3:LLM Completion & Push Message 有相似問題的流程引導及追問
- Step 4:Push Message 應用 quickReplies
- Step 5:Update Context 產生固定的追問問題與選項
- Step 6:預覽 Bot
Step 1:Retrieve Knowledge 將歷史對話紀錄用於檢索知識庫
先將原本Else接續的Push Message刪除,並新增Retrieve Knowledge以便將歷史對話紀錄用於檢索知識庫。
- Knowledge Base 選擇第一步時建立並匯入好檔案的知識庫,或是可以點擊「Add」以新增知識庫設定,注意知識庫內記得匯入檔案。
- Text Query 用於檢索的關鍵字句,此處使用Asgard內建的函數history。
(() => {
// return the result of the expression
return history (historyStart, -1);
})()
- Similarity Threshold 填入0~1之間的數字,1代表最相似,以此遞減。範例使用0.1這個數值,因為用戶的問題相關性可能不高,因此選用0.1這個數值。
- Max Results 最多回覆幾筆,可以根據資料量與筆數來判斷,範例使用10表示最多回覆10筆。
- Result Field 儲存結果的變數陣列,範例使用relatedFaqs來儲存。
- Filter Tag 可以過濾增強的Tag。
- Sample K 預設20。
Step 2:Router是否有相似問題
加上Router來判斷是否有Retrieve Knowledge的結果。
- 假如失敗沒有結果,提示沒有結果並將用戶導向固定追問的流程。
- 假如有相似問題,加上LLM Completion來處理。
Router 新增一個Router依據If, Else等條件來決定工作流程執行的路徑。
- 新增Case 1 條件名稱可以自訂,此處改成「有相似問題」來幫助識別。選擇Expression並輸入以下範例:
(() => {
// return the result of the expression
return relatedFaqs.nodes.length > 0;
})()
Step 3:LLM Completion & Push Message 有相似問題的流程引導及追問
LLM 呼叫LLM來判斷用戶輸入的問題。此處為了讓AI能夠處理更複雜的情境,需要設計AI的角色、任務等讓AI能夠以期望的方式來回應用戶,此處的Prompt為參考範例,定義了AI的角色與要執行的工作。
- Completion Model 選擇已經設定好的大型語言模型,或是可以點擊「Add」以新增Completion Model設定。
- Prompt 選擇Template(Advance)並輸入以下範例請求AI:
你在一間叫做『Asgard酒店』的連鎖飯店集團擔任服務台客服助手,負責與客戶對話並引導客戶來發問有關於Asgard酒店的相關問題。
由於客戶的提問還很發散且不符合任何既有的問題情境,因此你要開始試圖回應客戶,並釐清客戶客戶究竟想要問什麼問題。
由於你只能引導客戶來提問『Asgard酒店FAQ知識庫』裡的問題,因此如果客戶的提問跟FAQ知識庫裡的問題完全不相關時,此時務必要透過禮貌的回應將話題拉回到詢問客戶有哪方面的問題需要解決,不要回答跟飯店服務無關的事情,也不要讓客戶有機會繼續問一些跟飯店服務無關的事。
* 這是你跟客戶的對話紀錄:
```
{{{history historyStart -1}}}
```
* 這是『Asgard酒店FAQ知識庫』:
```
{{{toJson relatedFaqs}}}
```
history 為 Asgard 內建函數,historyStart
為先前在 Update Context
裡所新增的變數,-1
是指算到上一個對話為止,因此這裡是在告訴LLM用戶的歷史對話紀錄是從historyStart到上一個對話,也就是上一步的Listen Message用戶輸入的問題。
toJson
是 Asgard 內建函數,由於 relatedFaqs
是陣列,此處使用 toJson
將 relatedFaqs 轉成 JSON。
- Output Schema
multipleChoiceAnswers 根據『Asgard酒店FAQ知識庫』中的 FAQ 問題,提供 1 ~ 3 個答案
multipleChoiceQuestion 提供 1~3 個問題
{
"type": "object",
"required": [
"hasMatched"
],
"properties": {
"multipleChoiceAnswers": {
"type": "array",
"description": "請根據『Asgard酒店FAQ知識庫』中的FAQ問題,提供1 ~ 3 個答案,讓客戶能夠更快速的來回答multipleChoiceQuestion。客戶將來會透過選擇其中一個選項,來讓你更了解他的請求是否正在詢問一些跟飯店相關的問題。例如: 飯店住宿可以累積點數嗎?、如果我住宿時到餐廳用餐,可以累積點數嗎?、我可以更改個人資料嗎?。請注意由於你只懂得『Asgard酒店FAQ知識庫』裡的知識,因此請不要產生與『Asgard酒店FAQ知識庫』內容無關的選項。",
"items": {
"type": "string"
}
},
"multipleChoiceQuestion": {
"type": "string",
"description": "請用活潑的語氣回應客戶,回應的最後,請問出一句選擇題來引導客戶,以便能夠釐清客戶在使用飯店服務時究竟 遇到了什麼問題,你會預期當客戶回答了此一單選題之後,你能更加確定客戶碰到的的問題是什麼。"
}
}
}
詳細 JSON Schema 寫法,請參考 JSON Schema
- MaxTokens 設定消耗 Token 上限,此處選擇
Literal
類型並填入4096
。Token上限請依據選用的模型支援的範圍去設定,此處僅為範例。 - 儲存設定
Step 4:Push Message 應用 quickReplies
將LLM生成的內容使用Push Message的Message Template印出來。
- Message選擇Expression的類型,並輸入底下範例
(() => {
// return the result of the expression
return multipleChoiceQuestion;
})()
- Optional: 可以將 Processor 的 Description 改成容易識別的描述幫助工作流程的編排易讀性,例如改成「追問」
- Template 選擇 Expression 的類型,並輸入底下範例:
quickReplies 為物件,每個物件內都有一個 text 的欄位,因此需要將 multipleChoiceAnswers 使用 map 轉成物件與對應欄位。
(() => {
// return the result of the expression
return {
type: "TEXT",
text: multipleChoiceQuestion,
quickReplies: multipleChoiceAnswers.map(a => ({ text: a }))
};
})()
- 儲存設定
將 Push Message 的 Success 連接到聆聽問題的 Listen Message 即可。
Step 5:Update Context 產生固定的追問問題與選項來處理 Else 條件
若無相似的問題,可以藉由產生固定的追問問題與選項來處理。
multipleChoiceQuestion
- 屬性點擊「+」新增一個空白的變數
- 命名為 multipleChoiceQuestion
- Type 請選 Literal 並輸入以下範例。
很抱歉,無法回答此問題,如果有關於飯店的相關問題再請不吝指教
multipleChoiceAnswers
- 屬性點擊「+」新增一個空白的變數
- 命名為multipleChoiceAnswers
- Type 請選
Expression
並輸入以下範例。 - Optional: 可以將 Processor 的
Description
改成容易識別的描述幫助工作流程的編排易讀性,例如改成「產生固定的追問問題與選項」
(() => {
// return the result of the expression
return [
"我可以更改個人資料嗎?",
"兌換券在哪邊兌換?",
"餐廳的消費全部都能累積點數嗎?"
];
})()
- 儲存設定
將 Update Context 連接到產生追問的 Push Message 即可。
Step 6:預覽 Bot
點擊 Preview
來預覽,測試用戶輸入與飯店服務不相關的問題時,客服 AI 可以順著用戶的問題回覆,並生成相關追問選項讓用戶可以點擊相似問題並繼續使用。