contents
  • チャットボットを作る

    • 関連研究のレビュー

    • 人工知能技術

      • テキスト検索(1)

      • テキスト検索(2) - 形態素解析

      • テキスト検索(3) - TFIDF

      • 自動テキスト生成

        • マルコフ連鎖による文生成

    • ケーススタディ

      • 傾聴ボット(1)

      • 傾聴ボット(2)

      • 傾聴ボット(3)

      • 名付けボット(1)

      • 名付けボット(2)

      • 占いボット

      • 夢語りボット

      • 物語ボット

傾聴ボット(1)

傾聴ボット(1)

2022-07-17

Shinichi Kato
加藤真一 Ph. D.
チャットボット研究者

傾聴の章で紹介した内容から技法をまとめると、

  1. 話し手に興味がある姿勢
  2. 落ち着いてリラックスした態度
  3. 多めの相槌やうなずき
  4. 話し手にアドバイスや意見をしない
  5. 聞き手への質問を受けたら感情への共感で返す
  6. 話し手を急かさない
  7. 短い要約を返す

となります。これらを実装したチャットボットについて考えてみましょう。

1. 話し手に興味がある姿勢

TVのトーク番組などを見ると聞き手は話し手に視線を向け、体も話し手に向けています。 映画では話し手がしゃべっているあいだ話し手の表情をクローズアップして画面に移す方法がオーソドックスですが、 話し手ではなく聞き手の顔を見せて、話し手の言葉によって引き起こされる感情の変化を表情で見せる表現が取られることもあります。 一方ゲームなどでは画面の奥と手前という位置関係で話し手が正面に向いている表現や、 トーク番組の例のように画面の左右に話し手と聞き手が配置され、やや向かい合っている表現が使われます。 これらを参考にチャットボットでも有効的な雰囲気で左右で向かい合った画像や話し手の方を向いたチャットボットの画像を用意することが効果的です。 また画像の大きさはUIやディスプレイのサイズに制限を受けますが、見ている人が圧迫感を覚えない距離を保ちつつ、フレンドリーな近さを意識してデザインします。

一般的には普通に失礼のない服装で、おだやかな表情とボディーランゲージを表す画像があるといいかもしれません。 それに加えて「あなたに興味があります」という姿勢も大事です。受付係のように事務的になりすぎないような温度感が必要です。

2. 落ち着いてリラックスした態度

チャットボットの言葉遣いを丁寧にし、長いセリフを分割することでゆっくりしゃべっている様子を表現します。 吹き出しのデザイン、つまり色と形、フォントの種類でもそれを表すことができます。

3. 多めの相槌やうなずき

4. 話し手にアドバイスや意見をしない

話し手の言葉に呼応して「うんうん」「そうなんですね」「はい」など、それ自体にはほとんど意味のない言葉でおこなう返事を相槌と呼びます。 相槌には「嘘でしょう」のように話し手を否定するニュアンスや意見は入れません。一番基本的にはユーザの発言に対して用意した返事が見つからなかったときにランダムに相槌を返す作戦 また、「なので」「だとすれば」のように原因-結果をつなぐ接続詞も相槌を入れる良い目印になります。 接続詞を順接、逆説などの種類に分ければより自然な相槌を考えられるでしょう。

また、日常会話は内容が非常に幅広いため、辞書に記載できるセリフはそれらに現れる単語のごく一部になってしまいます。 そのため、ユーザの入力文字列が辞書のどれにも当てはまらないケースが必ず出てきます。 それに対応するため、__not_found__という特別な入力文字列を用意し、その出力文字列に様々な相槌を記載しておきます。 なお、辞書が小さいときには__not_found__が利用される確率が高いので候補はたくさん用意します。

5. 聞き手への質問を受けたら感情への共感で返す

話し手が感情を表した時、聞き手は話し手の身になってそれを感じ取り、共感を示します。

感情返答
嬉しいそれは嬉しいですよね!
悲しいそうでしたか・・・
腹が立つそのような立場になったら私も腹が立つだろうと思います。
忙しかったそれは・・・大変なことだと思います。

6. 話し手を急かさない

チャットボットがシンプルである場合、話し手からの入力がない間は何もしないで待つのは普通です。 それだけでなく、話し手がなにか言葉をつなごうとして困っていることが分かったら、「ゆっくりで大丈夫」であることを伝えるのもよいでしょう。 また「返答を出力しない」ことを示すため、内部的には例えば __nop__のような返事を行い、それをUI側で「吹き出しを表示しない」ようにすれば沈黙を表現することができます。

試してみる

1〜6までの内容を辞書に取り入れたチャットボットを作りました。プログラムはすべてブラウザ上で動作し、githubに公開してあります。

このチャットボットではエンコーダー、つまり入力文字列を何らかの内部コードに変換する方法としてBag-of-word1を使うBowEncoderを使用しています。 BowEncoderは入力文字列をベクトル表現に置き換えます。それには文字列に現れる形態素ごとに出現する数を数え上げ、その数を要素とする方法を用います。 ベクトルになると2つの文字列の間の類似度を計算することができます。そして入力文字列の辞書の中で類似度が最も高いものの行数を内部コードとしています。

またデコーダー、つまり内部コードをテキストに変換するとして、出力候補の中からランダムに一つを選んだものをそのまま使うEchoDecoderを使用しています。

つまり、辞書に書かれたとおりの入力文字列に反応し、辞書に書かれたとおりの出力文字列を返します。 例えばユーザ(話し手)の入力文字列が下記inのどれかに似ていたら、outの文字列のうちのどれかを返します。

in: "えーっと、", "うーん", "なんと言ったらいいか"
out: "ゆっくり考えてもらって大丈夫ですよ。","はい"

この構成はエンコーダー、デコーダーともに最もシンプルで、人間が辞書を設計するのも比較的容易です。 日常会話での簡易な傾聴であれば、この設計で良いかもしれません。

一方で話し手の言葉の一部を用いて返答するような7. 短い要約を返すには対応できません。これについては次の記事で論じてみたいと思います。

Copyright(c) 1999-2022, 人工無脳は考える