VoiceUI/ConversationalUI 対話モデル設計


Background

対話モデルの設計方法や例、注意点を、Dialogflowを例に紹介します。

Dialogflowとは

会話形式の入力クエリの自然言語処理を行うツール。
ユーザーの発話したクエリを分析し、諸々の評価点をもとに、どのような意図の命令として解釈するのがいいか、学習をもとにスコア付けをおこない、応答を決定します。
Actions On GoogleCortanaなどのVUIサービスや、Facebook MessengerSlackLineなどのConversationalUIサービスと連携できます。

対話モデルとは

対話モデルはVoiceUIやConversationalUIなどのユーザーからの自由入力に応える対話システムで利用される、応答モデルのことです。
ユーザーの応答サンプルに対し、どのようなデータを取得し、どの応答をかえすか定義します。

対話モデルの構成要素及び設定例

Dialogflowでは下記の要素から成り立っています。
その他のVUIシステムについては以下の表を参考ください

Dialogflow Alexa Clova  
Intent Intent Intent
Entity Slot Slot
Training Phrase Sample Utterances(サンプル発話) サンプル発話
Context Attribute Attribute Alexa,ClovaではFulfillmentで参照/書き込み可。Intentの判定には利用されない
Event Alexa,ClovaではBuild-in Intentとして定義されているものがある
Parameter インテントスロット (スロットリスト)

Agent

各種設定、連携設定、及び対話モデルで構成される一つのプロジェクト的なもの。

Entity

クエリの中で同一モデルの単語とその同義語は、パラメータセットとして、Entityで作成します。
多くの場合、EntityはパラメータとしてActionで処理します。
Entityも学習により拡張することが可能です。

例)商品カテゴリEntity
* book: 本、書籍
* food: 食品、食べ物、食い物
* clothing: 衣類、服、洋服、衣料品

Dialogflowではシステム規定のEntityも用意していて、日付、場所、数値などがあります。

Intent

Intentとは、同じアクションを行うものをまとめ、必要な情報をシステムに渡すための機能です。
「ゲームに回答する」「商品を検索する」「一覧の次のページに行く」など、クエリから求められている同一の意図のものをまとめます。
Intentは適切なサイズで作る必要があり、なんでも同じIntentにしたり、逆に大量のIntentを作成してバラバラのActionを取るようにするのは、どちらも意図しない動作となる場合があります。
Intentはクエリの目的ごとに作成します。

Training Phrase

Intentを実現するにあたり、ユーザーがどの様に発話するのか、あらかじめ考えられる言い方を学習しておく必要があります。
ParamaterとしてActionに渡す必要がある場合は、クエリの該当部分を指定します。
学習の量を増やすと、より多くの言い回しをカバーできます。

Event

システムによる規定アクション(様々なアプリの起動イベント、Actions On GoogleのListUIからの選択など)は、Eventを介して、Agentにはシステム値のみ送られます。この場合はイベント値でクエリが分析されるのでTraining Phraseは必要ありません。
(※ただし、規定アクション外の自由入力でもActionを行いたい場合は両方設定します)

Context

文字通り文脈を表し、Contextというパラメータで、文脈ごとのデータを保持、伝搬することができます。ContextにはLifespanが設定されていて、ユーザーは生存期間内のContextすべて持つことになります。明示的に破棄することもできます。

Dialogflowでは、IntentごとにInputContextOutputContextを設定します。 この機能は段階的に選ぶ必要があるときなどに利用され、InputContextで必須Contextを持っているクエリにIntentが割り当てられるようにし、OutputContextでは次以降のIntentへの必須Context受け渡しに使われます。

ただし、InputContextを持っていない場合でも、そのIntentが割り当てられる場合もあります。これについては後述します。

Parameter

クエリから必要な値を取得し、Actionに渡す機能です。多くの場合はTraining Phraseに含まれているEntityを渡します。
ユーザーのクエリから必須パラメータを取得出来ていない場合、リカバリーするpromptを返し、ユーザーに必要分を補ってもらうことも可能です。

Response / Action

DialogflowResponseを利用すれば、Fulfillmentを介さずに静的な応答を返すことが可能です。
Fulfillmentを利用する場合に、どのActionを実行するか、Actionで定義し、マッピングします。
Actions On Googleではクライアントライブラリv2でActionが廃止され、Intent名でマッピングするようになりました

機械学習と候補となるIntentの決定

Dialogflowでは機械学習の結果に基づき、候補となるIntentのスコア付けを行います。
スコアには下記の要素が影響します。

  • Event
  • Training Phrase
  • Context
  • 総出現回数

Actions On Googleなどの連携アプリでは、この結果から最もスコアの高い処理を採用します。

注意点

機械学習の結果次第で、期待IntentではないIntentが選出されることがあります。
例えば、contextAの「Yes」の総出現回数が多く高く評価されたことにより、期待IntentがcontextBの「Yes」ではなく、contextAの「Yes」が返されることが起こりえます。
その場合はPriorityを変更し、スコアを上下させることにより、期待Intentが返るよう、調整を行います。
それ以外に、Contextを増やすことにより、会話の詳細度をあげることでもスコアの変更が期待できます。
※という事例を見た気がしたのですが、Dialogflowのブログには下記のようにあったので、幻かも知れない

An intent will only be matched if all of the input contexts it specifies are currently active

構成例:クイズゲーム

Intents

AnimalQuizAgent
├─Default Welcome Intent
│  ├─Yes-start game
│  └─No-bye
├─Start quiz
├─Category selected
│  ├─Collect answer
│  │  ├─Yes-continue game
│  │  └─No-quit game
│  ├─Give up
│  └─Fallback for quiz
├─Change category
├─Category fallback
├─How to play
├─Default Fallback Intent
└─Bye

Entities

QuizCategories
├─cat: cat 猫 ネコ ねこ にゃんこ 猫ちゃん にゃんこちゃん 猫さん にゃんこさん にゃんにゃん
├─dog: dog 犬 イヌ いぬ わんこ わんわん わんちゃん ワンちゃん ワンワン
├─rabbit: rabbit 兎 ウサギ うさぎ うさたん うささん ぴょんぴょん うさちゃん
└─random: random なんでも おまかせ ランダム どれでも 適当

詳細

インテント名
必須コンテキスト
Training Phrase / Event Response
Default Welcome Intent
output: DefaultWelcomeIntent-followup
Event: WELCOME こんにちは。動物クイズです。さまざまな動物のクイズに挑戦できます。ゲームをはじめますか?
Yes-start game
input: DefaultWelcomeIntent-followup
はい、もちろん、やってみる どの動物のクイズに挑戦しますか?
List UI: 犬、猫、兎、おまかせ
No-bye
input: DefaultWelcomeIntent-followup
いいえ、やらない、いらない 残念です。今度ぜひ挑戦してください。
Start quiz 動物クイズする、動物のクイズ初めて、クイズやってみる、クイズ挑戦してみる、はじめる、スタート
※事前の文脈がなくはじめれるものは独立させます
どの動物のクイズに挑戦しますか?
List UI: 犬、猫、兎、おまかせ
Category selected
input: game
output: game, category
Event: actions_intent_OPTION
※ListUI タップイベントの結果を取得

<犬>、<犬> にする、<犬> をやってみる、<犬> のクイズをやってみたい、<犬> のクイズをやりたい、<犬> のクイズだして、<犬> のクイズに挑戦したい
Collect answer
input: game, category
output: game, category, continue
<1番>、<1> 「3 番、ぶどうが正解です。」次のクイズに進みますか?
Yes-continue game
input: game, category, continue
はい、もちろん、やってみる
No-quit game
input: game, category, continue
いいえ、やらない、いらない、もうおしまい、もういい また遊びましょうね。
Give up
input: game, category
output: game, category, continue
わからない、ギブアップ、難しすぎる、難しい 「3 番、ぶどうが正解です。」次のクイズに進みますか?
Fallback for quiz
input: game, category
みかん、りんご、ぶどう
※ 的確にエラー判定させるよう、頻出エラーをFallbackに学習させることも可能です
何番でしょう?
Change category
input: game, category
output: output, category
※ category を選び直すので廃棄
別の動物もやりたい、他の動物のクイズ頂戴、違う動物のクイズして どの動物のクイズに挑戦しますか?
List UI: 犬、猫、兎、おまかせ
Category fallback
input: game
カテゴリから選択してください。
How to play ヘルプ、使い方、やり方、ルール教えて、どうやって遊ぶの カテゴリを選択してクイズに答えてください。「スタート」でクイズをはじめ、「終了」でアプリを退出します。クイズの途中では「ギブアップ」することも可能です。
Default Fallback Intent わかりませんでした。もう一度言ってください。「ヘルプ」で使い方を確認できます。
Bye さようなら、おしまい、バイバイ、終了 さようなら