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 流程,這部份可以修改語句說明來讓流更流暢。

results matching ""

    No results matching ""