LoginSignup
4
1

More than 5 years have passed since last update.

VoiceUI/ConversationalUI 対話モデル設計

Last updated at Posted at 2018-07-31

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

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
1