基於狀態機的聊天機器人設計經驗總結

WBOY
發布: 2023-04-11 18:31:03
轉載
1525 人瀏覽過

為了更了解智慧機器人專案的需求和改進方向,我們常常需要研發一些工具。在我參與的多個機器人專案中,大多數都能夠成功地滿足產品需求。透過這些實踐,我們深刻認識到,如果要不斷進步和提高,就必須對現有的機器人定義語言進行重大的改進。

  • 簡化需要複雜對話流程的機器人的創建過程。
  • 最大限度地提高可重用性,透過重複使用過去已經定義過的模組和對話路徑來創建機器人

在傳統的做法中,完成這些並不容易,因為意圖定義與部分排序約束混合在一起,限制了對話路徑的自由。這對於處理「開放式」機器人(常見於FAQ樣式的機器人),其中大多數問題是獨立的且始終可用的,這已經足夠了。但對於更「封閉」的機器人來說,潛在的對話限制要多得多(例如用於從線上訂票機器人)。

基於狀態機的聊天機器人設計經驗總結

為了將聊天機器人定義語言的功能提升到一個新的水平,在一些專案中我們引進了更接近狀態機語義的DSL,並完全將意圖定義與控制機器人執行定點可用意圖的轉換規則分離,這麼做有以下優勢:

  1. 新機器人中可以復用先前的意圖,即使設定的對話路徑不同。
  2. 可以使用狀態機定義複雜的對話流,讓機器人保持清晰和精確的語意。
  3. 可以建立複雜的狀態守護來控制轉換。根據使用者輸入、即將發生的事件以及先前的資料、對話參數等,將機器人移動到新狀態。
  4. 可以使用狀態主體來儲存複雜的對話邏輯,以回應使用者請求。
  5. 可以將機器人模組化,以便在其他機器人中重複使用部分狀態機。
  6. 可以將本地回退定義為狀態行為的一部分。除了預設的全域回退,還可以將本機回退與狀態相關聯,以便在狀態上下文中處理錯誤,例如顯示一則訊息,幫助使用者回答機器人在對話中的特定狀態下提出的問題。

意圖定義語言

意圖定義現在與執行部分解耦,但仍然是單獨的子語言。對於每個意圖,我們只需提供一些訓練句子,讓機器人能夠辨識出使用者話語的意圖,並從中提取所需的參數。

舉個例子,我們有一個簡單的機器人,它只能理解兩種類型的使用者話語:問候和陳述姓名。我們可以為每種話語類型提供幾個範例句子,讓機器人學會如何辨識它們。當使用者輸入話語時,機器人會根據它的意圖執行相應的操作,並從中提取所需的參數。

intent Hello {
inputs {
"你好"
"早上好"
}
}
 
intent MyNameIs {
inputs {
"我的名字叫小明"
"我是小明"
"你可以叫我小明"
}
creates context Greetings {
set parameter name from fragment "小明" (entity any)
}
}
登入後複製

我們為每個意圖提供一些樣本句子,來訓練機器人如何識別它們。此外,在某些情況下,我們也會在上下文中收集一些參數(例如,使用者的姓名),以便日後能更個人化地回答使用者。

我們還沒有具體說明機器人應該先嘗試匹配哪個意圖,這是執行部分語言的內容。這種方法使我們能夠重複利用這些意圖(例如,在另一個機器人中,我們可能需要詢問使用者的姓名,而不僅僅是在問候意圖之後)。

執行定義語言

使用執行檔來定義一個狀態機,描述機器人如何回應意圖/事件,並且可以進行轉換。這使得機器人的設計者可以查看執行文件,並了解整個對話流程。

執行語言中的每個狀態包含 3 個部分

  • Body (可選):機器人在進入狀態時執行的反應。
  • Next (必備):定義了出站轉換,表示為 condition –> State。  當接收到事件/意圖時,會評估條件,如果滿足轉換,則執行引擎會移動到指定的狀態並執行其相應的反應。需要注意的是,轉換條件可以非常複雜。  它們是真正的守衛,這意味著如果整個條件不為真,則轉換不可導航,引擎將保持當前狀態。
  • Fallback (可選):此部分可以包含任何程式碼(就像 Body 部分一樣),如果引擎無法找到可導航的轉換,則會執行這些代碼。

執行模型還包含 2 個特殊狀態:

  • Init:是创建用户会话时进入的常规状态。它可以包含 Body、_Next_和 Fallback 部分。
  • Default_Fallback:它只能包含 Body 部分,并且不能作为转换的目标状态。该状态表示在当前状态中未定义本地回退时执行的默认回退代码。该状态可用于打印通用错误消息(例如,“抱歉,我没明白您的意思”),而本地回退则可以打印针对当前状态的定制消息(例如,“请回答是或否”)。

最后,一个状态可以定义一个单一的通配符转换(使用保留字符___作为转换条件),当计算状态主体时将自动导航。这使我们能够在多个地方重用相同的代码并模块化执行逻辑。下面是一个简单的机器人示例,它只回复问候意图,询问用户名并向用户问好。这个机器人的回复可以通过我们基于 React 的聊天小部件显示。

//We can always have an init state in case we need to initialize some bot parameters (e.g. welcoming message)
Init {
Next { 
//Here we state that the bot will first listen for an utterance matching the Hello intent, it will ignore anything else
intent == Hello --> HandleHello
}
}
HandleHello {
Body {
 ReactPlatform.Reply("你好, 你叫什么名字?")
}
Next {
//We wait for the user to input the name, no other transition is possible at this point
//Obviously, in more complex bots we may have several possible outgoing transitions in a given state
intent == MyNameIs --> HandleMyNameIs
}
}
HandleMyNameIs {
Body {
ReactPlatform.Reply("你好 " + context.get("Greetings").get("name"))
}
Next {
// An automatic transition to the Init state since at this point the conversation is finished and we can start again
_ --> Init
}
}
// Default Fallback state could go here
登入後複製


以上是基於狀態機的聊天機器人設計經驗總結的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:51cto.com
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板