チャットボットの作り方 Google Dialogflow入門
チャットボットを利用したサービスは昨今激増し、様々なシーンでチャットボットを目にしたり利用する機会が増えてきたかと思います。特に2016年、FaceBookとLINEがチャットボットの開発環境をオープンさせたのを皮切りに多くの企業がチャットボット市場に参入しました。
また、チャットボットを簡単に作成することができるツールも豊富に存在します。そこで、本記事では独自のチャットボットを作る為に必要な作成サービスやその設定方法を中心に紹介していきたいと思います。
今回はGoogle Dialogflowの機能や扱い方を紹介していきたいと思います。
Dialogflowとは
Dialogflowは自然言語の解析を担うことができるプラットフォームサービスの一つです。自然言語の解析とはプログラミング言語のような厳格なルールに基づく言語とは対照的に我々が普段コミュニケーションの中で利用している言語(日本語、英語、中国語 etc.)を解析し処理を行うことです。その為Dialogflowを利用すると次の例のように微妙なニュアンスの違いや方言などを同じ言葉として処理させることができます。
(例)「美味しい」 = 「うまい」, 「本当に」= 「ほんまに」
因みにGoogle アシスタントとは別サービスで2016年にGoogleがDialogflowの前身となるAPI.AIを買収し、FaceBook、Twitter、LINEなど様々なサービスと連携を可能にしています。
Dialogflowのキーワード
【Agent】
Agentとは対話処理を行うまとまり(プロジェクト)のことです。新規でチャットボットサービスを立ち上げる際には必ずAgentを作成する必要があります。左上のメニューからCreate Agentを選択するとAgent名や対応言語の設定が求められます。
Agent nameは自由に設定して構いませんが、プロジェクトの内容が把握しやすい命名にした方が良いです。
Default Languageでは標準言語を選択します。標準言語は一度設定すると変更できないので注意しましょう。日本語サービスを作る場合はJapanese — jaを選択します。Default Time Zone は標準のタイムゾーン設定です。標準だとAsia/Tokyoとなっているかと思いますがそのままで問題ありません。Google ProjectではAgentを動作させるGoogle Cloud Platformのプロジェクトを選択できます。新規で作成する場合は初期値のままで問題ありません。
【Intents】
Intentsはユーザーの意図に合わせて応答する処理群のことです。展開するとIntentと呼ばれる単数形の項目が存在します。Intentにはユーザーからメッセージが来た場合どのように返答するのかが設定されます。デフォルトでDefault Welcome IntentとDefault Fallback IntentというIntentが既に登録されてますのでこちらを確認してみましょう。
まずDefault Welcome Intentを展開してみましょう。このIntentではユーザーから挨拶があった場合に「こんにちは!」と返答するよう設定されています。Intentの設定でまず肝になるのはTraining phrases とResponses です。この仕組みだけ知っておけば取り敢えずユーザーからのメッセージに対して何かしら応答させることができます。
Training phrases はIntentを起動させる際にトリガーとなるフレーズになります。処理させたいIntentと紐付くユーザーの意図(メッセージ)をできるだけ想定し、バリエーションを持たせておくことが必要です。
Responses にはIntentを起動させた際にユーザーへ返すレスポンス(回答)が登録されます。複数のレスポンスを登録するとランダムで入力した内容を返すことができます。
Default Fallback Intentではどのインテントにも属さないメッセージがユーザーからきた場合の返答を記述します。Fallbackには元々「予備の」、「代替の」といった意味があります。その為、 Fallback Intentでは開発者が意図したことをチャットボットと対話してくれるように助け船を出してユーザーへ促す必要があります。
【Entity】
Entityとはユーザーとの対話の中で表現にまとまりをつける機能です。例えばユーザーの星座を取得したい場合だと、ユーザーは以下のように英名で答えたり漢字で答えたりと様々なバリエーションで返答することが考えられます。
(例)「山羊座」 :「Capricorn、カプリコーン、やぎ座、やぎ、山羊」
そこで山羊座というまとまりを作ってその中に想定される類義語を登録することで表記の揺れに対して柔軟に対処できます。
このようにユーザーからの返答が想定される場合にはEntityを利用することでユーザーの意図・本質を集約することができます。以下が星座に関するEntityを纏めた例です。
【Fulfillment】
Fulfillmentは外部サービスのAPI接続やユーザーとの対話において何かプログラムによる処理を行いたい際に利用します。Webhookが利用できる場合はここでWebhookのURLを設定して処理を行います。インラインでプログラムを記述する際にはInline Editorをオンにして処理を直接記述します。
Intentsを使って対話させる
Dialogflowのキーワードでも解説したようにIntentはチャットボットサービスにおいて最もコアな機能です。そこでまずは独自のIntentを作って意図したような返答が返されるように設定してみましょう。例ではmy_nameというIntent名にしました。
名前をユーザーから聞かれた際に名前を答えるような設定をしてみましょう。
まず Training phrasesにインテントと紐ずくユーザーのメッセージを入力していきます。ユーザーから名前を尋ねるテキストが予想される為、「名前は」、「お名前を教えて」といった具合に思いついた分だけ入力しましょう。
できたら一旦SAVEして自然言語処理を担うAIに学習させます。
次にこのIntentで処理したいことを設定します。ここでは名前を答えるように返す必要があるのでResponsesに返答内容を入力します。複数の返答バリエーションを用意するとその中からランダムに内容を返すことができます。ユーザーがサービスに対して飽きないようにさせる仕組みとしてできるだけ返答にバリエーションを持たせておくことをお勧めします。
完成したら再度SAVEしてテストしてみましょう。Dialogflow内で設定された対話はTry it nowに想定されるユーザーメッセージを入力してテストすることができます。
しっかり意図したように名前を返すことが確認できました。
Followup Intent を使って対話させる
チャットボットサービスを作成しているとしばしばユーザーとの対話を続けて深掘りしたい時があると思います。そんな時に利用するのがFollowup Intentです。これを使うと対話形式のIntentを作ることができます。
まず先ほど作成したmy_nameというIntent名を選択すると横にAdd follow-up intentと表記されるのでそこをクリックします。
複数選択肢が出てくるかと思いますが、基本CustomでOKです。するとmy_name Intentの中に新たなIntentがネストされます。ネストされたIntent名は自由に変更できるのでここでは ask_user_name としました。
ユーザーとチャットボットが対話を続ける為には何かしらユーザーに対して質問する必要があります。そこで先ほど作成したmy_name IntentのResponsesに「お名前を教えてくれませんか?」と追記してみます。
次にFollowup Intentで作成したask_user_nameを開きTraining phrasesを入力していきます。Training phrasesはユーザーのボットに対する返答になります。ユーザーの返答は次のようになることが想定されます。
「名前は山田です」「山田です」「山田」
ここで注意したいのが「山田」の部分です。回答のフレーズは決まっていますがユーザー名は常に変わり続けます。そこで「山田」にEntityを付与することで名前が変わっても対応できるようにしたいと思います。「山田」の部分をドラッグまたはダブルクリックすると様々なEntityを選択できます。
Dialogflowには予め様々なユーザー意図に対応できるようEntityが用意されています。例えばe-mailであれば@sys.email、国名であれば@sys.geo-country、自由記述であれば@sys.anyとなります。今回の場合名前の入力は不規則なので@sys.anyを利用します @sys.last-nameというEntityもあるのですが、日本語の精度があまり良くないというのと苗字以外のワード(ニックネームなど)で返ってきた場合処理ができない為今回は@sys.anyを用います。
利用中のEntityは以下のようにAction and parametersという項目へリストアップされます。
これで「山田」の部分が可変しても対応できるようになりました。このような対話形式で進める場合、ユーザーから返ってきた内容を対話の中で再利用したいケースも多いかと思います。そんな場合はAction and parametersのVALUEから値を取り出すことで実現できます。パラメーター名anyの行を見るとVALUEに$anyという$から始まる文字列が表示されています。
実は$anyにユーザーからの返答(名前部分)が保持されています。この値を使いたい場合は$anyをResponses内で使うことで「〇〇さん」と個別に呼びかけることが可能です。
以上でユーザーからの返答内容を使い回すことができました。試しに実機でこちらの会話を確認してみてください。うまく会話が成立すれば今回の作業は完了です。
Followup Intentがあるとできることの幅がグッと広がるかと思います。ぜひ自分にしか作れない独創的なチャットボットを作ってみてください。