前回はダイアログとトリガーについて紹介しました。今回は Bot Framework Composer がどのようにユーザー入力をハンドルするかについて紹介します。
ユーザー入力の理解
ユーザーがボットにメッセージを送る場合、以下の 2 パターンがあります。
- 知りたいことを聞いたり、命令を送る (トリガー)
- ボットからの要求に応じて答えを送る (インプット)
それぞれ異なる対応が必要となります。
トリガーへの対応
「朝8時に目覚ましをセットして」や「キャンセルして」など、ユーザーが意図をもってボットにメッセージを送る場合、それはトリガーとして認識され、関連するダイアログを起動する必要があります。Bot Framework Composer では Recognizer という機能でこれらを認識します。
Recognizer は以下 2 種類の認識方式を提供します。
- 正規表現 (Regular Expression)
- Azure Language Understanding (LUIS) ベースの自然言語処理
正規表現
まずは正規表現を試します。前回 オウム返しボットに追加した、Time ダイアログを呼びだすものを追加します。
1. メインダイアログを選択し「Recognizer Type」より「Regular Expression」を選択。
2.「New Triggger」をクリック。「Intent recognized」で以下画像のように値を入力。「Submit」をクリック。
5. ボットを再起動してエミュレーターでテスト。メッセージ送信後に「Regex RecognizerResult」があることと、Intent で Time が取得されていることを確認。
7. 部分一致をサポートする正規表現ではないため、「時刻」などでは反応しないことを確認。
次に正規表現で「時」または「間」に反応するようにします。
1. Time の「Trigger Phrase」を「[時間]」に変更。
正規表現のテストは https://regexr.com/ がお勧めです。
LUIS
より柔軟な自然言語対応をしたい場合は、LUIS が利用できます。
LUIS の準備
1. LUIS ポータル よりサインインまたはサインアップ。
2. 右上の名前アイコンより「Setttings」をクリック。
LUIS の利用
1. メインダイアログの「Recognizer Type」より「LUIS」を選択。
2. Time トリガーを選択して、候補となる例文を入力。ハイフンを頭につける
- 時間は?
- 今何時?
- 現在時刻
- いまなんじ?
- 今の時間は?
3. メニューより「User Input」を選択すると、インテントと例文が表示されることを確認。
4. メニューより「設定」を選択。「Show keys」を選択して編集モードに。「defaultLanguage」を「ja-jp」に、「authoringKey」を先ほどコピーしたキーにする。
5.「Restart Bot」をクリックすると、Bot Framework Composer が裏で LUIS アプリを作成。
6. インテントの作成だけでなく、トレーニングと公開まで行ってくれる。
7. エミュレーターより検証。例文と異なる文言でも解析してくれることを確認。
インプットへの対応
次にボットから質問された内容に対する回答について見ていきます。この場合重要な処理は以下の通りです。
- 期待した型のデータが返ってきたか
- 期待しないデータの場合、再試行するか
- 再試行の最大を超えても失敗する場合、どのように処理するか
- 結果をどこに保存するか
上記の課題を解決するため、Bot Framework Composer では「Ask a question」アクションでユーザーとのやり取りをサポートします。
また user/conversation などのメモリオブジェクトに結果を保存できます。
- user: ユーザー単位でボットに保存されていて消えない
- conversation: 会話単位で保存されるため、会話が新しくなると消える
ユーザー情報の登録ダイアログを作ってみましょう。
ダイアログの追加と名前の確認
2. Profile ダイアログの BeginDialog トリガーを選択。「Text Input」アクションを追加。
4.「User Input」で入力を保存する先として user.name を指定。
5.「Other」にルールを追加。条件は入力した後、Enter 押下を忘れずに。
7. ダイアログ起動アクションで Profile ダイアログを起動。
8. ボットを再起動してエミュレーターで検証。新規ユーザーとして接続した場合、user オブジェクトにデータがないことを確認。
9. Profile ダイアログで名前を入力すると、user オブジェクトにデータができる。
10. エミュレーターで「Restart Conversation - Same User ID」を選択。
11. 会話開始直後も user オブジェクトにデータがあることを確認。
飼っている猫の数を確認
次にペットの猫の数を確認しましょう。
1. プロファイルダイアログの BeginDialog で「Number input」アクションを追加。
3. ユーザー入力を設定。user.profile.numOfCats に値を保存。
さらに猫が欲しいか確認
最後に確認アクションを使ってみます。
3. ユーザー入力を設定。
- user.profile.moreCats に保存
- defaultLocale: 選択肢の言語
まとめ
今回はユーザー入力がどのようにハンドルされるかを見ていきました。ダイアログ途中で「キャンセル」や「ヘルプ」などの割り込み処理も対応する必要がありますが、別の記事で紹介します。
次回は応答の作成について見ていきます。