kun432's blog

Alexaなどスマートスピーカーの話題中心に、Voiceflowの日本語情報を発信してます。たまにAWSやkubernetesなど。

〜スマートスピーカーやVoiceflowの記事は右メニューのカテゴリからどうぞ。〜

Voiceflowにおける会話のコンテキストを考える ①ダイアログコンテキスト

f:id:kun432:20200724191613p:plain

以前、シチュエーショナルデザインについて、Voiceflowで実装する場合について過去5回にわたって説明しました。

シチュエーショナルデザインとは少し絡むところで、会話の「コンテキスト」ということについて、Voiceflow公式ブログに面白いエントリがあったので複数回に分けてご紹介します。

この記事は「Voiceflowにおける会話のコンテキストを考える 」シリーズの第1回の記事です。他の記事は以下にあります。よろしければあわせて読んでみてください。

第1回(この記事) 第2回 第3回 第4回 第5回 第6回

目次

コンテキストとは?

「コンテキスト」を辞書で引くと「文脈」とあります。それでは「文脈」とはどういう意味でしょうか?

  1. 文章の流れの中にある意味内容のつながりぐあい。多くは、文と文の論理的関係、語と語の意味的関連の中にある。文章の筋道。文の脈絡。コンテクスト。「文脈で語の意味も変わる」「文脈をたどる」
  2. 一般に、物事の筋道。また、物事の背景。「政治改革の文脈でながめると」

「意味のつながり」とか「物事の筋道」とありますね。これを会話において考えると、以下のような感じかと思います。

何か飲む?

うん、コーヒーがいいな

オッケー、砂糖とミルクはどうする?

両方ほしいな

了解、じゃあ砂糖とミルクをいれたコーヒーを用意するね

大きく意味だと「どういう飲み物が欲しいか?」を確認するという文脈であり、細かく分けると前半部分は「飲み物が欲しいか?欲しくないか?」、後半部分は「(コーヒーの場合)ミルク・砂糖はどうするか?」という2つの文脈があることになります。これを2つに分けてそれぞれ単独で見た場合、

  • 飲み物は必要かどうか?
    • 飲み物の名前だけで完結する?
    • コーヒーの場合は砂糖とかミルクの確認も必要じゃない?
  • 砂糖とミルクは必要かどうか?
    • これってコーヒーの前提だよね?
    • オレンジジュースの場合には聞く必要ないよね?

となり、片方だけだとそれぞれ情報が足りないのですね。つまり、個々のコンテキストがあって、さらにそれを包括するもっと大きなコンテキストがあるという形です。このような複数のコンテキストからなる大きなコンテキストの会話を別の言い方でいうと「マルチターン会話」といいます。

VUI設計においては、このコンテキストも含めて会話のフローを考えるわけですが、必ずしも常にきれいなフローになるわけではないのが人間の会話です。それをどこまでうまく作り込んで人間の会話に近づけるか?がより自然な会話を成立させるためのキモになるわけですが、これがとても大変なわけですね。Alexa Live 2020の「Build Conversational Interfaces Faster with Alexa Conversations」で出てきたスライドを一部紹介しましょう。

サンプルになっているのは、犬がほしいのでどういう犬種がいいかをおすすめするスキルですね。最終的なオススメ犬種を判断するために、特徴となるキーワードを2つあげてもらって、あと元気かおとなしいか、というのを確認しています。

f:id:kun432:20200724222024p:plain

これを個々のコンテキスト、というかそれぞれの会話ターンに分けています。最初が会話のトリガーとなる「おすすめ犬種を教えて」を受け取って、次に「特徴を2つ」、最後に「元気かおとなしいか」という感じですね。

f:id:kun432:20200724222037p:plain

これを図で表すと、このようにリニア(直線的)な会話フローになっていることがわかりますね。

f:id:kun432:20200724222054p:plain

で、聞いてる方からするとリニアなのですが、実際に裏側のスキルでは、ユーザの発話に応じていろいろ分岐したりするわけですね。そしてこのときに、「会話の状態」を管理しています。例えば、

  • 最初に特徴を2つ述べるところで、「元気」「おとなしい」のどちらかを言う。2つ目の質問の回答はもうわかっている。
  • 最初の会話の回答内容=状態を管理して、次の質問をどうするか?を決める。
  • もしかすると、別の質問が来るかもしれないし、もう追加質問自体が不要になるかもしれない。

みたいな感じです。で、こういうパターンをいろいろ作っていくと、こうなるわけです。

f:id:kun432:20200724222107p:plain

複雑で大変ですね。さらに、ユーザの回答はいろいろです。以下にあるように、想定以上/以下の回答が返ってきたり、途中で気持ちが変わったりするわけで、更に大変です。

f:id:kun432:20200725011849p:plain

そこで出てくるのが「Alexa Conversations」になるわけですが・・・

f:id:kun432:20200725012322p:plain

これはもう少し先の話になると思います(少なくとも日本ではまだ利用できない)ので、現時点でどういうふうにコンテキストに沿った会話を実現できるかを考えていきたいと思います。そこで、冒頭で紹介した公式ブログの話に戻ります。

この記事の中では、6つのパターンを例に、Voiceflowでコンテキストに沿った会話を実現するやり方を書いてあって、とても参考になるとともにちょっと思いつかなかったやり方もありました。ということで、複数回に分けてそれぞれ順に見ていきましょう。

1. ダイアログコンテキスト

ダイアログコンテキストは、単純に言ってしまうと、会話のフローに沿ったコンテキストです。会話のフローに沿って、前後のやり取りが関係する行われることが前提になっています。例で見てみましょう。

f:id:kun432:20200728005537p:plain

ちなみに実行例を先にお見せします。

コーヒーを頼んだ場合。

f:id:kun432:20200728010355p:plain

紅茶の場合。

f:id:kun432:20200728010406p:plain

オレンジジュースの場合。

f:id:kun432:20200728010420p:plain

では、フローを順に見ていきます。

起動して注文を聞くところはよいですね。そのあとorder_intentで飲み物名をdrink_nameというスロットで取ります。

f:id:kun432:20200728010724p:plain

order_intentとdrink_nameはChoice Blockでこんなになってます。普通ですね。

f:id:kun432:20200728011125p:plain

f:id:kun432:20200728011134p:plain

受け取ったdrink_nameの値を使ってCondition Blockで分岐させます。コーヒー、紅茶、それ以外、ですね。

f:id:kun432:20200728011311p:plain

それぞれの分岐を見てみましょう。まずコーヒーの分岐。コーヒーの場合は砂糖とミルクを入れるか?をビルトインインテントであるYes/Noで受け取ってそれぞれで回答します。

f:id:kun432:20200728011356p:plain

次に紅茶の分岐。こちらは、コーヒーのように、砂糖とミルクではなくて、レモンと砂糖を確認するようにしています。同じくビルトインインテントであるYes/Noで分岐させます。

f:id:kun432:20200728011555p:plain

最後にその他の場合。これはもう追加で入れるものは確認しない、という感じです。

f:id:kun432:20200728011616p:plain

大体流れがわかったところで、これをコンテキストの観点で細かく分類していきます。

f:id:kun432:20200728012829p:plain

全体としては、どんな飲み物が欲しいか?を聞く大きなコンテキストとなっていて、飲み物の追加情報が必要な場合に細かいコンテキストが存在するという感じです。

    1. 飲み物の「名前」を聞くコンテキスト
  • 2-1. 飲み物が「コーヒー」の場合に、追加で必要なものを確認するコンテキスト
  • 2-2.飲み物が「紅茶」の場合に、 追加で必要なものを確認するコンテキスト
  • 2-3. 飲み物が「それ以外」の場合のコンテキスト

コンテキストには連続性があります。例えば、1の飲み物の「名前」と2-1の「コーヒー」の場合に追加物を確認するコンテキストは連続することで意味をなします。コーヒーにレモンを入れることは一般的にないでしょうし、コーヒーで追加するものを確認しなければ常にブラックコーヒーしか出せないことになります。Voiceflowではコンテキストの流れを引き継ぐ場合には線でつなぐことで実現しています。当たり前と思うかもしれませんが、実はこれが重要です。

それを理解するには以下のところを見るとよいでしょう。

f:id:kun432:20200728013542p:plain

コーヒー・紅茶にそれぞれ追加するものを確認するとき、ユーザの回答は両方とも「はい」「いいえ」になります。つまり、この「はい」と「いいえ」だけを切り出すと、最初にどの飲み物を言うか?というコンテキストがなければどちらに対する回答なのかを区別できません。

このように、前後の会話のやりとりの流れにより成り立つコンテキストを「ダイアログコンテキスト」と言っています。Voiceflowを使っていると当たり前のことなので、特に疑問を感じないですよね。

実はこれがVoiceflowの最も優れたところで、Alexaスキルをコードで書く(ask-sdkを使う)場合、このコンテキストの維持は開発者が実装しなければなりません。

ただし人間の会話においてコンテキストは突然変わることがあります。例えばこんな感じです。

一時的にコンテキストが変わって戻る

いらっしゃいませ。ご注文は何になさいますか?

コーヒーを一つ。

砂糖とミルクはおつけしますか?

あ、ところで営業時間は何時まで?

営業時間は9:00〜22:00です。ところで砂糖とミルクはおつけしますか?

お願いします

複数のコンテキストが1回で終わる

いらっしゃいませ。ご注文は何になさいますか?

コーヒーを一つ。砂糖とミルクもつけて。

コーヒーに砂糖とミルクをおつけいたしますね。おまたせしました。

ダイアログコンテキストはリニアな流れに依存するという欠点があります。つまり決まりきった会話の流れ以外には対応できないということですが、Voiceflowには、これを回避してより柔軟な会話のコンテキストを実現できるような機能があります。次回以降でそれをご紹介していきたいと思います。

まとめ

「Voiceflowにおける会話のコンテキスト」シリーズの第1回はダイアログコンテキストをご紹介しました。次回以降でコンテキストのスイッチを行う機能をご紹介していきます。

続きはこちら