處理用戶中斷
適用於: SDK v4
處理中斷是強健機器人的重要層面。 使用者不會總是遵循您定義的對話流程逐步進行。 他們可能會嘗試在過程中提出問題,或者只是想取消這個過程,而不是完成它。 本文說明處理 Bot 中用戶中斷的一些常見方式。
必要條件
核心 Bot 範例會使用 Language Understanding (LUIS) 來識別用戶意圖;不過,識別使用者意圖並不是本文的重點。
如需識別使用者意圖的相關信息,請參閱 自然語言理解 和 將自然語言理解新增至 Bot。
關於此範例
本文中使用的範例會建立航班預約 Bot 的模型,該 Bot 會使用對話從使用者取得航班資訊。 在與 Bot 交談期間,用戶隨時都可以發出 說明 或 取消 命令,以造成中斷。 有兩種類型的中斷處理:
-
回合層級:略過回合層級的處理,但保留在堆疊上的對話及已提供的資訊。 在下一個回合中,從對話中斷的地方繼續。
-
對話框層級:完全取消處理,讓 Bot 可以重新開始。
定義及實作中斷邏輯
首先,定義並實作 help 和 cancel 中斷。
若要使用對話框,請安裝 Microsoft.Bot.Builder.Dialogs NuGet 套件。
Dialogs\CancelAndHelpDialog.cs
實作 類別 CancelAndHelpDialog
來處理用戶中斷。 可取消的對話框, BookingDialog
並 DateResolverDialog
衍生自這個類別。
警告
您要尋找的範例看起來已經移動! 放心,我們正在努力解決這個問題。
在 CancelAndHelpDialog
類別中,OnContinueDialogAsync
方法會呼叫 InterruptAsync
方法,以檢查使用者是否已中斷正常流程。 如果流程中斷,則會呼叫基類方法;否則,會返回 InterruptAsync
的返回值。
警告
您要尋找的範例看起來已經移動! 放心,我們正在努力解決這個問題。
如果使用者輸入「說明」,則 InterruptAsync
方法會傳送訊息,然後呼叫 DialogTurnResult (DialogTurnStatus.Waiting)
以指出頂端的對話正在等候用戶的回應。 如此一來,交談流程只會中斷一個回合,而下一個回合會從交談離開的地方繼續進行。
如果使用者輸入 「cancel」,它會在其內部對話內容上呼叫 CancelAllDialogsAsync
,這會清除其對話堆棧,並導致其結束狀態為已取消,且沒有結果值。 對於稍後顯示的 MainDialog
,會顯示預約對話框已結束並返回空值,這類似於使用者選擇不確認其預約的情況。
警告
您要尋找的範例看起來已經移動! 放心,我們正在努力解決這個問題。
若要使用對話框,請安裝 botbuilder-dialogs npm 套件。
dialogs/cancelAndHelpDialog.js
實作 類別 CancelAndHelpDialog
來處理用戶中斷。 可取消的對話框, BookingDialog
並 DateResolverDialog
擴充這個類別。
警告
您要尋找的範例看起來已經移動! 放心,我們正在努力解決這個問題。
在 CancelAndHelpDialog
類別中,onContinueDialog
方法會呼叫 interrupt
方法來檢查使用者是否中斷了正常流程。 如果流程中斷,則會呼叫基礎類別的方法,否則,將返回 interrupt
的返回值。
警告
您要尋找的範例看起來已經移動! 放心,我們正在努力解決這個問題。
如果使用者輸入「說明」,則 interrupt
方法會傳送訊息,然後傳回 { status: DialogTurnStatus.waiting }
物件,指出頂端的對話正在等候用戶的回應。 如此一來,交談流程只會中斷一個回合,而下一個回合會從交談離開的地方繼續進行。
如果使用者輸入 「cancel」,它會在其內部對話內容上呼叫 cancelAllDialogs
,這會清除其對話堆棧,並導致其結束狀態為已取消,且沒有結果值。 稍後顯示的 MainDialog
,會顯示預約對話框已結束並且返回 null,這一點類似於使用者選擇不確認其預約時的情況。
警告
您要尋找的範例看起來已經移動! 放心,我們正在努力解決這個問題。
CancelAndHelpDialog.java
實作 類別 CancelAndHelpDialog
來處理用戶中斷。 可取消的對話框, BookingDialog
並 DateResolverDialog
衍生自這個類別。
警告
您要尋找的範例看起來已經移動! 放心,我們正在努力解決這個問題。
在 CancelAndHelpDialog
類別中,onContinueDialog
方法會呼叫 interrupt
方法,以檢查使用者是否已中斷一般流程。 如果流程中斷,則會呼叫基類方法;否則,會傳回由 interrupt
的傳回值。
警告
您要尋找的範例看起來已經移動! 放心,我們正在努力解決這個問題。
如果使用者輸入「說明」,則 interrupt
方法會傳送訊息,然後呼叫 DialogTurnResult(DialogTurnStatus.WAITING)
以指出頂端的對話正在等候用戶的回應。 如此一來,交談流程只會中斷一個回合,而下一個回合會從交談離開的地方繼續進行。
如果使用者輸入 「cancel」,它會在其內部對話內容上呼叫 cancelAllDialogs
,這會清除其對話堆棧,並導致其結束狀態為已取消,且沒有結果值。 在 MainDialog
(稍後顯示)中,將顯示預約對話框已結束並傳回 null,這類似於使用者選擇不確認其預約的情況。
警告
您要尋找的範例看起來已經移動! 放心,我們正在努力解決這個問題。
若要使用對話框,請安裝 botbuilder-dialogs
套件,並確定範例 requirements.txt
檔案包含適當的參考,例如 botbuilder-dialogs>=4.5.0
。
如需有關安裝套件的詳細資訊,請參閱範例存放庫 自述檔 。
注意
執行 pip install botbuilder-dialogs
也會安裝 botbuilder-core
、 botbuilder-connector
與 botbuilder-schema
。
dialogs/cancel-and-help-dialog.py
實作 類別 CancelAndHelpDialog
來處理用戶中斷。 可取消的對話框, BookingDialog
並 DateResolverDialog
衍生自這個類別。
警告
您要尋找的範例看起來已經移動! 放心,我們正在努力解決這個問題。
在 CancelAndHelpDialog
類別中,on_continue_dialog
方法會呼叫 interrupt
方法,以檢查使用者是否已中斷一般流程。 如果流程中斷,則會呼叫基類方法;否則,會傳回 interrupt
的回傳值。
警告
您要尋找的範例看起來已經移動! 放心,我們正在努力解決這個問題。
如果使用者輸入 「help」 或 「?“, interrupt
方法會傳送訊息,然後呼叫 DialogTurnResult(DialogTurnStatus.Waiting)
以指出堆疊頂端的對話方塊正在等候用戶的回應。 如此一來,交談流程只會中斷一個回合,而下一個回合會從交談離開的地方繼續進行。
如果使用者輸入 「cancel」 或 「quit」 ,它會在其內部對話內容上呼叫 cancel_all_dialogs()
,這會清除其對話堆疊,並導致它以已取消的狀態結束,而且沒有結果值。
MainDialog
在 稍後顯示的 中,會出現預約對話框已結束並傳回 null,類似於使用者選擇不確認其預約時。
警告
您要尋找的範例看起來已經移動! 放心,我們正在努力解決這個問題。
在每回合中檢查是否有中斷
實作中斷處理類別之後,請檢閱當此 Bot 收到來自使用者的新訊息時會發生什麼情況。
Dialogs\MainDialog.cs
當新的訊息活動送達時,Bot 會執行 MainDialog
。
MainDialog
會提示使用者它可以提供什麼協助。 然後它會在MainDialog.ActStepAsync
的方法中啟動BookingDialog
,並呼叫BeginDialogAsync
,如下所示。
警告
您要尋找的範例看起來已經移動! 放心,我們正在努力解決這個問題。
接下來,在MainDialog
類別的FinalStepAsync
方法中,預約對話框已結束,並將預約視為完成或取消。
警告
您要尋找的範例看起來已經移動! 放心,我們正在努力解決這個問題。
中的 BookingDialog
程式代碼不會在此顯示,因為它與中斷處理不直接相關。 它用來提示使用者輸入預約詳細數據。 您可以在 Dialogs\BookingDialogs.cs 中找到該程式代碼。
dialogs/mainDialog.js
當新的訊息活動送達時,Bot 會執行 MainDialog
。 在 MainDialog
上,系統會提示使用者需要什麼幫助。 然後它會在MainDialog.actStep
方法中啟動bookingDialog
,並呼叫beginDialog
,如下所示。
警告
您要尋找的範例看起來已經移動! 放心,我們正在努力解決這個問題。
接下來,在 MainDialog
類別的 finalStep
方法中,預約對話框已結束,並將預約視為已完成或取消。
警告
您要尋找的範例看起來已經移動! 放心,我們正在努力解決這個問題。
中的 BookingDialog
程式代碼不會在此顯示,因為它與中斷處理不直接相關。 它用來提示使用者輸入預約詳細數據。 您可以在 dialogs/bookingDialogs.js 中找到該程式代碼。
MainDialog.java
當新的訊息活動到達時,Bot 會執行 MainDialog
。
MainDialog
提示使用者需要什麼幫助。 然後,以下所示,它在MainDialog.actStep
方法中啟動BookingDialog
,並呼叫beginDialog
。
警告
您要尋找的範例看起來已經移動! 放心,我們正在努力解決這個問題。
接下來,在MainDialog
類別的finalStep
方法中,當預約對話框結束後,預約被視為已完成或已取消。
警告
您要尋找的範例看起來已經移動! 放心,我們正在努力解決這個問題。
中的 BookingDialog
程式代碼不會在此顯示,因為它與中斷處理不直接相關。 它用來提示使用者輸入預約詳細數據。 您可以在 BookingDialogs.java 中找到該程式代碼。
dialogs/main_dialog.py
當新的訊息活動送達時,Bot 會執行 MainDialog
。
MainDialog
提示使用者其能提供的協助。 然後它會在act_step
方法中啟動bookingDialog
,並呼叫begin_dialog
如下所示。
警告
您要尋找的範例看起來已經移動! 放心,我們正在努力解決這個問題。
接下來,在final_step
類別的MainDialog
方法中,預約對話框已結束,預約因此被視為完成或取消。
警告
您要尋找的範例看起來已經移動! 放心,我們正在努力解決這個問題。
處理非預期的錯誤
配接器的錯誤處理程式會處理 Bot 中未攔截的任何例外狀況。
AdapterWithErrorHandler.cs
在範例中,配接器處理程式 OnTurnError
會收到 Bot 回合邏輯擲回的任何例外狀況。 如果發生例外狀況,處理程式會刪除目前對話的狀態,以防止 Bot 因為進入錯誤狀態而陷入錯誤迴圈。
警告
您要尋找的範例看起來已經移動! 放心,我們正在努力解決這個問題。
index.js
在範例中,配接器處理程式 onTurnError
會收到 Bot 回合邏輯擲回的任何例外狀況。 如果丟出異常,處理程式會刪除目前交談的狀態,以防止 Bot 卡在由於處於不良狀態引起的錯誤迴圈中。
警告
您要尋找的範例看起來已經移動! 放心,我們正在努力解決這個問題。
藉由在此範例的 Application.java 中,向 Spring 架構註冊一個 AdapterWithErrorHandler
BotFrameworkHttpAdapter
,配接器的 onTurnError
處理程序可以接收到 Bot 回合邏輯擲回的任何例外狀況。 如果拋出例外狀況,處理程式會刪除並重置目前交談的狀態,以防止機器人因狀態不佳而卡在錯誤迴圈中。 在 Java SDK 中,AdapterWithErrorHandler
被實作為 SDK 的一部分,並包含在 com.microsoft.bot.integration 套件中。 如需此配接器實作的詳細資訊,請參閱 Java SDK 原始程式碼。
adapter_with_error_handler.py
在範例中,轉接器的處理常式 on_error
會接收 Bot 執行過程中拋出的任何例外。 如果拋出例外,處理程式會刪除當前交談的狀態,以防止 Bot 卡在狀態不良引起的錯誤迴圈中。
警告
您要尋找的範例看起來已經移動! 放心,我們正在努力解決這個問題。
註冊服務
Startup.cs
最後,在 Startup.cs
中,Bot 被建立為暫時性的,並且在每一回合中都會建立 Bot 的一個新實例。
警告
您要尋找的範例看起來已經移動! 放心,我們正在努力解決這個問題。
如需參考,以下是呼叫中用來建立上述 Bot 的類別定義。
警告
您要尋找的範例看起來已經移動! 放心,我們正在努力解決這個問題。
警告
您要尋找的範例看起來已經移動! 放心,我們正在努力解決這個問題。
警告
您要尋找的範例看起來已經移動! 放心,我們正在努力解決這個問題。
index.js
最後,在 index.js
中,會建立 Bot。
警告
您要尋找的範例看起來已經移動! 放心,我們正在努力解決這個問題。
如需參考,以下是呼叫中用來建立上述 Bot 的類別定義。
警告
您要尋找的範例看起來已經移動! 放心,我們正在努力解決這個問題。
警告
您要尋找的範例看起來已經移動! 放心,我們正在努力解決這個問題。
警告
您要尋找的範例看起來已經移動! 放心,我們正在努力解決這個問題。
Application.java
最後,在 Application.java
中,會建立 Bot。
警告
您要尋找的範例看起來已經移動! 放心,我們正在努力解決這個問題。
如需參考,以下是呼叫中用來建立上述 Bot 的類別定義。
警告
您要尋找的範例看起來已經移動! 放心,我們正在努力解決這個問題。
警告
您要尋找的範例看起來已經移動! 放心,我們正在努力解決這個問題。
警告
您要尋找的範例看起來已經移動! 放心,我們正在努力解決這個問題。
app.py 最後,在 app.py
中,會建立 Bot。
警告
您要尋找的範例看起來已經移動! 放心,我們正在努力解決這個問題。
如需參考,以下是呼叫中用來建立 Bot 的類別定義。
警告
您要尋找的範例看起來已經移動! 放心,我們正在努力解決這個問題。
警告
您要尋找的範例看起來已經移動! 放心,我們正在努力解決這個問題。
警告
您要尋找的範例看起來已經移動! 放心,我們正在努力解決這個問題。
測試聊天機器人
- 如果您尚未這麼做,請安裝 Bot Framework 模擬器。
- 在本機電腦上執行範例。
- 啟動模擬器、連線至 Bot,並傳送訊息,如下所示。
C#、JavaScript、Python 或 Java 中的 24.bot-authentication-msgraph 範例會示範如何處理註銷要求。 它會使用類似此處所示的模式來處理中斷。
您應該傳送預設回應,而不是不執行任何動作,讓使用者想知道發生了什麼事。 默認回應應該告訴使用者 Bot 瞭解哪些命令,讓使用者可以回到正軌。
在回合內容的任何時間點,回合內容的 響應 屬性會指出 Bot 是否已在此回合傳送訊息給使用者。 回合結束之前,您的 Bot 應該傳送一些訊息給使用者,即使是對其輸入的簡單確認。