Watson Assistant でAIチャットボットを 作ってみた(第5弾)|シナリオ型(絞り込み)会話の作成

AI

ワトソンアシスタントでAIチャットボットを作ってみた第5弾として、シナリオ型の会話を作成してみようと思います。すなわちユーザーに質問を投げかけ、その回答内容によって話題が分岐し、情報を絞り込んで行くような会話をさせてみたいと思います。

まずは以下のテスト画面の画像を見てください。

  1. 挨拶すると「80年代のHR/HMについて語ろう」と誘われる
  2. 「はい」か「いいえ」で答える
  3. 「はい」と答えると「ジャーマンメタル」と「ブリティッシュメタル」どちらが好きか聞かれ選択肢が出る。
  4. 「ジャーマンメタル」を選択すると、こんどは「アクセプト」か「ハロウィン」どちらが好きか聞かれ選択肢が出る

といった感じで答える内容、選択するものによって話が分岐して行く形式になっています。これがシナリオ型の会話です。

他に活用例として、ECサイトなどで客のニーズを聞きながら商品を絞り込んでいく使い方もできますね。

「サイズは?」「色は?」などを聞いて、客の欲しいものを提示するイメージです。ただし、商品数が多い場合は、EC側のシステムや商品DBと連携する必要が出てきます。

Dialog(ダイアログ)の画面で先ほどのシナリオの流れがどうなっているか見て見ましょう。

ノードの名前のつけ方を工夫して話の流れを可視化

各ノードの名前のつけ方を工夫してみました。<ユーザーの発言>と<チャットボットの発言>の概要を記入してあります。こうすることで、話の流れが可視化できるというわけです。

うまくノードの名前をつけないと、ツリー型になっているとはいえ、階層が深くなり、ノードの数が増えていくと全く話の流れが見えなくなる可能性がありますね。

「はい」か「いいえ」かで話の内容を変える

まず最初にユーザーが挨拶してきたら、挨拶を返して、80年代HR/HMについて語ろうよとユーザーを誘います。ユーザーが「いいよ」と了承してくれた場合と、「やだよ」と断られた場合で、チャットボットのACO(アコ)が態度を変えます。(笑)

この設定がどうなっているか見ていきましょう。

ちょっとEntity(エンティティ)画面に戻りますが、まず@Replyというエンティティを作成し、「はい」と「いいえ」を登録します。さらに、それぞれ同義語として、「いいよ」とか「やだよ」などいくつかの違う言い回しのもの登録しておきます。

上は、Dialog画面です。最初の挨拶のノードですが、#Greetingで挨拶がきた場合、テキストで返答するという設定になっていて、「80年代のHR/HMについて語らない?」と登録してあります。

これに対してのユーザーの返答を次のノードに設定します。

<If bot recognizes>のところに先ほど作成したエンティティの@Replyが入っています。

ここでポイントですが、コロンの後に「はい」とはいっていますが、このコロンはis(=)の意味です。<@Replyが「はい」の場合>ということですね。

これでユーザーが「はい」と答えた時、返答をするノードが出来上がりました。

ちなみに、ユーザーがはいと答えた場合は、チャットボットアコは、「あんたさいこー・・・」と喜びますが、いいえと答えた場合は、「ふん、そうかい!ならさっさと行っちまいな。・・・」といったかんじで不機嫌になります。(笑)

次は、選択肢を表示して選ばせて会話を分岐させる(情報を絞り込む)やり方です。

選択肢を表示し選んだ内容によって会話を分岐させる

上は、先ほど作成したユーザーが「はい」と答えた時のノードです。右側のエディット画面の下の方に<Add response type>というのがあるのでクリックすると、プルダウンが出てくるのでその中から<Option>を選びます。

そして追加されたOptionボックスの<Title>のところに「下から選んでね」と登録します。Descriptionは、さらに詳細を追加するためのものですが、今回は使用しません。

そして、<Add option>をクリックすると<List label>と<Value>の項目が出てきます。そこにそれぞれ、「ジャーマンメタル」と「ブリティッシュメタル」というヘビーメタルのジャンルを入力しました。

<List label>は、実際にアプリ側の画面上に表示されるテキストで、<Value>は、クリックされたときにワトソン側に返す値です。上の図の設定だと、テキストで「ジャーマンメタル」もしくは「ブリティッシュメタル」がワトソンに返されます。

さてここで返ってきたテキストを認識するためにやっておかなければならないことがあります。

「はい」「いいえ」の時と同じように、選択肢となるものをエンティティとして登録します。今回は、@Metal_genreというのを作成しました。

上の画面はDialog画面ですが、If bot recognizesに@Metal_genre:ジャーマンメタルが入っています。これで、テキストとしてジャーマンメタルが返ってきたら、このノードが動作して、アコが上機嫌の返答をします。

ユーザーの好みを把握

さらにこのノードでも好きなバンド名を聞いて、選択肢を表示して選ばせてといった感じで、どんどんユーザーの好みを把握していくわけですね。

ちなみに、アコは趣味が合うと、どんどん機嫌が良くなっていく設定にしよう(笑)。

発話に含まれている単語によって回答振り分け

それではもう一つ、一つのノードで回答内容を振り分けするやり方です。

同じ意図なんだけど、その発話に含まれる単語によって回答内容を変えるというものです。

まずは、条件とする発話に含まれる単語つまりエンティティの作成をします。今回は、@favoriteというエンティティを作成して、アーティストや曲などの単語を登録しておきます。

上の図を見てください。一つのノードで複数の回答が設定されています。好きなものを聞いてきた時というのを一つにまとめています。各回答の条件のところに、先ほど作成したエンティティが入っています。

もちろん、「好きな曲は?」「好きなバンドは?」といった感じで一つ一つQ&A形式で登録することもできますが、同じような質問はまとめておく方がメンテしやすくなるというメリットがあります。

これで「好きなバンドは」と聞かれたら、@favorite:バンドがヒットして、そこに登録されている回答内容が返ります。

ちなみにアコが好きなのは、カイハンセンとマイケルキスク時代のハロウィンとなっています。(笑)

ちなみに、どのようにすればこの設定ができるかというと、ノードのエディット画面の右上に<Customize>というのがあるのでそれをクリックすると下の画像のような画面が出てきます。

この画面の<Multiple responses>をオンにすることで、Then respond withのところが、変更されて、各条件と回答を複数登録できるようになります。

もう一つ、Slotsというのがありますが、これは次回紹介しますね。

Slot(スロット)は、いくつかの項目の内容が全て埋まったら(スロット・フィリング)、次の処理に進むような会話の時に使います。

例えば、レストランの予約などで
・人数
・時間
・予算
・コース
を聞いて全ての項目が埋まったら、予約の処理を完了するといったかんじです。

それでは次回お楽しみに!

コメント

タイトルとURLをコピーしました