Botpress使用我們所謂的對話引擎來處理對話。對話引擎負責與機器人的每次互動。它處理用戶輸入和機器人響應。但是在兩者之間,發生了很多事情。
Overview
對話引擎使用代表機器人總體對話邏輯的流程,流程由執行一系列指令的節點組成。指令是Node生命週期的一部分,可以執行Actions。Actions通常是您自己編寫的代碼,是由Botpress或其他人提供的代碼(稍後會詳細介紹)。
Flows
較複雜的機器人通常分為多個較小的Flow,而不只是一個較大的流程。將漫遊器分解為多個流的原因是為了簡化可維護性和可重用性。
Flow Lifetime
Flow總是startNode從其*.flow.json文件的開始。起始節點指示開始節點的名稱。一旦選擇了節點,對話引擎將使活動節點的指令排隊。然後它將順序處理指令。
對話引擎是基於事件的,默認情況下是非阻塞的,這意味著流將執行它可以執行的所有操作,直到需要等待為止。
注意:目前有兩個原因導致Flow“等待”:
* 節點被標記為等待用戶輸入
* 一個節點無法滿足轉換到另一個節點的條件
處理完第一個節點後,對話框引擎將繼續執行Flow中的下一個節點,直到到達最後。
節點也有自己的生命週期,節點在Flow中負責執行具體的工作,而Flow僅是用於編排它們。這個有點類似操作系統的Process和Thread。
Storage
流作為JSON文件存儲在機器人的源文件中。在本教程的上下文中,流存儲在data/bots/trivia-bot/flows/文件夾中。每個流都分為兩個文件:邏輯(*.flow.json)和特定於視覺的屬性(*.ui.json)。拆分這些內容是為了使維護和檢查更改更加容易。
- *.ui.json 文件幾乎總是可以從代碼審查中忽略,因為它們不影響機器人的功能。
- *.flow.json從理論上講,文件也可以由開發人員手動創建,而不是使用GUI。技能就是這種情況,我們將在後面介紹。
Nodes
Node是機器人對話邏輯的主要單元。一個活動對話(我們稱為“ 會話 ”)始終只有一個活動節點 。一個節點通常過渡到另一個節點或流。如果沒有,則對話結束。然後,來自用戶的下一條消息將成為一個全新會話的一部分。
甲節點被分離成三個不同的階段:的OnEnter(A),的onReceive(B)和onNext(C)。
Node Lifetime
onEnter
onEnter是進入節點時將執行的指令列表。如果定義了多個動作,則將依次執行所有動作。
onReceive
onReceive是當節點成為活動節點時收到消息時將執行的指令列表。一旦定義了動作,該節點將自動等待用戶輸入(橙色節點)。
保留該屬性不使用時,該節點將處於非阻塞狀態(黑色),這意味著它將直接從流動onEnter到onNext。
全流程onReceive
您可以定義一個onReceive指令,該指令將始終在每個節點的onRecieve之前執行。
示例:接收時全流程
Audit Trail:記錄在此特定流範圍內接收到的消息的特定日誌
Authentication Gate:運行一些驗證
Sentiment Analysis:確保對話情緒保持健康
要定義新的“new Flow-wide On Receive Actions”,請導航至相關Flow,然後雙擊方格背景上的任意位置以顯示“Flow Properties Pop up”。您也可以單擊Flow編輯器左上角的鏈接。在“ On Receive”部分下,單擊“ Add Action ”按鈕以添加新操作。
onNext
onNext(也稱為Transitions)與Flow-wide Transitions完全相同,除了條件僅在執行之後onReceive或onEnter已執行的情況下進行評估。
特殊情況:如果未定義任何條件,則默認行為是對話結束。如果定義了條件但不匹配,則什麼也不會發生,即當前節點保持活動狀態,並且當條件匹配時它將流動。默認情況下,onNext僅在onReceive重新調用後才會重試。
目標:轉換始終有一個目標,我們稱之為目標。有可能:
- 不同的節點
- 不同的流程
- 上一個流程(請參閱流程堆棧)
- 自身(回過頭來)
- 對話結束
全流程onNext
當條件成功時,使用Flow-wide onNext指令可以覆蓋節點轉換。
示例:全流程onNext
身份驗證門:如果用戶未通過身份驗證,則將其重新路由到登錄流程情感分析:如果會話質量下降,則將用戶重新路由到人工後備節點匹配流範圍內的意圖,例如“ cancel”等。
State
每個對話都有一個與之關聯的State。狀態在會話會話開始時創建,並在會話結束時銷燬。
在本教程的上下文中,這意味著將在輸入“ entry ”節點之前和執行“ over ”節點之後立即創建狀態。
注意:狀態是對話的全局狀態,因此,如果對話跨越多個流,則該狀態將為所有流共享。
Session Timeout
當對話框引擎正在等待非活動用戶的輸入時,一段時間後會話將超時。超時允許您根據需要優雅地結束對話。在刪除會話之前進行一些處理也很有用。例如,您可以將用戶聯繫信息保存到外部數據庫,或者告訴用戶如何與您聯繫,或者通知用戶其會話已超時。
Timeout Flow
您可以使用超時流來處理超時邏輯。它就像常規流程一樣工作。您要做的就是向timeout.flow.json您的漫遊器添加一個Flow ,並指定一個起始節點。對話框引擎將在用戶下一次超時時檢測您的超時流。
Timeout Node
與超時流非常相似,應該調用超時節點,該節點timeout應該屬於當前流。您不必將其鏈接到任何其他節點。對話框引擎將根據其名稱檢測節點。
Timeout Transition
另一個需要一些編碼的選項是將屬性添加timeoutNode到*.flow.json文件中,並將其分配給應處理超時的節點的名稱。它可以是任何節點,不需要稱為特定方式。
⚠ 重要說明:對話引擎處理完超時後,將刪除會話。
Actions
一個行動是在Node.js的虛擬機執行JavaScript代碼。可以是您想要的任何東西。調用API,將某些內容存儲在數據庫中或將某些內容存儲在鍵值存儲中。操作由onEnter和onReceive指令調用。有兩種類型的動作:
- 腳本:用戶定義的操作,用於運行自定義代碼。
- Output:一個輸出動作,用於使機器人輸出一些東西。
要了解有關操作的更多信息,請參閱“ 自定義代碼”部分。
Skills
構建了幾個流程/機器人之後,您會很快注意到,有一些常見的模式會一遍又一遍地實現。技能可以解救。
技能是在流程之上的更高層次的抽象。實際上,技能是動態生成器。
它們可以看作是多個流甚至多個漫遊器之間的可重用組件。
Install Skills
每個技能都必須由一個模塊公開。模塊可以承載許多技能。您所要做的就是安裝所需的模塊,您將可以使用其技能。
Use Skills
Botpress Flows GUI應該使用技能。安裝技能模塊後,在“圖形流程編輯器”中導航至流程,然後在頂部工具欄中找到“插入技能”下拉菜單:
填寫表單後,您將能夠單擊流中的任何位置以插入其他節點要使用的技能。
Persistence
技能以流的形式存儲在該data/bots/your-bot/flows/skills文件夾下。
您還可以通過GUI可視化生成的技能:
Editing skills
生成技能節點後,您可以單擊該節點,然後單擊左側面板上的“編輯”以編輯該節點,這將在後臺自動更新生成的流程。
閱讀更多 人工智能時報 的文章