在上一篇([06]使用BotState儲存使用者的相關信息)透過ConversationState
記錄狀態的方式,來控制整個對話流程,然後透過把使用者信息儲存在UserState
達到可以記錄每個使用者的個人信息。
開發當然可以透過這個方式繼續做下去,但是一個問題就冒出來,簡單的流程用這種方式當然沒問題,但是當流程很複雜怎麽辦?是不是變成需要自己建立一個機制能夠知道目前在整個流程的那個部分?
這個問題肯定Framework有考量到,那這個機制是什麽?作爲開發者怎麽使用呢?
這篇將介紹V4裡面的機制,Dialog
。
Dialog是什麽?
Dialog可以想象成程式裡面的Method
,它接受一個Activity
,然後提供一個輸出。因此,Dialog提供了每一個部分的最小單位。
DialogSet是什麽?
Dialog代表一個最小邏輯單位,DialogSet則是Dialog的集合。
在實際執行的時候,Dialog是透過一個Stack的方式來被執行,在Stack最上面的Dialog被稱之爲ActiveDialog
。
DialogSet就是集合多個Dialog一起,可以讓Bot程式呼叫啓動。
DialogContext是什麽?
有了DialogSet,總要有一個東西管理接下來那個Dialog會被呼叫,以及幫忙從一個Dialog到另外一個Dialog之間傳遞消息,這個就是DialogContext
的工作。
一個Dialog有什麽主要方法?
一個Dialog基本上會實作三個方法:
- BeginDialog
這個方法執行的内容通常都是初始化相關的部分。可以是從
DialogContext
取得相關值,或者準備好取值的問題。舉例來説,如果有個Dialog要取得使用者姓名,那麽詢問:
您的尊姓大名?
這段的邏輯就會放在BeginDialog
- ContinueDialog
這個方法的内容則是實際的邏輯處理。
同樣以上面那個例子來説,要取得使用者姓名,那麽這個部分就是問完了
您的尊姓大名?
之後使用者回復的結果處理。- ResumeDialog
-
這邊一般用來支援Dialog階層關係,小孩的Dialog在結束的時候會呼叫爸爸Dialog的
ResumeDialog
。
内建的Dialog有什麽?
SDK本身提供了3個繼承下來的Dialog:
- Prompt類型
-
這種Dialog主要是爲了從使用者那邊取得某種類型的輸入内容。例如是文字類型,就是
TextPrompt
,如果是數字類型就是NumberPrompt
,如果是日期類型 就是DateTimePrompt
。 - Waterfall
一個Dialog是針對一件事情,如果有一系列問題要詢問呢?
例如要知道使用者的:姓名、電話、地址等,這個時候就是用
waterfall
。每一個動作叫做一個step
,然後每一個step的輸出會作爲 下一個step的輸入。以flow方式來説的話,就是類似:
waterfall + Prompt = 有點類似V3版本裡面的FormFlow
- 有興趣可以從這篇瞭解V3的FormFlow:([chatbot + AI = 下一代操作模式][07]使用FormFlow讓Chatbot搜集表單資訊更容易)- Component
如果説有一組Dialog是通用邏輯,例如詢問使用者信息,可能很多bot都會使用到,那麽每一次都用waterfall寫一次嗎?
可以透過使用
Component
封裝,最後這個是可以變成像一個模組,不同的Bot可以使用。
如果暫時不考慮reuse這個事情的話(Component Dialog
)的話,那麽用的最多是prompt
和waterfall
,這兩個的hierarchy是:
結語
這篇介紹了Dialog
這個概念 - 透過Dialog的使用能夠讓控制Bot的交談流程變得更加簡單。
有了概念之後,接下來就是看看怎麽實際使用,下一篇([08]改用TextPrompt詢問使用者姓名)將從取得使用者信息的Dialog開始,看看怎麽讓取得使用者姓名變得更加簡單。
參考資料
- 官方介紹 - Dialog Library
- 傳送門