Bot Framework Composer でボット開発 : その 5 割り込みの対応

[前回](https://qiita.com/kenakamu/items/365eca63f5a2951b4fc0)の記事では、ボットからの応答文章の作成について、Language Generator の使い方を見ていきました。今回は割り込みの対処について紹介します。

# 割り込み (グローバルコマンド)

ダイアログの途中であっても、ユーザーは「キャンセル」や「使い方・ヘルプ」などのメッセージをボットに送ることがあります。この場合、ボットは正しくユーザーの意図を判断して処理をします。

## キャンセル

キャンセルのメッセージが来た場合、ボットは現在のダイアログをキャンセルして親ダイアログに戻る必要があります。またメモリオブジェクトの削除など、キャンセルに必要な処理を合わせて行います。

## ヘルプ

ヘルプのメッセージが来た場合、ボットはボット自体のヘルプや、現在のダイアログに関するヘルプを出す必要があります。またヘルプメッセージを出した後は、ダイアログの処理に戻すことが多いです。

# キャンセルの対応

まずキャンセルから見ていきます。

## キャンセルダイアログ

1\.「New Dialog」より「Cancel」ダイアログを追加。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/76e176e4-66fd-d5a2-76c2-c2a6e8b862fd.png)

2\. 追加したキャンセルダイアログの BeginDialog トリガーを開き、「Confirmation」を追加し、メッセージを設定。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/c6a46795-3ba3-871b-a99a-9898a5e21b40.png)

3\. ユーザーインプットより ```conversation.cancel``` を指定。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/bc451a65-041a-7049-5373-123ec3a4a84d.png)

4\. If/Else 分岐アクションを追加。条件に ```conversation.cancel``` を指定。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/da0f430f-468b-7480-7f6e-ffa3f830a3a5.png)

5\. True ブランチでメッセージを送信。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/8486c4c3-e7f5-ac95-bfe9-1c721e825855.png)

6\. ダイアログ管理より「Cancel all dialogs」アクションを追加。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/33057e35-84fa-ffa3-8a4f-a0d7bf5beacc.png)

## トリガーと割り込み許可を設定

1\. メインダイアログより新しく「Cancel」トリガーを追加。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/b2602793-c10e-090b-09e3-b89a46093c96.png)

2\.「Cancel」ダイアログの開始を追加。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/2a316395-c107-a207-7bf5-777b00a34c61.png)

3\. プロファイルダイアログの BeginDialog トリガーで初めのユーザーインプットを選択し、「Other」を選択。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/bc7d9dba-5d2a-bfd4-1998-14242960a7dd.png)

4\. オプション下部にある「Allow interruptions」を「true」に設定。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/52c06748-6d8f-77e9-56e5-4309bf87e7a6.png)

現在は名前を聞かれた場合にのみ割り込みを許可しているため、他の箇所でも割り込みを許可したい場合は、同じ作業を繰り返す必要があります。

## 動作確認

1\. ボットを再起動してエミュレーターで検証。登録から初めて、途中でキャンセルを送信。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/785ebc37-25cd-4126-a944-3f748ae9668d.png)

2\.「はい」を選択した場合は元に戻り、メモリオブジェクトにも dialog はない。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/eb788a41-1fa4-1410-f6d2-91b80e9c53dd.png)

3\.「いいえ」を選択した場合はプロファイルダイアログに戻る。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/ed7971e5-118b-c2de-b3cc-c308612d482f.png)

4\. 割り込みを許可を設定していない場所では割り込みが発生せず、LUIS の処理もないことを確認。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/31885cd8-44b0-37d5-ae5e-61f52c8e9101.png)


## LUIS 閾値の設定

初期設定ではプロファイル登録で処理を継続した場合、入力した名前が「Cancel」インテントとして分類されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/d84fbb74-57eb-9ddc-9c9c-b967da83a686.png)

この問題は、インテントの閾値を設定することで対応できます。

1\. メインダイアログのキャンセルトリガーを選択し、「Condition」に ```#Cancel.Score > 0.8```を設定。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/91a43f6a-5147-ddb6-b3a4-9bfe3a6d1ae4.png)

2\. ボットを再起動して検証。LUIS の認識閾値が 0.8 を下回る場合にダイアログが続く点を確認。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/65925a8f-66e8-8793-78e6-cd219a93ac2a.png)

# ヘルプの対応

キャンセル同様にヘルプも対応します。

1\. ヘルプダイアログを追加。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/aa81bb02-2c21-3bfb-ec32-74696d58460e.png)

2\. ヘルプメッセージを返信するように設定。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/da8c87b0-35f5-577d-edc2-19e3d39ac649.png)

3\. メインダイアログよりトリガーを作成。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/0307a6de-3919-7238-0f6d-e8a50f427f61.png)

4\. ヘルプダイアログの起動アクションを追加。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/9d2af915-1255-d004-82f1-80a9e4b7bc82.png)

5\. ボットを再起動して検証。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/3121a2be-6022-d454-e2ab-6b44444ea96c.png)

# まとめ

今回は割り込みの処理を見ていきました。割り込み(グローバル)コマンドをうまく処理することで、ユーザビリティが上がる為、少なくともヘルプとキャンセルは実装してみてください。次回はボットの記憶領域であるメモリについて見ていきます。

[次の記事へ](https://qiita.com/kenakamu/items/87cf57267be213653129)
[目次へ戻る](https://qiita.com/kenakamu/items/6dc043cfc1f199032883#bot-framework-composer)