Bot Framework Composer でボット開発 : その 3 ユーザー入力の理解

[前回](https://qiita.com/kenakamu/items/2cbdc046efa663b49968)はダイアログとトリガーについて紹介しました。今回は Bot Framework Composer がどのようにユーザー入力をハンドルするかについて紹介します。

# ユーザー入力の理解

ユーザーがボットにメッセージを送る場合、以下の 2 パターンがあります。

- 知りたいことを聞いたり、命令を送る (トリガー)
- ボットからの要求に応じて答えを送る (インプット)

それぞれ異なる対応が必要となります。

# トリガーへの対応

「朝8時に目覚ましをセットして」や「キャンセルして」など、ユーザーが意図をもってボットにメッセージを送る場合、それはトリガーとして認識され、関連するダイアログを起動する必要があります。Bot Framework Composer では Recognizer という機能でこれらを認識します。

Recognizer は以下 2 種類の認識方式を提供します。

- 正規表現 (Regular Expression)
- Azure Language Understanding (LUIS) ベースの自然言語処理

## 正規表現

まずは正規表現を試します。[前回](https://qiita.com/kenakamu/items/2cbdc046efa663b49968) オウム返しボットに追加した、Time ダイアログを呼びだすものを追加します。

1\. メインダイアログを選択し「Recognizer Type」より「Regular Expression」を選択。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/d6e71e31-9ede-dc67-e517-114a8831bed2.png)

2\.「New Triggger」をクリック。「Intent recognized」で以下画像のように値を入力。「Submit」をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/61276c3b-a912-4e00-ea45-62fcb0e479cf.png)

3\. トリガー直後にダイアログ開始アクションを追加。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/5f78b9d9-3dc6-65c8-6e5f-b4722ae6256f.png)

4\. Time ダイアログを選択。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/86b40b17-7300-0d85-e540-21a43d5f60ee.png)

5\. ボットを再起動してエミュレーターでテスト。メッセージ送信後に「Regex RecognizerResult」があることと、Intent で Time が取得されていることを確認。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/a9eb9b8c-f6ce-4da1-b287-d8193397b98b.png)

6\. 正規表現のため、他にも「時間」を含む言葉を試す。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/82ba126e-0a87-120a-ec33-1f176c27b422.png)

7\. 部分一致をサポートする正規表現ではないため、「時刻」などでは反応しないことを確認。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/4e5119ed-11e9-7af1-0c99-33d538f90aac.png)

次に正規表現で「時」または「間」に反応するようにします。

1\. Time の「Trigger Phrase」を「[時間]」に変更。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/0db11881-5572-a47e-fdbe-58dc3be7f17e.png)

2\. エミュレーターで検証。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/6ea36187-b8b7-0930-865d-99c66330af97.png)

正規表現のテストは [https://regexr.com/](https://regexr.com/) がお勧めです。

## LUIS

より柔軟な自然言語対応をしたい場合は、LUIS が利用できます。

### LUIS の準備

1\. [LUIS ポータル](https://www.luis.ai/) よりサインインまたはサインアップ。

2\. 右上の名前アイコンより「Setttings」をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/c744226f-c79b-8249-e7f4-e519c45a4961.png)

3\. Primary Key をコピーしておく。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/1953e291-4fac-4340-9030-95d013e2d2e8.png)

### LUIS の利用

1\. メインダイアログの「Recognizer Type」より「LUIS」を選択。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/463f25c4-d81a-c86a-c2b0-51d1988be6d9.png)

2\. Time トリガーを選択して、候補となる例文を入力。ハイフンを頭につける
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/5fdf0b10-5d9a-ac1c-e665-e27c60e054ac.png)

```text
- 時間は？
- 今何時？
- 現在時刻
- いまなんじ？
- 今の時間は？
```

3\. メニューより「User Input」を選択すると、インテントと例文が表示されることを確認。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/dcc8da5f-761e-af12-a3d0-ec9e0ec2a0c9.png)

4\. メニューより「設定」を選択。「Show keys」を選択して編集モードに。「defaultLanguage」を「ja-jp」に、「authoringKey」を先ほどコピーしたキーにする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/a9f4ffb1-04f1-4f28-514d-b8016dba4096.png)

5\.「Restart Bot」をクリックすると、Bot Framework Composer が裏で LUIS アプリを作成。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/2eeb06b3-15d4-9b3e-99a1-4c9fc43ba73e.png)

6\. インテントの作成だけでなく、トレーニングと公開まで行ってくれる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/d67828bd-9068-9599-f874-97b93cd50d32.png)

7\. エミュレーターより検証。例文と異なる文言でも解析してくれることを確認。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/142d0b6c-86c1-a870-c7c8-f3f2404cbbbd.png)

# インプットへの対応

次にボットから質問された内容に対する回答について見ていきます。この場合重要な処理は以下の通りです。

- 期待した型のデータが返ってきたか
- 期待しないデータの場合、再試行するか
- 再試行の最大を超えても失敗する場合、どのように処理するか
- 結果をどこに保存するか

上記の課題を解決するため、Bot Framework Composer では「Ask a question」アクションでユーザーとのやり取りをサポートします。
<img width="450" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/6a46d993-6a17-c6ad-f9bc-75ac6fd41426.png"/>

また user/conversation などのメモリオブジェクトに結果を保存できます。

- user: ユーザー単位でボットに保存されていて消えない
- conversation: 会話単位で保存されるため、会話が新しくなると消える

ユーザー情報の登録ダイアログを作ってみましょう。

## ダイアログの追加と名前の確認

1\. 新規に Profile ダイアログを追加。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/f8547b9d-f29c-9444-3640-c527f2ede855.png)

2\. Profile ダイアログの BeginDialog トリガーを選択。「Text Input」アクションを追加。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/31e8fb92-8cc5-6902-9da6-cc43e40ff13a.png)

3\.「Bot Asks」にボットからのメッセージを追加。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/9c81df24-0b42-d126-cf74-bfe1c1b429bf.png)

4\.「User Input」で入力を保存する先として user.name を指定。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/30ce90b1-c719-131f-3996-4c2bbb2e4c5c.png)

5\.「Other」にルールを追加。条件は入力した後、Enter 押下を忘れずに。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/089e77cf-ad37-a2e6-b713-b2c2403c1bf3.png)

6\. メインダイアログより新しいトリガーを作成。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/b2a3e78c-09da-fa1b-f0e6-1242f5c78b5b.png)

7\. ダイアログ起動アクションで Profile ダイアログを起動。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/f523944e-a0fd-853b-2fb5-c30cc4fc83a0.png)

8\. ボットを再起動してエミュレーターで検証。新規ユーザーとして接続した場合、user オブジェクトにデータがないことを確認。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/76453448-f3b4-6f3c-634d-ad127cba3ac2.png)

9\. Profile ダイアログで名前を入力すると、user オブジェクトにデータができる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/b4c44c34-12e9-95d4-7be8-8808f5a28200.png)

10\. エミュレーターで「Restart Conversation - Same User ID」を選択。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/eb95bb50-2903-94e3-600d-e2c1f8987418.png)

11\. 会話開始直後も user オブジェクトにデータがあることを確認。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/ab1576b4-ebfb-8d78-80f5-8f0a9d77e58b.png)

12\. 条件に合わない名前を入れた場合の動作も確認。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/8fa294fb-3bf5-971f-dd4d-a76f540aeac4.png)

## 飼っている猫の数を確認

次にペットの猫の数を確認しましょう。

1\. プロファイルダイアログの BeginDialog で「Number input」アクションを追加。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/9f1db4e9-7a37-4feb-0375-79287b75858f.png)

2\. ボットからの応答を追加。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/404c137a-d994-8ce0-b1a7-685a7054f6c3.png)

3\. ユーザー入力を設定。user.profile.numOfCats に値を保存。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/d4024995-f7dd-fd39-65ec-410502fb3c6f.png)

4\. ボットを再起動してエミュレーターで検証。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/a5d131e8-699d-31d7-4891-d1089f54dc8d.png)

## さらに猫が欲しいか確認

最後に確認アクションを使ってみます。

1\. 引き続き「Confirm」アクションを追加。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/04b71cdf-da64-dc7b-5fdf-4d11fca3cd97.png)

2\. 既に取得した入力も使って確認メッセージを作成。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/3b903ef6-7722-d388-c3b1-4ea3f405d1f5.png)

3\. ユーザー入力を設定。

- user.profile.moreCats に保存
- defaultLocale: 選択肢の言語

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/3c45f551-5ec2-8968-a66f-d07637f09ed7.png)

4\. ボットを再起動してエミュレーターで検証。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/54e50a9c-58d9-f498-bc84-b19e80558219.png)

5\. 選択肢をクリックして、メモリを確認。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/b87cb699-8fcd-6c30-c308-d132a7ab88f5.png)

# まとめ

今回はユーザー入力がどのようにハンドルされるかを見ていきました。ダイアログ途中で「キャンセル」や「ヘルプ」などの割り込み処理も対応する必要がありますが、別の記事で紹介します。
次回は応答の作成について見ていきます。

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