2022-07-17
傾聴の章で紹介した内容から技法をまとめると、
となります。これらを実装したチャットボットについて考えてみましょう。
TVのトーク番組などを見ると聞き手は話し手に視線を向け、体も話し手に向けています。 映画では話し手がしゃべっているあいだ話し手の表情をクローズアップして画面に移す方法がオーソドックスですが、 話し手ではなく聞き手の顔を見せて、話し手の言葉によって引き起こされる感情の変化を表情で見せる表現が取られることもあります。 一方ゲームなどでは画面の奥と手前という位置関係で話し手が正面に向いている表現や、 トーク番組の例のように画面の左右に話し手と聞き手が配置され、やや向かい合っている表現が使われます。 これらを参考にチャットボットでも有効的な雰囲気で左右で向かい合った画像や話し手の方を向いたチャットボットの画像を用意することが効果的です。 また画像の大きさはUIやディスプレイのサイズに制限を受けますが、見ている人が圧迫感を覚えない距離を保ちつつ、フレンドリーな近さを意識してデザインします。
一般的には普通に失礼のない服装で、おだやかな表情とボディーランゲージを表す画像があるといいかもしれません。 それに加えて「あなたに興味があります」という姿勢も大事です。受付係のように事務的になりすぎないような温度感が必要です。
チャットボットの言葉遣いを丁寧にし、長いセリフを分割することでゆっくりしゃべっている様子を表現します。 吹き出しのデザイン、つまり色と形、フォントの種類でもそれを表すことができます。
話し手の言葉に呼応して「うんうん」「そうなんですね」「はい」など、それ自体にはほとんど意味のない言葉でおこなう返事を相槌と呼びます。 相槌には「嘘でしょう」のように話し手を否定するニュアンスや意見は入れません。一番基本的にはユーザの発言に対して用意した返事が見つからなかったときにランダムに相槌を返す作戦 また、「なので」「だとすれば」のように原因-結果をつなぐ接続詞も相槌を入れる良い目印になります。 接続詞を順接、逆説などの種類に分ければより自然な相槌を考えられるでしょう。
また、日常会話は内容が非常に幅広いため、辞書に記載できるセリフはそれらに現れる単語のごく一部になってしまいます。
そのため、ユーザの入力文字列が辞書のどれにも当てはまらないケースが必ず出てきます。
それに対応するため、__not_found__
という特別な入力文字列を用意し、その出力文字列に様々な相槌を記載しておきます。
なお、辞書が小さいときには__not_found__
が利用される確率が高いので候補はたくさん用意します。
話し手が感情を表した時、聞き手は話し手の身になってそれを感じ取り、共感を示します。
感情 | 返答 |
---|---|
嬉しい | それは嬉しいですよね! |
悲しい | そうでしたか・・・ |
腹が立つ | そのような立場になったら私も腹が立つだろうと思います。 |
忙しかった | それは・・・大変なことだと思います。 |
チャットボットがシンプルである場合、話し手からの入力がない間は何もしないで待つのは普通です。
それだけでなく、話し手がなにか言葉をつなごうとして困っていることが分かったら、「ゆっくりで大丈夫」であることを伝えるのもよいでしょう。
また「返答を出力しない」ことを示すため、内部的には例えば __nop__
のような返事を行い、それをUI側で「吹き出しを表示しない」ようにすれば沈黙を表現することができます。
1〜6までの内容を辞書に取り入れたチャットボットを作りました。プログラムはすべてブラウザ上で動作し、githubに公開してあります。
このチャットボットではエンコーダー、つまり入力文字列を何らかの内部コードに変換する方法としてBag-of-word1を使うBowEncoder
を使用しています。
BowEncoder
は入力文字列をベクトル表現に置き換えます。それには文字列に現れる形態素ごとに出現する数を数え上げ、その数を要素とする方法を用います。
ベクトルになると2つの文字列の間の類似度を計算することができます。そして入力文字列の辞書の中で類似度が最も高いものの行数を内部コードとしています。
またデコーダー、つまり内部コードをテキストに変換するとして、出力候補の中からランダムに一つを選んだものをそのまま使うEchoDecoder
を使用しています。
つまり、辞書に書かれたとおりの入力文字列に反応し、辞書に書かれたとおりの出力文字列を返します。 例えばユーザ(話し手)の入力文字列が下記inのどれかに似ていたら、outの文字列のうちのどれかを返します。
in: "えーっと、", "うーん", "なんと言ったらいいか"
out: "ゆっくり考えてもらって大丈夫ですよ。","はい"
この構成はエンコーダー、デコーダーともに最もシンプルで、人間が辞書を設計するのも比較的容易です。 日常会話での簡易な傾聴であれば、この設計で良いかもしれません。
一方で話し手の言葉の一部を用いて返答するような7. 短い要約を返すには対応できません。これについては次の記事で論じてみたいと思います。