こんにちは!Kore.ai シニアソリューションエンジニアの橋口です。
ユーザーが入力する内容によって対話の流れを変える、そういった設計の機会は非常に多いと思います。今回の開発トピックでは、ユーザーの入力内容に応じてメッセージやタスクを変更するような対話をどのように作っていくかについてご紹介します。
Kore.ai のバーチャルアシスタントプラットフォーム(以下プラットフォーム)では、ユーザーの入力を保持するために、エンティティノードという容れ物を用意しています。このノードには、
何を入れるか
入った内容に応じた分岐
を定義ができる機能が備わっています(ほんとはもっとたくさんあるのですが、それはまた別の投稿で!)。これらを活用して、ユーザー入力に応じた対話フローを設計していきます。早速見て参りましょう。
手始めに:自由な入力から対話の分岐を設計する
今回のご紹介用に、次のようなシナリオを考えてみましょう。
シナリオ:ウェブサイトに訪問したユーザーに、製品に興味を持ってもらうようなメッセージを出したい。製品の情報を、機能・事例・価格についてそれぞれメッセージを出すように設計し、ユーザーがどの情報を知りたいかを選択できるようにしたい。
これを、プラットフォームで設計するとこちらのようになります。緑色がエンティティノードです。青はメッセージノードといい、メッセージのみを表示する際に使うものです。エンティティノードから、4つの分岐があり、それぞれ別のメッセージが出力されるような設計です。
このとき、エンティティノードの分岐設計については以下のようにしています(画面を2つ左右につなげた画像にしています)。
ユーザーが入力した文字列が、このエンティティノード ety_userInput に格納されます。その後、
文字列が「機能」に等しければ、メッセージノード msg_prodDetailへ進みます。
それ以外のときに、文字列が「価格」に等しければメッセージノード msg_prodPriceへ進みます。
それ以外のときに、文字列が「事例」に等しければメッセージノードmsg_prodCaseに進みます。
この画像にはありませんが、上記のいずれでも無いときには、別のメッセージノードに進むようデフォルトルートの設定も行っています。
ではバーチャルアシスタントを動かして確認してみます。以下のような動きになりました。
「製品詳細を表示する」と入力してこの対話を起動し、「事例」や「機能」と入力すると、それぞれ意図したメッセージが表示されていることが画面からわかります。
しかし一方で、例えば「価格を知りたい」などのように入力すると、価格に関するメッセージは表示されずに、その他のメッセージが表示されています。これは、ユーザーからの入力が「価格」でなく、「価格を知りたい」となっているためです。この場合、ユーザーの意図は価格に関する情報なので、バーチャルアシスタントとしては価格に関する情報を出してあげることが求められます。
バーチャルアシスタントの精度を上げるアプローチ
比較的容易に思いつく方法としては、エンティティノードで格納した文字列に対して、特定の文字列のみを抽出するようなスクリプトを一つ挿入して、そこから分岐を行うものです。
オレンジ色のノードはボットアクションノードと呼ばれ、この中でAPIを用いたサービス呼び出しやスクリプトに基づいた処理が設計できます。灰色のノードがスクリプトノードです。JavaScriptを用いることができます。
このアプローチは自由度が高く、スクリプトによってカスタム処理を入れたり、特別なフラグを設置してよりパーソナライズされた体験をユーザーに提供することができるでしょう。しかし、スクリプトを書くことと、今回実現したいことの重さを考えると、スクリプト作成が重荷になることがあり、それは多くの場合当てはまるでしょう。
列挙型の値を使ってユーザー入力をガイドする
スクリプトを書くのは避けて、でもユーザーの入力や発話を取りこぼさないようにしたい。そのようなとき、エンティティノードの列挙型を使うことができます。
まず、エンティティノードのタイプを「List of Items (enumerated)」に指定します。この方式に変更すると、追加設定のアイコンが登場しますので、そちらをクリックすると、以下のような設定画面が表示されます。
この設定画面の、使用するキーと値の項目で、3つの設定を行います。
表示名:選択肢を画面に表示する場合、何と表示するか
値:選択肢が選ばれたとき、あるいはユーザーからの発話が一致したときに、何を値としてエンティティに格納するか
同義語:値の文字列の同義語およびそれ自身を設定する。これにより、ユーザーの発話に該当の文字列が含まれてたら、マッチさせる。
表示名を指定すると、自動的に値と同義語の欄に同じ文字列が格納されます。そのため、まずは表示名を決め、その後同義語を追加していきます。
この方式で行うと、大きく2つのメリットが見込めます。
ユーザーの入力や発話を、ボットが応対しやすいシナリオに寄せていくことができる
ユーザーの入力に対象の文字列が含まれていたら、必要な値のみをエンティティに設定することができる
それぞれ試して見ましょう。まず1点目について、以下のやり取りのように、ボットのメッセージに対して、「製品仕様について」や「製品を誰が作っているか知りたい」と問いかけたとしましょう。すると、ボット側には該当する文字列や同義語が見つけられないため、質問をやり直し、想定した対話に導いてあげることができます。通常このやり直しは5回で、回数はエンティティノード別に設定が可能です。
なお、先程の例では、ユーザーが選択肢を入力するような格好ですが、もう少し気を利かせて選択肢を出してあげることも可能です。エンティティノードの、値のリストを表示のプロパティで、「はい…」を選択します。
すると、次のように、選択肢がボタン形式で表示されます。こちらの表示内容が、先程列挙型の設定で行った「表示名」です。そしてユーザーがいずれかをクリックしたときにエンティティに格納される文字列が「値」で指定したものです。こちらの方が、ユーザー体験としてはより良いものとなるでしょう。
続いて2点目について、以下のやり取りをご覧ください。今回のケースでは、列挙型を指定したことにより、ユーザーの入力や発話に特定の文字列が含まれていれば、正しく対話の分岐を実現できています。この方法であれば、文字列をトリムするなどの処理を挟む必要もなく、対話設計がより容易に行えます。
エンティティノードの列挙型を使うことで、ユーザーの入力や発話に基づいた対話フローの設計が容易に行え、一方でユーザーから見ると、自由に入力をしてもボットが正確に意図を理解してくれる体験を得ることができます。
さいごに
今回は、エンティティノードの列挙型についてご紹介しました。対話フロー設計にお役立て頂ければ嬉しいです。Kore.aiのプラットフォームには、ユーザーの問い合わせ体験を最高位に持っていく強力なツールが揃っています。今後も紹介して行きますので、お付き合いください。
さて、ブログ「Kore.ai、ガートナーマジッククアドラントで最高位に!」にも記載いたしましたがガートナーのマジッククアドラントで最高位に位置されました。 Enterprise Conversational AI Platform (CAIP)- エンタープライズ対話型AIのカテゴリは今まさにスタートを切ったところですが、日本のお客様にも徐々に認知度があがってきております。
対話型AIについてもっと知りたい方は、ぜひこちらから弊社までご連絡ください。
Comments