Edited at

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
さようなら、おしまい、バイバイ、終了
さようなら