DialogFlowでチャットボットを作る -基礎編-

2019.08.19

はじめに

この記事では、DialogFlowの基本的な使い方の説明とチャットボットを設計する上で必要となる工程などを紹介しながら、チャットボットを作っていきたいと思います。

DialogFlowとは?

DialogFlowは、音声認識・音声合成・自然言語処理・感情解析を使った対話アプリやチャットボットを構築できるサービスです。
Google AssistantやFacebook Messenger、Twitter、  Lineなどをはじめ、他にも様々なチャットサービスと連携させることができます。 さらに、Webhookでデータベースとのやりとりができるため、動的な情報提示ができるチャットをつくることができます。
 例えば、ユーザーの好みに応じて、商品の注文ができるチャットボットや、会議室の空き情報を参照して会議室予約をしてくれるチャットボットなども作れるようです。

さらに、DialogFlow内で完結する内容であれば、ほとんどコーディング不要で作ることができます。

料金プランは3つあるようです。

  • Standard Edition
  • Enterprise Edition Essentials
  • Enterprise Edition Plus

感情分析と音声認識の機能が不要であれば、無料の「Standard Edition」から始めることができます。料金をはじめ、プランの詳細は公式ドキュメントをご覧ください。

今回の作業の流れ

まず詳細を説明する前に大まかにどんな作業が必要かについて説明します。

  1. タスクの整理
  2. チャットボットの人格の設定
  3. ストーリーの整理
  4. DialogFlow Agentの作成
  5. 固有単語等の学習
  6. 対話の学習

DialogFlowは、GUI操作で簡単に連携までいけるように設計されているので、ステップ1 ~ 3では、「どんなチャットボットを作るか」というデザインに近い部分を記述したいと思います。
これらのステップは、テクニカルブログの領域から少し離れてしまうかもしれませんが、この対話デザインが地味に大変であり重要なので、ナレッジとして記載していきたいと思います。

ステップ4から、実際にDialogFlow Agentを作成していきます。Agentは、アプリケーションプロジェクトのようなものです。

ステップ5は、固有単語の学習を行います(Entityの設定)。辞書登録のようなものです。

ステップ6は、対話文の学習をしていきます。ユーザーからの投げかけに対して、どんな反応をさせるかを設定していきます。

※DialogFlowの使い方のみを知りたい方は、
ステップ4の固有単語等の学習からご覧ください。

1.タスク整理

上の図は、DialogFlowの全体の流れを表しています。

ユーザーが文書または音声を入力する(お元気ですか?)。それをDialogFlowが入力を解析して、Intentを照合します。Intentに登録されたタスクにしたがって、DialogFlowがユーザー返答します。
このように、どんなタスクをどんな言葉に反応させて、どんな返答文を返すかを整理しておく必要があります。

この一連のタスクのことをDialogFlowでは「Intent」という概念でまとめています。
例えば、会議室の予約を行えるIntentを設定した場合は、希望日時や予約者の名前、利用人数などの情報を集める必要があります。

これらのタスクをユーザーの会話を誘導しながら行えるように設定することでIntentを作成できます。そのため、Intentの作成のためには、どんなタスクが必要で、そのタスクを行うためには、ユーザーの持つどんな情報が必要になるかをあらかじめ、考えておく必要があります。

このような対話型インタフェースのためのデザインは、近年注目されている研究分野の一つでもあります。例えば、人間味のあるUXを与えられるとして、実験的な例として、会話型のWebサイトのようなサイトがあります。

2.チャットボットの人格設計

先ほどのwebサイトの例にもあったように、チャットボットは、人間味を持ったUXを実現できるポテンシャルを持った分野です。「どんなタスクを行うのか」「どんなユーザーが使うのか」などを想定して、あらかじめ決めておけば、後のステップで設定する返答文なども決めやすくなるかと思います。

こちらも対話型の体験を作る上では大事なパートになると思います。

3.ストーリーの整理

必要に応じて、どういう流れで対話を進めていくかについてもあらかじめ設計する方がよいかと思います。
タスクの内容によっては、回答の内容的な幅が想定仕切れない場合や、回答が難しくなりそうなものなどがあると思います。その場合は、ユーザーに選択肢を提示するなどの工夫をすると良いかもしれません。
また、想定外の答えがきた際の返答文などもあらかじめ考えておくとよいかもしれません。

4.DialogFlow Agentの作成

チャットボットの設計ができたら、Dialog flow Agentを作成して、実際にチャットボットを作っていきます。
Dialog FlowではAgentという単位で、アプリケーションを管理できるようになっています。
Agentは、複数のIntentとEntityからなるアプリケーションのようなものです。
LineやGoogle Assistantなどと連携できるのは、1つのアカウントあたり、1つのAgentになります。

まずDialogFlowのページに飛びます。
次に、DialogFlowにサインアップします(Google アカウントが必要)。
「Sign up for Free」か「Go to Console」を押すとお手持ちのGoogle アカウントからサインアップすることができます。

 

次にAgentを作成していきます。

「CREATE AGENT」ボタンを押して、スタートできます。

 

Agent nameというところに、今回作成するAgentの名前を入れていきます。次に、言語設定をしていきます。

DEFAULT LANGUAGEの欄を「English – en」から「Japanese – jp」に変更します。これで日本語に対応させることができました。またDEFAULT TIME ZONEで標準時間を設定していきます。今回は「(GTM+9:00)Asia/Tokyo」に設定しました。

そして、右上の「CREATE」ボタンを押してAgentを作成できます。

5. 固有単語等の学習

トップ画面に戻ってしまった方は、『Go to Console』を押してください。
そして、先ほど作ったAgentクリックすると編集できるようになります。

 

Agentが作成でき、編集コンソールへ移動したら、Entityを作成してみます。
Entitiesを選択して、右上の「CREATE ENTITY」から新規にEntityを登録していきます。

 

Entityの作成ページは以下の通りです。

 

例えば、「ミーティングルーム」という単語を登録します。Define Synonymsのチェックをつけると、表現の違いを設定することもできますので、Enter synonymの欄に「会議室」や「打ち合わせ室」「試写室」などと記入することができます。

最上部のmeeting_roomはタグのようなもので、この後のIntent設定の際に、このタグ名を利用して参照することができます。
具体的には、「ミーティングルーム」「会議室」「試写室」などの表現のまとまりのインデックスの役割を持ちます。

チェックボックスのAllow automated expansionにチェックをいれると、自動的に表現の水増しをしてくれるようです。
ただし、Entityが複数ある場合は、競合が発生して、予期しない分類をしてしまう場合があるそうなので、大規模なAgentを作る場合などには注意が必要です。

※弊社は、映像制作会社が母体のグループ会社なため、会議室を「試写室」と呼んだりします。

6.対話の学習

Intentの作成

Dialog Agentを新規作成すると、Intentsの中に「Default Welcome Intent」があらかじめ用意されています。
こちらは、挨拶に反応して挨拶を返すというIntentのようです。
Intentの振る舞いを知るために、「Default Welcome Intent」をクリックして編集してみます。

入力フレーズの設定

編集ページに入ると、Training Phasesというタブがあるかと思います。こちらの欄には、ユーザーからのどんなフレーズに反応させるかを記述していきます。


「Default Welcome Intent」には、既にいくつか挨拶文が記入されているので、下の画像にあるようにいくつかの表現を追加してみました。ドキュメントによると、こちらの表現は10個以上あると望ましいようです。
DialogFlowはこちらで入力したフレーズから自然言語処理をして、ユーザーの意図を解釈させることができるように自動で学習してくれるようです。

レスポンス設定

次に、返答文を設定していきます。こちらは、TextResponseという欄に記入していきます。

Defaultタブの中には、テキストによるレスポンスを記入できます。
また、Custom Payloadからカスタマイズすることは可能なようですが、こちらは最終的に、このアプリケーション(Agent)を呼び出すプラットフォームによって変わってくるので、注意が必要です。

さらに、Google AssistantやLINEなどのプラットフォームによって出力可能な形式が若干異なるようです。そちらはタブ切り替えから「+」ボタンにて追加することができます。
Google AssistantやLINEなどのプラットフォームでは、テキスト以外に画像や選択肢などを返せるpayloadが用意されています。

ここまで設定できましたら、右上の「Save」を押すことで学習などの諸々の処理が実施されますので、テストが可能になります。

テスト

ここまでできたらテストをしてみましょう。右上の入力欄に「Try it Now」がありますので、そちらに挨拶文を入力します。

 

「こんにちは」と返答文が返ってきたでしょうか?
「どうも」や「おっす!!」など、色々ないい回しを入力してみてください。

 

以上がIntentの設定の基本的な流れになります。
次は、少しレベルアップして、会議室予約ができるようなIntentを設定していきます。

会議室予約

この会議室予約のタスクでは、「会議室を取りたい」といった意図の解析だけでなく、いつ会議室が必要なのかといった日時情報も必要になります。それではやってみましょう。

まず、Entityの登録をしていきます。

先ほどと同様に、Entity > CREATE ENTITYを選択して、新規にEntityを作成します。
「ミーティングルーム」「会議室」「試写室」などを登録しておきます。
Entity名は、meeting_roomとしてみました。

次に、Intents > CREATE INTENTを選択して、新規Intentを作成します。

Intent名などは、任意の名称をつけてみてください。
Training phasesの入力をしていきます。ここに入力として想定されるフレーズを書き込んでいきます。
「会議室を予約したい」「ミーティングルームを取りたい」などの複数の表現を入力していきます。
すると、「試写室」や「会議室」が黄色くマーカーがつくのが分かると思います。
こちらは、Entityに登録されている単語として認識していることを意味しています。

Action and Parameters

会議室を予約したい場合には、日時や予約者名、人数などの情報が必要になります。
ここでは、ひとまず日時情報を取得できるようにしてみます。
そのためには、Action and parametersを設定します。このIntentの話題が上がった時に、必要な情報を登録することができます。

ここでは、会議室を予約したい話題が上がった時に、日時情報が含まれていないかチェックし、含まれていなかったらユーザーに尋ねるといった設定をすることができます。
DialogFlowには、日時情報や地理情報など、システムEntityと呼ばれるあらかじめ用意されているEntityがあります。

Requiredにチェックを入れると、必要なEntityとして扱われます。

PRAMETER NAMEは「data_time」としました。

ENTITYは「@sys.date-time」で日付と時間を取得してくれます。

VALUEは「$data_time」としました。
こちらは、回答が取得できた時に、こちらの変数に回答結果が入ります。こちらは文章の中で使ったりすることができます。

次は、返答文を書いていきます。

こちらは、Intentが終わったら呼ばれるので、以下のように設定しました。

$data_timeには、日付と日時情報が代入されますので、「承知いたしました。x月x日 xx時からで承りました」といった風に返答されるように設定しました。
複数パターン設定することで、表現的な変化をつけたりすることもできます。

また、複数個必要な情報がある場合には、順位をつけたりすることもできます。
右上のSAVEボタンを押して、適応させてみましょう。

それではテストをしてみます。

結果はこちら、$data_timeの部分の人間味がかけていますが、必要な情報を聞き返す受け答えは、プログラムすることができました。
同様な手順で、名前や人数を必要な情報として設定して、回答を待ち受けるように設定することができます。

付録. Intentの各欄の詳細説明

Intentの編集ページの中のそれぞれの概念について説明します。

Contextsについて

Contextsは、ある話題の中でだけ起動させたいIntentsや、このIntentsから他のIntentsに繋げたい場合に使います。
Contextsタブの中には、インプットとアウトプットの欄があり、こちらに他のIntentsの話題を記述してあげることでIntent同士の繋がり(文脈)を設定することができます。
インプットとアウトプットを繋げることで、構造を作って行くことができます。Intentの名前を入力して使うことができます。

Eventsについて

こちらのタブは、編集中のIntentを何かのイベントに対して起動させたい時に設定します。
例えば、ここに「Google Assistant Welcome」と入力してみてください。
こうすることで、Google Assistantからこのアプリケーションが呼ばれた時に、このIntentの返答文がチャット上に表示されるようになります。
「Google Assistant Date time」や「HangOut Welcome」などがあらかじめ用意されているようです。
アプリケーションの起動やログイン情報などのようなプラットフォーム依存のイベントに対してIntentを起動するように設定できるようです。

Training Phrasesについて

Intentのタスク遂行のために、ユーザーに期待している入力フレーズを設定できます。
入力フレーズは、意図解釈されるため、ある程度の表記揺れであれば対応可能です。

私が触った感じだと、いわゆる、「てにをは」を意識して入力しておくとうまくいくことが多いことが分かりました。
例えば、「ラーメン食べたい」というフレーズを入力としたい場合、「ラーメンを食べたい」「ラーメンが食べたい」などもしっかり記入しておくと良いです。
そのほかにも「ラーメン食いたい」「ラーメンを食いたい」「ラーメンが食いたい」なども記入しておきます。
また、「ですます」や、「!」マークなどは、自動補完されるので、あまり気にしなくても大丈夫な印象です。

フレーズ数は10個以上が推奨とされています。

Action and parametersについて

Intentのタスク遂行のために、必要な情報について登録します。
こちらを設定することで、必要な情報を取得するまで会話を誘導するように設定することができます。

REQUIRED チェックを入れることで、必要な情報として登録できます。
PARAMETER NAME このAction and parameterの名称です。
ENTITY Entityのタグ名を入力します。Entityには、システムEntityと呼ばれるものがあり、これはDialogFlowにあらかじめ用意されているEntityで「@sys.xxxx」でアクセスできます。住所やメールアドレスなどの情報をとることができます。
VALUE ユーザーからの回答が入ります。変数名のようなものです。
IS LIST

チェックを入れると、複数の回答をVALUEに入れることができます。

PROMPTS 情報を聞き出す時の文章を設定できます。複数パターン入れるとランダムで聞く文言を変えてくれます。

RESPONSESについて

返答文を設定することができます。デフォルトタブから入力できるのは、テキスト情報のみです。Custom Payloadは、出力をカスタマイズできます。
Jsonでフロント側に出力することができますが、フロント側での設計によって記述構造が変わるので、注意が必要です。
LINEタブでは、「Text Response」「Image」「Card」「Quick Replies」があります。

Text Response テキストフォーマット
Image 画像を提示できる (URL指定)
Card 画像とサイトリンク等を提示できる
Quick Replies 選択肢を提示できる

 

こちらも実態は、Custom PayloadでLINE Messaging APIで設計されている記述構造に対応させている形になります。

「Use responses from the DEFAULT tab as the first responses」を有効にすることで、デフォルトタブで設定したテキストに続いて、LINEタブやGoogle Assistantタブで設定したPayloadを送信することができます。
また、テキストは行数に番号がつくと、ランダムに出力されるようになってしまいます。
そのため、改行を含んだテキストを入力したい場合は、「shift+enter」で改行コードを追加することができます。

Fulfillmentについて

Dialogflowでは、IntentごとにWebhookの通知を受け取る事ができるようです。
この機能がFulfillmentで、自然言語処理によって抽出された情報を基に、データベースを検索して、動的な返答文を作成することができるようです。
こちらを使えば、ユーザーの好みの条件を聞き出しながら、注文を行なったりといったタスクを行うこともできます。Webhook受信ができないAPIには使用できないので注意が必要です。

まとめ

今回は、Dialog Flowの基本的な使い方までを紹介しました。
Dialog Flowでは、気軽に自然言語理解を持つチャットボットを実装できることが分かりました。
一方で、自由会話を実現するためには、タスクの整理やストーリーの整理など、対話をデザインする工程が重要になってきそうだということも分かりました。

とはいえ、一貫したGUI操作と、LINEをはじめ、Facebook Messenger やGoogle Assistant・HangOutなど多くのプラットフォームと簡単に連携ができるように用意がされている魅力的なツールであることが分かりました。

次回は、DialogFlowとLINEの連携をしていきたいと思います。