基于狀態(tài)機的聊天機器人設計經驗總結
為了更好地了解智能機器人項目的需求和改進方向,我們常常需要研發(fā)一些工具。在我參與的多個機器人項目中,大多數都能夠成功地滿足產品需求。通過這些實踐,我們深刻認識到,如果要不斷進步和提高,就必須對現有的機器人定義語言進行重大的改進。
- 簡化需要復雜對話流程的機器人的創(chuàng)建過程。
- 最大限度地提高可重用性,通過重用過去已經定義過的模塊和對話路徑來創(chuàng)建機器人
在傳統(tǒng)的做法中,完成這些并不容易,因為意圖定義與部分排序約束混合在一起,限制了對話路徑的自由度。這對于處理“開放式”機器人(常見于FAQ樣式的機器人),其中大多數問題是獨立的且始終可用的,這已經足夠了。但對于更“封閉”的機器人來說,潛在的對話限制要多得多(比如用于從在線訂票機器人)。
為了將聊天機器人定義語言的功能提升到一個新的水平,在一些項目中我們引進了更接近狀態(tài)機語義的DSL,并完全將意圖定義與控制機器人執(zhí)行定點可用意圖的轉換規(guī)則分離,這么做有以下優(yōu)勢:
- 新機器人中可以復用以前的意圖,即使設置的對話路徑不同。
- 可以使用狀態(tài)機定義復雜的對話流,讓機器人保持清晰和精確的語義。
- 可以創(chuàng)建復雜的狀態(tài)守護來控制轉換。根據用戶輸入、即將發(fā)生的事件以及之前的數據、對話參數等,將機器人移動到新狀態(tài)。
- 可以使用狀態(tài)主體來存儲復雜的對話邏輯,以響應用戶請求。
- 可以將機器人模塊化,以便在其他機器人中重用部分狀態(tài)機。
- 可以將本地回退定義為狀態(tài)行為的一部分。除了默認的全局回退,還可以將本地回退與狀態(tài)相關聯,以便在狀態(tài)上下文中處理錯誤,比如顯示一條消息,幫助用戶回答機器人在對話中的特定狀態(tài)下提出的問題。
意圖定義語言
意圖定義現在與執(zhí)行部分解耦,但仍然是一個單獨的子語言。對于每個意圖,我們只需提供一些訓練句子,讓機器人能夠識別出用戶話語的意圖,并從中提取所需的參數。
舉個例子,我們有一個簡單的機器人,它只能理解兩種類型的用戶話語:問候和陳述姓名。我們可以為每種話語類型提供幾個示例句子,讓機器人學會如何識別它們。當用戶輸入一個話語時,機器人會根據它的意圖執(zhí)行相應的操作,并從中提取所需的參數。
我們?yōu)槊糠N意圖提供一些樣本句子,來訓練機器人如何識別它們。此外,在某些情況下,我們還會在上下文中收集一些參數(例如,用戶的姓名),以便以后能夠更個性化地回答用戶。
我們還沒有具體說明機器人應該先嘗試匹配哪種意圖,這是執(zhí)行部分語言的內容。這種方法使我們能夠重復利用這些意圖(例如,在另一個機器人中,我們可能需要詢問用戶的姓名,而不僅僅是在問候意圖之后)。
執(zhí)行定義語言
使用執(zhí)行文件來定義一個狀態(tài)機,描述機器人如何響應意圖/事件,并且可以進行轉換。這使得機器人的設計者可以查看執(zhí)行文件,了解整個對話流程。
執(zhí)行語言中的每個狀態(tài)包含 3 個部分
- Body (可選):機器人在進入狀態(tài)時執(zhí)行的反應。
- Next (必選):定義了出站轉換,表示為 condition –> State。 當接收到事件/意圖時,會評估條件,如果滿足轉換,則執(zhí)行引擎會移動到指定的狀態(tài)并執(zhí)行其相應的反應。需要注意的是,轉換條件可以非常復雜。 它們是真正的守衛(wèi),這意味著如果整個條件不為真,則轉換不可導航,引擎將保持當前狀態(tài)。
- Fallback (可選):此部分可以包含任意代碼(就像 Body 部分一樣),如果引擎無法找到可導航的轉換,則會執(zhí)行這些代碼。
執(zhí)行模型還包含 2 個特殊狀態(tài):
- Init:是創(chuàng)建用戶會話時進入的常規(guī)狀態(tài)。它可以包含 Body、_Next_和 Fallback 部分。
- Default_Fallback:它只能包含 Body 部分,并且不能作為轉換的目標狀態(tài)。該狀態(tài)表示在當前狀態(tài)中未定義本地回退時執(zhí)行的默認回退代碼。該狀態(tài)可用于打印通用錯誤消息(例如,“抱歉,我沒明白您的意思”),而本地回退則可以打印針對當前狀態(tài)的定制消息(例如,“請回答是或否”)。
最后,一個狀態(tài)可以定義一個單一的通配符轉換(使用保留字符___作為轉換條件),當計算狀態(tài)主體時將自動導航。這使我們能夠在多個地方重用相同的代碼并模塊化執(zhí)行邏輯。下面是一個簡單的機器人示例,它只回復問候意圖,詢問用戶名并向用戶問好。這個機器人的回復可以通過我們基于 React 的聊天小部件顯示。