3.3 根據用戶的訊息控制對話流程
在 Bot Framework 中我們可以設定一個對話的瀑布式流程,按照設定好的一問一答來繼續下一個流程。但真實的情況通常不會那麼順利,你可能正在跟用戶進行對話 A,結果對話到一半用戶突然輸入了非預期的內容、想談別的對話、或是想要直接跳到查詢功能的對話中,這些情境都需要跳到另外一個對話流程中。正常的流程我們可以主動用 session.beginDialog()
開啟一段對話,這一篇文章介紹如何在特定的對話出現時,自動跳到合適的對話中。
設定對話被誰驅動
假設我們有一段對話在問用戶選擇一個選項,可能就使用 builder.Prompts.choice()
來詢問用戶給一個選項,但如果使用者不想回答選項,而輸入了別的內容,那就會一直鬼打牆請他重新輸入,像是這樣:
這是因為 builder.Prompts.choice()
會自己判斷用戶輸入的格式,如果不符合選項就會進行 retry 流程請用戶重新輸入,但使用者輸入了 help 就有可能是期待進入說明的流程,這時候我們就可以定義一個說明對話,並且設定它只要用戶輸入了 help 就進入這個對話中:
bot.dialog('help', [
(session) => {
builder.Prompts.choice(session, '請問有什麼可以協助您的嗎?', ['忘記密碼', '訂單問題', '其它']);
},
(session, results) => {
session.send(`好的,我們將會幫您處理「${results.response.entity}」`);
session.endDialog();
}
]).triggerAction({
matches: /^help$/i
});
用 bot.dialog()
來定義一個對話沒什麼特別,這裡加入的是在後面加入 .triggerAction()
的呼叫,我們使用 matches
屬性來指定,當使用者輸入的文字符合 /^help$/i
這個正規表示式時就自動進入 help 這個對話。
加入了這樣的設定後,對話流程就可以在輸入 help 後改變對話:
雖然可以根據輸入跳到另外一個對話流程,但以這個例子而言,當使用者跳到 help 對話後,原本的對話流程與狀態就清除了,結束 help 對話也無法回到原來的狀態,如果希望跳到 help 對話流程後又能再回到原本的對話狀態,可以將程式修改成這樣:
bot.dialog('help', [
(session, args, next) => {
builder.Prompts.choice(session, '請問有什麼可以協助您的嗎?', ['忘記密碼', '訂單問題', '其它']);
},
(session, results) => {
session.send(`好的,我們將會幫您處理「${results.response.entity}」`);
session.endDialog();
}
]).triggerAction({
matches: /^help$/i,
onSelectAction: (session, args, next) => {
session.beginDialog(args.action, args);
}
});
onSelectAction
這裡設定的是當 matches 發生作用時做的事情,這裡我們不使用預設跳到 help 對話盒的模式,而是手動使用 beginDialog
來啟動對話,這樣就會保留原本的對話狀態,使得 help 對話結束後就會回到原本的對話狀態中:
因為我們在 builder.Prompts.choice()
的過程中跳到另一個對話,回來時就回到它的 retry 流程,這部份可以修改語句說明來讓流更流暢。