Dialog 是整個 bot framework 裡的核心概念,最主要的作用是用來管理與使用者的對談,簡單來說可以把它看成是程式裡面的方法,有了 Dialog 的機制,在開發 Chatbot 時,我們可以進一步的規劃對話的流程,依特定順序來執行相對應的反應,在實務上人類的對話相當不容易控制,為了讓 Chatbot 能提供更好的使用者體驗,通常會利用一些手法讓對話的過程比較容易控制,一旦能控制,就可以利用程式來結構化。
在比較複雜的對話流程裡,通常會由多個 Dialog 來組成,這些 Dialog 會被放在 stack (堆疊)裡,而 stack 裡最上層的 Dialog 被稱為 ActiveDialog 也就是目前作用中的 Dialogs ,相對的當目前作用的 Dialog 結束時,就會被從 stack 裡移除,而對話的控制權則會被交還上一個 Dialog 或是被指定的 Dialog 。
Dialog 有幾個主要的方法
- 首先是 BeginDialogAsync,當 Dialog 被叫用加入 stack (堆疊)裡時, BeginDialogAsync 方法會被呼叫,在這個方法裡通常用來處理 Dialog 初始化的邏輯
- 接者是 ContinueDialogAsync,在這個方法裡是處理對話邏輯,當前的 Dialog 呼叫這個方法時,會持續等待使用者的下一個回應(activity),直到 DialogSet.end() 或是 DialogSet.begin() 被叫用才結束,但若是沒有實作 ContinueDialogAsync,則當使用者回應後就會自動結束
- 而 ResumeDialogAsync 方法則是用來處理階層式作業的,當子階的 Dialog 結束後,控制權回到上一個 Dialog 時,會叫用 ResumeDialogAsync 方法
前面提到 Dialog 通常由多個所組成,藉此設計成對話的流程,那麼在不同的 Dialog 間負責訊息傳達的就是 DialogContext 物件,因此可以看到在上述的三個方法都有 DialogContext 參數做為傳遞。
在 bot framework v4 版本裡,內建以下 Dialog
(資料來源:https://docs.microsoft.com/en-us/azure/bot-service/bot-builder-concept-dialog?view=azure-bot-service-4.0)
- Prompt,從上圖可以明顯知道這個類型的 Dialog 主要用途是用來做為取得使用者輸入的資料
- Waterfall,則是用來製作一系列的依序問題,就像是流程一樣一關接著一關,例如電商應用,詢問付款方式、收件者姓名、手機、地址
- Component,很直覺就是用來設計共用的 Dialog 元件,如果有多個不同的設計,都會用到相同的 Dialog ,則可以設計成 Component 型式
瞭解 Dialog 概念後,接下來的文章將會分別以實例來呈現 Dialog 的應用。
若本文對您有所幫助,歡迎轉貼,但請在加註【轉貼】及來源出處,並在附上本篇的超連結,感恩您的配合囉。
By No.18