クマは森で用を足しますか?

アウトプットは重要です。

Dialogflowのビギナー向け解説ムービーを観る

そろそろ Google Home Mini で何か作ってみたいと思い、Dialogflow 上で適当に入力してみたのですが、それらしく対話してくれるものが(簡単なものですが)できるにはできました。でも、Google の Developer Advocate さんの YouTube ビデオ、"A 3-part getting started series" の説明がわかりやすいので、まずはこちらを観てから始めるのが良さそうです。

インテント (Intent)

インテントは、ユーザーからの要求の種別それぞれに対してひとつずつ用意されるべきもので、要求およびそれに対応する応答の組み合わせをセットで定義します。ひとつのインテントで処理するのは、一種類のユーザー要求のみとします。

ビデオでは、「料金の確認」と「修理の予約」、そして「営業時間の問い合わせ」をそれぞれ個別のインテントとして設ける「バイク店」が例として挙げられています。各インテントに紐づけられるユーザーの発話例が、それぞれ右側に示されています。

f:id:cheerio-the-bear:20181231122422p:plain

ビデオ 1 - インテント (Intent) より

インテントを設計する際に、ユーザーの発話例を開発者が入力する必要がありますが、その際に開発者が予め想定した文言とそっくり同じ発話をユーザーに強いることはありません。例えば、ユーザーの発話内容が「営業時間の問い合わせ」を意味するものであれば、システムがその意味を汲み取って適切に「営業時間の問い合わせ」のインテントが選択されます。

 

f:id:cheerio-the-bear:20190102173321p:plain

ビデオ 1 - インテント (Intent) より

エンティティ (Entity)

 エンティティは、ユーザーが発話した内容から意味のある要素を取り出す仕組みのことです。「日付」や「時間」、「言語」や「通貨単位」といった一般的な要素については、@sys. から始まるシステムエンティティとしてシステムで既に用意されています。

ユーザーが自由に発話した内容がシステムによって解釈され、「時間」や「日付」等が認識されて取り出される様子がビデオで説明されます。ユーザーの発話内容に含まれていた「11時」が @sys.time の要素として、また「明日」が @sys.date の要素として認識される例が示されています。

f:id:cheerio-the-bear:20190102174458p:plain

ビデオ 2 - エンティティ (Entity) より

それぞれのアクションに合ったエンティティを、開発者が自由に定義することができます。こちらは、「バイクの種類」を取り扱う開発者エンティティ @bike-type と、「サービスの種類」を取り扱う開発者エンティティ @service-option を例示したものです。

f:id:cheerio-the-bear:20190102174626p:plain

ビデオ 2 - エンティティ (Entity) より

開発者エンティティを定義すれば、システムエンティティと同様に、ユーザーが自由に発話した内容からシステムによって自動的に認識され、取り出されます。「レーシングバイク」と同じものを意味する言葉がどのくらいあるのかは存じませんが、同じ意味であればまとめて「レーシングバイク」として認識させることも可能です。

f:id:cheerio-the-bear:20190102174701p:plain

ビデオ 2 - エンティティ (Entity) より

 また、複数のエンティティを組み合わせた「複合エンティティ」を作ることもできるそうです。

f:id:cheerio-the-bear:20190102174720p:plain

ビデオ 2 - エンティティ (Entity) より

コンテキスト (Context)

コンテキストなしダイアログ

インテントでは、ユーザーから提供されるべき情報を定義し、それらが「必須」事項かどうかを指定することができます。

「バイク店」の「修理の予約」の例では、「サービスの種類」と「日付」、そして「時間」の三点全てが「必須」事項として指定されています。ユーザーの発話内容から「修理の予約」であることは認識でき、しかしその「必須」事項の全てが欠けていたんでしょう。この例では「サービスの種類」、「日付」と順に、不足している情報を Dialogflow が自動的にユーザーから収集してくれています。

f:id:cheerio-the-bear:20190102185045p:plain

ビデオ 3 - ダイアログコントロール (Dialog control) より

ユーザーとの間に何度かやり取りが発生していますが、この種のやり取りであれば単一のインテントの中で処理することが可能です。

明示的なコンテキストありダイアログ

次の事例では、異なる質問に対してユーザーがそれぞれ同じ「はい」と応答しています。ひとつ目の質問は「予約するかどうか」、ふたつ目の質問は「リマインドするかどうか」で、ユーザーの応答はどちらも「はい」です。この場合、それぞれの「はい」応答のためのインテントを個別に用意することができますが、どちらのインテントが選択されるべきかを「入力コンテキスト」を指定することで制御することが可能です。「入力コンテキスト」の条件が合致する方の「はい」インテントが選択されます。

f:id:cheerio-the-bear:20190102185510p:plain

ビデオ 3 - ダイアログコントロール (Dialog control) より

「予約するかどうか」のコンテキスト(例では confirm-repair という出力コンテキストがある状態)で「はい」が発話された場合には、そのコンテキストが「入力コンテキスト」として指定された「はい」インテントが選択されます。逆に、「リマインドするかどうか」のコンテキスト(例では confirm-reminder という出力コンテキストがある状態)で「はい」が発話された場合には、そのコンテキストが「入力コンテキスト」として指定された「はい」インテントが選択されます。 

暗黙的なコンテキストありダイアログ

Dialogflow のユーザーインターフェース上で、インテントにフォローアップインテント (Follow-up intent) を設定することができますが、その仕組みは前項と同じです。「予約するかどうか」とそれに対応する「はい」および「いいえ」、また「リマインドするかどうか」とそれに対応する「はい」および「いいえ」は、それぞれのコンテキストで紐づけられるため、別のコンテキストのものと取り違えられることはありません。

f:id:cheerio-the-bear:20190102185748p:plain

ビデオ 3 - ダイアログコントロール (Dialog control) より

フォールバックインテント (Fallback intent)

用意したどのインテントにもユーザーの発話内容が引っかからなかった場合には、フォールバックインテントが選択されます。全体のフォールバックインテント (Default Fallback Intent) の他に、個別のコンテキストにおけるフォールバックインテントを設けることも可能です。

f:id:cheerio-the-bear:20190102185819p:plain

ビデオ 3 - ダイアログコントロール (Dialog control) より

フルフィルメント (Fulfillment)

 Dialogflow のユーザーインターフェース上では実現できないようなことには、フルフィルメント (Fulfillment) の仕組みを利用します。ユーザーの発話に該当するインテントの処理を外部に実装する Webhook に託すことで、データベースの検索結果を使って応答したり、ユーザーからの要求に応じて実際のサービスで注文するような機能を実現することができます。 

f:id:cheerio-the-bear:20190102185842p:plain

ビデオ 3 - ダイアログコントロール (Dialog control) より

ユーザーの発話内容から Dialogflow が 解釈したインテントやエンティティは、JSON リクエストの形で Webhook に届けられます。 

アプリケーションできました

これらの解説ムービーを観た後に、こんなアプリケーションを作りました。ロジック部分はおそらく 100 行前後しかない、小さなアプリケーションです。

cheerio-the-bear.hatenablog.com

 

YouTube リンク

パート1 - インテント (Intent) 

youtu.be

パート2 - エンティティ (Entity)  

youtu.be

パート3 - ダイアログ (Dialog)

youtu.be