案例研究 - 情境脫離
情境脫離
通常自然語言的對話,經常會出現上下文相關的連續對話,而不是單純的一問一答即完成,此時,需要藉由情境脫離的設計技巧來幫助判斷是否為延續上一問題的對話情境,假如判斷為是的話,應該要持續處理用戶上下文相關的問題並回答。
- Step 1:Listen Message 回答後的聽取
- Step 2:LLM Completion 判斷是否上下文相關
- Step 3:Router 決定執行路徑
- Step 4:Update Context 清除歷史對話留最後一句
- Step 5:Exit & Entry 讓用戶回到情境判斷
- Step 6:預覽 Bot
Step 1:Listen Message 回答後的聽取
先將原本回答後接到 Update Context 的連接線刪除,有兩種方式可以刪除連接線:
方法一:點擊該連接線並使用鍵盤刪除
方法二:點擊Stream LLM Completion Message並在Next Step裡將接續的節點刪除即可。
新增一個 Listen Message 來作為回答後的聽取。節點的描述可以改成「回答後的聽取」方便識別工作流程。
將剛剛新增的 Listen Message 與 Stream LLM Completion Message 的 Success 連接起來。
Step 2:LLM Completion 判斷是否上下文相關
LLM 呼叫 LLM 來判斷用戶輸入的問題。此處為了讓 AI 可以理解是接續的對話,特別設計用「昨天」跟「今天」來作為上下文相關的描述。
- Completion Model 選擇已經設定好的大型語言模型,或是可以點擊
「Add」
以新增 Completion Model 設定。 - Prompt 選擇
Template(Advance)
並輸入以下範例請求 AI:
你是飯店的客服助手,昨天客戶問你: `{{{question}}}`,而你已經回答了他。
今天客戶又來了,剛剛他說: `{{{prevMessage}}}`。
* 你的任務是判斷客戶今天和昨天詢問的事情,是否具有上下文相關性。
* 這是你跟客戶的完整對話紀錄:
```
{{{history historyStart -1}}}
```
history為 Asgard 內建函數,historyStart 為步驟 2 時在 Update Context 裡所新增的變數,-1
是指算到上一個對話為止,因此這裡是在告訴LLM用戶的歷史對話紀錄是從 historyStart
到上一個對話,也就是上一步的 Listen Message
用戶輸 入的問題。prevMessage也是 Asgard 內建函數,即為前一個對話。
- Output Schema 規範 AI 輸出結構化資料的格式,新增一個布林值的欄位
「isContextuallyRelevant」
來判斷使用者正在詢問的問題是否上下文相關,並加上description
方便識別,範例中「true 表示使用者正在詢問的問題上下文相關」,反之亦然。
{
"type": "object",
"properties": {
"isContextuallyRelevant": {
"type": "boolean",
"description": "true 表示使用者正在詢問的問題上下文相關"
}
},
"required": [
"isContextuallyRelevant"
]
}
詳細 JSON Schema 寫法,請參考JSON Schema
- MaxTokens 設定消耗 Token 上限,此處選擇
Literal
類型並填入4096
。Token上限請依據選用的模型支援的範圍去設定,此處僅為範例。 - 儲存設定
Step 3:Router 決定執行路徑
加上 Router 來處理不同路徑的結果。
- 假如非上下文相關,將歷史對話清除並保留最後一句話讓用戶回到飯店 QA 的直接判斷進入點接續 LLM Completion 來判斷是否為客服情境。
- 假如上下文相關,則直接將歷史對話訊息全數放到 LLM Completion 生成關鍵字去搜尋知識庫的回答。
Router 新增一個 Router 依據 If, Else 等條件來決定工作流程執行的路徑。
- 新增Case 1 條件名稱可以自訂,此處改成
「上下文相關」
來幫助識別。選擇Expression並輸入以下範例:
(() => {
// return the result of the expression
return isContextuallyRelevant;
})()
Step 4:Update Context 清除歷史對話留最後一句
接續 Router 的 Else 後面新增一個 Update Context 的 Processor 來幫助我們清除歷史對話留最後一句訊息作為情境判斷用。
- 屬性點擊
「+」
新增一個空白的變數 - 命名為
historyStart
- Type 請選
Expression
並輸入以下範例。 - Optional: 可以將
Processor
的Description
改成容易識別的描述幫助工作流程的編排易讀性,例如改成「清除歷史對話留最後一句」 - 儲存設定
(() => {
// return the result of the expression
return historySize() - 1;
})()
historySize為 Asgard 內建函數,historyStart 為先前在 Update Context
裡所新增的變數,historySize
是指訊息的總量,每一則訊息都會記算一筆,算到上一個對話為止,因此這裡是將 historyStart
更新為 historySize -1
,即為最後一則對話。
Step 5:Exit & Entry 讓用戶回到情境判斷
Exit
在 Update Context 後新增 Exit
並修改名稱與描述為「返回情境(直接聽取)」
。此時的 Exit 會作為接續其他工作流程的傳送點。
Entry
回到飯店 QA 的 Workflow 並新增一個進入點,可直接點擊上方的飯店 Q A回到 Workflow Sets 選取或是使用頂端列的選單切換,新增後修改名稱與描述為「直接聽取進入點」
,並將該節點連接到 Listen Message。
將 Exit 與 Entry 連接便完成了 AI 找不到回答的流程處理,並能將用戶導向到先 前設計的 Listen Message 去聆聽用戶問題並判斷是否為客服情境。
Step 6:預覽 Bot
至此我們將客服 AI 做了情境脫離,客服AI能判斷是否為客服情境並搜尋知識庫內的知識做出自然語言的回應,假如用戶後續文題為上下文相關的話,客服AI能夠脫離情境,接續該問題回答。假如上下文不相關的話,客服AI能夠回到直接判斷的進入點,並判斷最後一則訊息是否為客服情境範圍,若不是客服情境則會出現非客服。
點擊 Preview 來預覽並測試以下情境: