RPA BANKをご覧のみなさま、こんにちは!「最近AIが気になって仕方がない」とウズウズしているものの、「ドコにもスキがないピリッとした雰囲気」になかなか一歩を踏み出せないでいる、そんなみなさまに向けたお気楽AI解説連載『さるでき流 AIのはじめかた』、第9回を迎えました。

チャットボット作りをはじめて早数ヶ月。光の速さで進歩を続けるIT業界において、この連載は時が止まっているかのように「のんびりと」歩を進めておりますが、その間にも状況は刻一刻と変化しておりましてね。

第一シーズンで見てきたRPAは、既に「RPAツール」という枠組みを飛び越えて、最近では各種クラウドサービスのAPIを活用した、よりシンプルで、より柔軟な組み合わせが可能な、新しい『自動化サービス』へと進化を続けているようです。

コロボ「先生。我々はこのままで良いのでしょうか?」
ワトソン「このままで、と言いますと?」
コロボ「例えば流れに便乗して『Power Automate※』を紹介してみる、とか」
ワトソン「シッ!それはコッソリと、バレないようにやりましょう」
(※Microsoft社製の自動化サービス)

……コホン。さてさて、Watson Assistantを使ったお手製チャットボット作りもいよいよ大詰めです。前回はクローズド・クエスチョンで会話をリードしていくために、「選択肢型のダイアログ」の設定を行ってみました。

今回は残された大きな機能のひとつである、『エンティティ』をチェックします。このパートをクリアすれば、Watson Assistantの基本となる機能を、ある程度は網羅したことになります。実装まであと一息、ラストスパートを頑張っていきましょう!

ではでは、いつもどおりWatson AssistantサービスのManage画面にある『Watson Assistantの起動』ボタンをポチッと押して、Watson Assistantツールをオープン。チャットボット作りを続けていきまーす。

【エンティティとは】
まずは、「エンティティ」についての基本的な考え方を押さえておきましょう。エンティティというのは、インテントと同じく「スキル」の中に含まれるもので、『実体』の意味を持つ言葉です。インテントと同様に、「ダイアログ」の中に組み込んで使うことができます。

そして、インテントと同じように、チャットボット内ではユーザーからの入力に対して、「今の発言は【このエンティティ】に該当します」と反応し、その反応に応じて、チャットボットからの「返信内容」を設定することが可能になっています。

……なんだかコレ、見れば見るほどインテントとそっくりですね。

ちなみに、Watson Assistantのドキュメントに目を通すと、エンティティの部分にはこんなことが書いてあります。

「インテントが動詞(ユーザーが希望するアクション)を表す場合、エンティティーは名詞(アクションの対象物またはコンテキスト)を表します。例えば、インテントが天気予報の取得のときは、アプリケーションで正確な予報が返されるようにするには、関連する場所と日付のエンティティーが必要です。」

……うーむ。わかったような、イマイチわからないような。ワタシも違いを理解するためにアレコレ試してみましたが、とりあえず最初は以下のような感じで理解しておくのが良さそうです。

「インテントと同じような機能を持っていて、①インテントよりも『プログラム寄りの使い方』をするもの、そして、②インテントよりも『ユーザーの具体的な情報が欲しいとき』に使うもの、です」

ここで言う「プログラム」というのは、例えば「条件分岐」や「変数への値の格納」のような、「プログラム処理の中で使う要素」のことだと思ってください。平たく言ってしまえば、『複雑な処理をしたいときには、エンティティを使うと良いかも』ということですね。

……おっと、なんだか逆にヤヤコシクなった気がしなくもないですので、実際の画面を見ながら確認していきましょうか。では、サイドバーのメニューにある「My entities」から、エンティティの設定画面をどうぞ!

【エンティティの設定】
エンティティもインテントと同じように、エンティティの「名前」と、そのエンティティに含まれる「値」を設定していきます。インテントの場合は、「例題」を積み上げることで、ひとつの「意思」の形にしましたが、エンティティの場合はその「状況」に含まれる具体的な「値」を書いていくようなイメージです。

例えば、「天気」というエンティティを設定する場合、「晴れ」「曇り」「雨」というのが「値」になります。インテントと違って、「晴れ」「曇り」「雨」と積み上げていって、「これは天気だ!」と連想ゲームをやるものではないので、なるべく具体的な値(種類)を設定するほうが、後で使いやすいエンティティになります。

設定画面にある「Synonyms(シノニム)」というのは、「類義語」という意味ですね。設定した「値」に対して、同じ意味を持つ単語がある場合、シノニムとしていくつでも設定しておくことが可能です。

「Type」の欄をクリックすると、もうひとつ「Patterns(パターン)」という項目が出てきます。これは「形式」のことを意味しているのですが……いきなり設定するのはかなりムズカシイ項目ですので、ここではひとまず見なかったことにしておいて、サイドバーからもうひとつのエンティティメニュー、「System entities」の画面を開いてください。

何やら複雑な値が並んでいますねー。インテントの時にも似たようなセットがありましたが、これらはWatson Assistantが最初から用意してくれている特別なエンティティ達です。

下の方にある、「@sys-date(日付)」「@sys-time(時間)」という項目を見てください。例えばこの項目で説明をすると、これらはユーザーが「2020年2月1日」とか、「12時半」とか、特定の形式で文字を入力してきたときに、「これは日付」、「これは時間」と、反応するエンティティです。

「日付」や「時間」は、ユーザーからの具体的な情報として頻繁に取得する機会がある項目なのですが、様々な表現形式があって取得設定が複雑になるので、あらかじめWatson Assistant側でエンティティを用意してくれている、ということですね。こういう特別な形式の項目の取得設定をするために、先程の「パターン」が使われます。例えば、「電話番号」や「メールアドレス」のような情報が必要な場合は、パターン設定を駆使するわけです。

では今回は、「@sys-date」と「@sys-time」の項目を「ON」にしておきましょう。

ここまでできたら、次はダイアログ画面に移動です。

【ダイアログの設定】
エンティティを使ったダイアログの組み立て方には様々なバリエーションがあるのですが、今回はエンティティの仕組み自体がよくわかるように、ちょっとだけ「カスタマイズ」したノードを設定してみます。

「Add node」ボタンを押してノードを追加し、それを「ようこそ」ノードのさらに上、処理上一番優先度が高い「先頭」に移動しましょう。

ノードを開いて、ノードの名前を「あなたの状況を教えて」に設定します。次に、「If assistant recognizes」、このノードが認識されるタイミングを「welcome」、つまり「チャット開始時」に設定しましょう。(welcomeノードが2つになってしまいましたが、こちらのノードをようこそノードの「上」に設置したので、ようこそノードは無視されます)

ここから少し複雑になりますよ。ノードの名前の横にある「Customize」ボタンを押して、ノードの「カスタマイズ画面」を開きます。

「Slots」という項目があるので、スイッチを「ON」にします。

この「スロット」というのは、ユーザーから情報を収集するための便利機能で、スイッチをONにすると、ノードの設定画面が以下のように変化します。

「Then check for」という場所ができましたね。中には以下のような複数の項目を持つ「スロット(行)」が表示されています。

「IF NOT PRESENT, ASK」:ここに質問を書きます。この質問がユーザーに表示されます。
「CHECK FOR」:ここにインテントやエンティティを設定します。ユーザーの入力内容に対して反応させます。
「SAVE IT AS」:ここに変数を設定します。ユーザーからの入力に反応したインテントやエンティティの結果を、ここに設定した変数に格納します。

これらの項目が、収集したい情報のワンセット(1スロット)となります。スロットは「Add slot」ボタンで増やせますので、欲しい情報の数だけ設定しましょう。

ユーザーとのやりとりを進めて、最終的にすべての情報を収集できたら、いつもどおり「Assistant responds(アシスタントからの回答)」で返信を行います。単なる文章を返信しても良いのですが、スロット内で設定した「SAVE IT AS」の変数を返信に加えることも可能です。

おお、大分プログラムっぽくなってしまいましたね……。頭がズキズキしてくる前に、「テスト機能」で試してみることにしましょう!

【テストしてみよう!】
いつものように「Try it!」ボタンを押して、テスト画面をニョキッと引っ張り出しましょう。すると早速、最初のスロットに設定した質問が飛んできましたよ。

Q:今日は何月何日ですか?
A:2月1日です。

ふむふむ、「@sys-date」エンティティが反応していますね。「2月1日」と入力しましたが、表示形式(フォーマット)が自動的に「2020-02-01」に変換されました。

Q:今の時間を教えて下さい。
A:12時半です。

続けて、「@sys-time」エンティティが反応しています。こちらも表示形式が「12:30:00」に変換されています。

Q:外は晴れですか?曇りですか?雨ですか?
A:どんよりです。

最後は、今回オリジナルで作った「@天気」エンティティが反応しています。「どんより」というシノニム(類義語)を入力しましたが、メインの「値」である「曇り」に変換されました。

これですべてのスロットが埋まりましたので……

コロボ君からの返信が返ってきましたよ!

変数の部分については、入力した文字をそのまま格納するのではなく、ちゃんと対応するエンティティの「値」に変換しているようです。つまり、「ぐずぐず」「重苦しい」「雲が厚い」と、曇りのシノニムをもっと追加していけば、様々な表現で入力される「曇り」の情報を、より正確に「曇り」として取得することができるようになる、というわけですね。

画面上、インテントと同じように、「今何のエンティティが反応したか」がわかるようになっていますので、みなさまも様々な表現を入力してみて、反応をチェックしてみてくださいね。

【今回のまとめ】
おつかれさまでした!今回もなかなか噛みごたえのある内容でしたね。Watson Assistantでは、「インテント」と「エンティティ」を組み合わせて様々なダイアログを作っていくのですが、ご覧いただいた通り、この2つの違いが実にわかりにくいのです。

今回詳しくは触れていませんが、基本的にインテントの方は、「(意味合い的に)含まれているかどうか」という判定をするのに対して、エンティティの方は、「(値として)含まれる」だけではなく、「=(イコール)」「≠(ノットイコール)」「>(多い)」「<(少ない)」のような、プログラム処理でおなじみの条件設定もできるようになっています。

全部を使いこなそうと思うと、少々……いや、それなりに……プログラミングの知識が必要になりますので、とりあえず、「インテントで大きく範囲を絞ったら、スロットとエンティティを使って細かい情報を取得していく」くらいの認識で設定をしてみるのが、入り口としてわかりやすいのではないかと思います。みなさまもぜひ、挑戦してみてくださいね。

さて、このチャットボット連載もはじまって既に9回目。ある程度基本となる機能も触りましたし、そろそろ何らかの「形」にしたくなってきましたよね。テスト機能で確認するだけではやっぱり少し寂しいですし。

ということで、次回は今までのまとめと、Watson Assistantを飛び出して、Webサイト(WordPressのサイト)にチャットボットを設置してみることにしましょう!

コロボ「いよいよお手製チャットボットが世界に飛び出すのですね!」
ワトソン「そうです、お仕事開始ですよ!コロボ君」

ではでは、次回もお楽しみに!