Alan Tsai 的學習筆記


學而不思則罔,思而不學則殆,不思不學則“網貸” 為現任微軟最有價值專家 (MVP)、微軟認證講師 (MCT) 、Blogger、Youtuber:記錄軟體開發的點點滴滴 著重於微軟技術、C#、ASP .NET、Azure、DevOps、Docker、AI、Chatbot、Data Science

[Bot Framework V4][07]Dialog - 控制流程的元件介紹

[Bot Framework V4][07]Dialog - 控制流程的元件介紹.jpg
圖片來源:https://pixabay.com/en/books-spine-colors-pastel-1099067/ 

在上一篇([06]使用BotState儲存使用者的相關信息)透過ConversationState記錄狀態的方式,來控制整個對話流程,然後透過把使用者信息儲存在UserState達到可以記錄每個使用者的個人信息。

開發當然可以透過這個方式繼續做下去,但是一個問題就冒出來,簡單的流程用這種方式當然沒問題,但是當流程很複雜怎麽辦?是不是變成需要自己建立一個機制能夠知道目前在整個流程的那個部分?

這個問題肯定Framework有考量到,那這個機制是什麽?作爲開發者怎麽使用呢?

這篇將介紹V4裡面的機制,Dialog

Dialog是什麽?

Dialog可以想象成程式裡面的Method,它接受一個Activity,然後提供一個輸出。因此,Dialog提供了每一個部分的最小單位。

V3也有Dialog的概念,但是和V4相比兩個是不同的概念。

DialogSet是什麽?

Dialog代表一個最小邏輯單位,DialogSet則是Dialog的集合。

在實際執行的時候,Dialog是透過一個Stack的方式來被執行,在Stack最上面的Dialog被稱之爲ActiveDialog

DialogSet就是集合多個Dialog一起,可以讓Bot程式呼叫啓動。

由於DialogSet會有這些Stack資訊,因此在new它的時候是需要有State Accessor才有辦法記錄這些信息。

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方式來説的話,就是類似:

bot-builder-dialog-concept.png
waterfall概念。圖片來源:https://docs.microsoft.com/en-us/azure/bot-service/bot-builder-concept-dialog?view=azure-bot-service-4.0

waterfall + Prompt = 有點類似V3版本裡面的FormFlow - 有興趣可以從這篇瞭解V3的FormFlow:([chatbot + AI = 下一代操作模式][07]使用FormFlow讓Chatbot搜集表單資訊更容易)
Component

如果説有一組Dialog是通用邏輯,例如詢問使用者信息,可能很多bot都會使用到,那麽每一次都用waterfall寫一次嗎?

可以透過使用Component封裝,最後這個是可以變成像一個模組,不同的Bot可以使用。

如果暫時不考慮reuse這個事情的話(Component Dialog)的話,那麽用的最多是promptwaterfall,這兩個的hierarchy是:

bot-builder-dialog-classes.png
dialog之間的階層關係。圖片來源:https://docs.microsoft.com/en-us/azure/bot-service/bot-builder-concept-dialog?view=azure-bot-service-4.0

結語

這篇介紹了Dialog這個概念 - 透過Dialog的使用能夠讓控制Bot的交談流程變得更加簡單。

有了概念之後,接下來就是看看怎麽實際使用,下一篇([08]改用TextPrompt詢問使用者姓名)將從取得使用者信息的Dialog開始,看看怎麽讓取得使用者姓名變得更加簡單。

參考資料

官方介紹 - Dialog Library
傳送門

如果文章對您有幫助,就請我喝杯飲料吧
街口支付QR Code
街口支付QR Code
台灣 Pay QR Code
台灣 Pay QR Code
Line Pay 一卡通 QR Code
Line Pay 一卡通 QR Code
街口支付QR Code
支付寶QR Code
街口支付QR Code
微信支付QR Code
comments powered by Disqus