為了更了解智慧機器人專案的需求和改進方向,我們常常需要研發一些工具。在我參與的多個機器人專案中,大多數都能夠成功地滿足產品需求。透過這些實踐,我們深刻認識到,如果要不斷進步和提高,就必須對現有的機器人定義語言進行重大的改進。
在傳統的做法中,完成這些並不容易,因為意圖定義與部分排序約束混合在一起,限制了對話路徑的自由。這對於處理「開放式」機器人(常見於FAQ樣式的機器人),其中大多數問題是獨立的且始終可用的,這已經足夠了。但對於更「封閉」的機器人來說,潛在的對話限制要多得多(例如用於從線上訂票機器人)。
為了將聊天機器人定義語言的功能提升到一個新的水平,在一些專案中我們引進了更接近狀態機語義的DSL,並完全將意圖定義與控制機器人執行定點可用意圖的轉換規則分離,這麼做有以下優勢:
意圖定義現在與執行部分解耦,但仍然是單獨的子語言。對於每個意圖,我們只需提供一些訓練句子,讓機器人能夠辨識出使用者話語的意圖,並從中提取所需的參數。
舉個例子,我們有一個簡單的機器人,它只能理解兩種類型的使用者話語:問候和陳述姓名。我們可以為每種話語類型提供幾個範例句子,讓機器人學會如何辨識它們。當使用者輸入話語時,機器人會根據它的意圖執行相應的操作,並從中提取所需的參數。
intent Hello { inputs { "你好" "早上好" } } intent MyNameIs { inputs { "我的名字叫小明" "我是小明" "你可以叫我小明" } creates context Greetings { set parameter name from fragment "小明" (entity any) } }
我們為每個意圖提供一些樣本句子,來訓練機器人如何識別它們。此外,在某些情況下,我們也會在上下文中收集一些參數(例如,使用者的姓名),以便日後能更個人化地回答使用者。
我們還沒有具體說明機器人應該先嘗試匹配哪個意圖,這是執行部分語言的內容。這種方法使我們能夠重複利用這些意圖(例如,在另一個機器人中,我們可能需要詢問使用者的姓名,而不僅僅是在問候意圖之後)。
使用執行檔來定義一個狀態機,描述機器人如何回應意圖/事件,並且可以進行轉換。這使得機器人的設計者可以查看執行文件,並了解整個對話流程。
執行語言中的每個狀態包含 3 個部分
執行模型還包含 2 個特殊狀態:
最后,一个状态可以定义一个单一的通配符转换(使用保留字符___作为转换条件),当计算状态主体时将自动导航。这使我们能够在多个地方重用相同的代码并模块化执行逻辑。下面是一个简单的机器人示例,它只回复问候意图,询问用户名并向用户问好。这个机器人的回复可以通过我们基于 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中文網其他相關文章!