こんにちは、yutaです。
今回は過去二2回やっているDialogFlowシリーズの3回目を書きたいと思います。
今回は、チャットボットらしい聞き返しの作り方です。
前回の基本的な応答の作り方だけだと、チャットボットとしては頼りないですよね。
やはり次のような会話をしてくれなければ。
[char no="1" char="辰生"]〇月×日にホテルを予約してほしい[/char] [char no="2" char="ロボ"]かしこまりました。どちらにお出かけですか?[/char] [char no="1" char="辰生"]スリジャヤワルダナプラコッテ(スリランカの首都)へ。[/char] [char no="2" char="ロボ"]かしこまりました。では、〇月×日にスリジャヤワルダナプラコッテで空いているホテルを検索しますね。[/char]ある事に対して、足りない情報がある場合、聞き出してくれる、そういった機能を作るにはどうしたら良いでしょうか?
今回は図のような会話をサンプルに、聞き返しを一緒に作っていきたいと思います(画像をクリックすると大きく表示できます)。
なお、この回ではある程度用語などは理解されているものとして以降の手順を記載させていただきます。
もし、少し中身が難しいという場合は、最初に「Dialogflowの使い方 機能の説明と基本的な応答の作り方」をご覧ください。
DialogFlowで聞き返しを作る
1.Entity(エンティティ)の用意
まずはこの会話に必要なEntityを用意しましょう。
会話の流れを見ていると、必要なエンティティは3つ、または4つに思われますが、今回は、ラーメンとラーメンの味を認識するEntityの2つのみを登録したいと思います。
もちろん、3回目のコッテリかあっさりの言葉をEntityに登録しても問題があるわけではありません。
今回それを登録しない理由は、返事の内容のパターンが多くなさそうなので、Intentだけで片付けてしまおうというだけです。
ではまずはラーメンを認識するEntityから。
「ラーメン」「らーめん」「中華そば」このくらいの単語で。
続いて味です。
ラーメンの味って組み合わせや中華料理的なものも含めると今やものすごい数になっちゃいますよね。
醤油・味噌・豚骨・塩・鶏・豚骨醤油・鶏塩・担々麺・魚介 etc..
ですが、ここではひとまず最初の5つ(醤油・味噌・豚骨・塩・鶏)くらいにしておきましょう。
その代わり、先の分岐図にもありましたが、聞き返しの時にパターンを提示する事で、それ以外の種類が答えられる確率を減らしましょう。
Entityの用意はこれで終了です。
2.1つ目のIntent(インテント)の作成
Entityが用意できたら、Intentの作成です。
まずは利用者側からのラーメンについての質問をTraining phrasesに用意します。
ここで一つ、上の図の例で注目してもらいたいことがあります。
それは、フレーズに必ずしも「味」のEntityを含めてはいないということです。
実はここが今回のポイントです。
味の言葉が足りないフレーズを用意しつつも、次のAction and parametersで、味のEntitiyである「flavor」に、一番左列の「Required(必須)」のチェックを入れてください。
Requiredにチェックを入れると、今度は右側のPromptsに「Define prompts...」というリンクが表示されるようになります。
これは、必須になったので「必要な情報を聞き出すための質問文を入力してください」ということです。
「Define prompts...」のリンクをクリックして質問を入力しましょう。
続いて、この会話に対する回答を作ります。ここでは足りない味の要素が補われたうえでの回答になるので、内容は「コッテリかあっさり」を質問するものになります。
なおこの回答の例にある$flavor.original$ramenは、Action and parametersで得た要素をそのまま回答に乗せるために利用するように書いたものです。
それぞれのParameter Nameにつけた名称の先頭に$マークを付けることでResponses中で利用することができます。
さて、ではこのIntentの最後にもう一つ・・
一番上のContextsに戻って、「Add Output Context」の部分に「ramen-question」と入力し、決定してください。
すると、左側に「5」という数字が付いた状態で入力が確定します。
実はこれが非常に重要な要素で、(5)ramen-questionは、このラーメンの質問(コッテリorあっさり)の回答受付期間を表しています。
5というのは、5回の会話中に回答するという意味です。
ライフタイムと呼ばれます。
6回目にはライフタイムが尽きているので、チャットボットはこの質問を忘れてしまっています。
ライフタイムは数字をクリックして編集可能です。
以上で一つ目のIntentの作成は完了です。
IntentをSaveしてください。
3.2つ目・3つ目のIntentの作成
では続いて2つ目、3つ目のIntentの作成に移ります。
次のIntentのことです。
後は簡単です。
まずはContextsで、1つ目の会話でアウトプットしたramen-questionを引き継ぎましょう。
Add Input Context欄にramen-questionを入力してください。
続いて、Training phrasesにコッテリの回答となる言葉を入力します。
Training phrasesの入力が完了したら、Action and Parametersを確認してみましょう。
このIntentではなにもEntitiyを利用していないにも関わらず、Parameterが用意されていることがわかります。
これは、Input Contextで引き継いだ先の会話で得たParameterを使いまわすことができる状態にあることを示しています。
では、これらParameterを利用してResponsesを用意しましょう。
これで、ボットの利用者が入力した味のコッテリラーメンに同意す2つ目のIntentが完成しました。
Saveしてください。
3つ目のIntentは2つめの逆ですね。あっさりには同調しません。
画像だけ貼っておきます。
是非ご自身で作り上げてみてください。
以上で完了です。
右側のテストペインで作成された会話を試してみてください。
ちなみに、1つ目の会話で「味」の要素があらかじめ入力されていた場合、ボットは味を確認せずに、直接コッテリ・あっさりの質問に移ります。
以上になります!
関連リンク
・第1回:【Dialogflowの使い方】Twitterを連繋させる手順
・第2回:【Dialogflowの使い方】機能の説明と基本的な応答の作り方
・第4回:【Dialogflowの使い方】Fulfilmentを使ってみる(超基礎編)
健康を意識する在宅勤務ブロガー。仕事で鬱になりかけて心身を健やかに保つために運動や睡眠が大切だと悟る。大きい犬が好き。
スマートスピーカーの研究でこの記事を拝見したのですが、例えば味噌ラーメンとこちらが言った時に、レスポンスが「”味”ラーメン好きやで!」と味ラーメンになってしまうのはなぜでしょうか?あと、Parameterが引き継げず自分で入力したのですが、なぜ引き継げなかったのでしょうか?教えていただけるとありがたいです!
yusukeさん、コメントありがとうございます。
ご指摘のとおり、これだと「”味”ラーメン好きやで!」になりますね。
記載の内容が間違っていました。
申し訳ありません。
修正ですが、Responsesの内容を次のように変えてみてもらえませんか?
「$flavor.original$ramen好きやで!コッテリ派?あっさり派?」
変更点は$flovorから$flavor.originalになったことです。
$flavor.originalにすることで、Entity名である「味」ではなく、入力値が利用されるはずです。
投稿内容も後日修正させていただきます。
先ほどの続きになるのですが、Actions on Googleでテストするにはどう言った手順を踏めば良いでしょうか?”「サンプルアプリ」が会話から退出しました”となって実行できないです。
yusukeさん、コメントありがとうございます。
それに関しては、同様の問題が他の方にもあるようです。
私は直面していないのですが、Googleのアクティビティ管理で次の項目を有効にすると使えるようになると公式に記載されています。
・Web & App Activity(ウェブとアプリのアクティビティ)
・Device Information(端末情報)
・Voice & Audio Activity(音声アクティビティ)
お試しください。
アクティビティ管理のリンクは次のURLになります。
https://myaccount.google.com/activitycontrols
上記設定が書かれている公式のガイドは次のURLになります。
https://developers.google.com/actions/dialogflow/first-app?hl=ja