LINE株式会社は、2023年10月1日にLINEヤフー株式会社になりました。LINEヤフー株式会社の新しいブログはこちらです。 LINEヤフー Tech Blog

Blog


データベース連携で、Chatbotに感情を宿らせる!?「より人間らしく」にチャレンジ[from CodeIQ]

編集部注:本記事は過去に CodeIQ MAGAZINE にて掲載されたものと同一内容となります

3回に渡ってお届けしてきた「Chatbot(チャットボット)」連載の最終回。今回はこれまでたくさんのBotを開発してきたトレタのCTO 増井雄一郎さんに、「Botに人間らしい感情を宿らせる方法」について聞いてみました!

Botに感情を宿らせるには

※本企画はLINE株式会社の提供で、CodeIQ MAGAZINEが制作したものです。

こんにちは、池澤あやかです。

LINEやFacebook、MicrosoftなどのプラットフォーマーからAPIがリリースされ、Chatbot(チャットボット)はアプリよりも気軽に作れるUIとして、さまざまなところで活用されています。

(私もヤマト運輸さんのLINE Bot、愛用してます!)

APIのおかげで、サンプルコードを応用したシンプルな応対Botなら簡単に作れるようになっていますが、人間らしいChatbotを作るのは、ちょっとハードルが高いんですよね!

Chatbotは機械的に同じ回答を返すと少し味気なく感じさせてしまったり、アプリよりも柔軟な入力に対応しなくてはいけなかったり、スマホやWebアプリのプログラミングとはまた少し違う難しさがあると思います。

どうしたら、より人間らしいChatbotが作れるのでしょうか。

人という生き物は気分や場の雰囲気に左右されやすく、機嫌がいい時と機嫌が悪い時、また和やかな場とピリピリした場では、同じ言葉を投げかけても反応がまったく異なります。

例えば、軽く怒っている時は「ごめん」と一言伝えれば許してくれるかもしれませんが、めちゃめちゃ怒っている時だったら「ごめん」と何度言ってもなかなか許してもらえないかもしれません。

和やかな場でのオヤジギャクは大爆笑がとれるかもしれませんが、ピリピリした場でのオヤジギャクは場を凍りつかせてしまうかもしれません。

このような「気分」や「雰囲気」を実装するには、どういう手法が適切なのでしょうか?

今回もトレタのBotマスター 増井雄一郎さんに教えていただきます!

▲増井雄一郎さん(株式会社トレタCTO)
『Titanium Mobile』の伝道師としての活躍や、「MobiRuby」「wri.pe」などの開発者として知られる。お風呂の中でゴリゴリプログラムを書く「風呂グラマー」としてもお馴染み。

今回も前回同様、私が書いてきたBotプログラムをベースにして、増井さんにコードレビューをしていただきながら学んでいきたいと思います!

▲前回作成した「乙女心解説BOT」。乙女心という名のオブラートに包んだ発言をド直球に解説してくれるBot。
▲「疲れた」と発言すると、「今日は何もできない」とその発言に込められた意図を解説してくれます。

池澤謹製!ケンカを仲裁するBot!

「増井さん、前回作成した「乙女心解説BOT」なのですが、ケンカの雰囲気を察知して、仲裁してくれる機能を追加しました!」

「なるほど!どんな感じで?」

「『は?』だとか、『意味分からない』だとか、ケンカっぽいフレーズを拾うと、どんどんケンカポイントが貯まっていきます。ポイントが貯まりすぎたとBotが判断したときに、『ケンカはやめて…』と心の声で仲裁してくれるという機能です」

「これはケンカポイントをDBに保存して、発言に応じてポイントを増減させてるんですね」

「日が変わったらスコアをリセットする想定で進めていたので、DBはRedisを選択しました。ソート済みセット型を使って、日付をキー、どんな雰囲気かをラベル、そしてスコアを登録することにしています。日が変わったら、その日以外のスコアは破棄することにしました。」

※ソースコードはこちらのリポジトリにあります。

「だいたいの人は寝たら怒りが収まるってか(笑)」

「今回のBotを作っていて悩んだのが、『いつスコアをリセットするか』だったのですが、増井さんのBotの場合はどうしましたか?」

「過去に作ったtakahashiさんでは、経過時間とランダムで決めてました。人間っぽさを出すために」

「スコアで感情を管理するのも、感情を表現するひとつの解として正しいよね。今回は『ケンカスコア』っていうスコアを用いて計算したけど、もっとたくさん点数を持つことで、より複雑な感情も表現できるし!」

「増井さんもスコア形式のBotを作ったことありますか?」

「その名の通り、イライラするようなフレーズが出てきたときに貯まっていく『イライラポイント』とツッコミたいフレーズが出てきたときに貯まっていく『ツッコミポイント』の2つを使って、グループチャットでの社員同士の会話にちゃちゃをいれてくれるBotを作りましたよ」

「面白そう!ツッコまれたい(笑)。どんなフレーズを言うとツッコミポイントが貯まってしまうんですか?」

「『大丈夫だと思います』とか曖昧な言葉を何度か言うと『おまえの大丈夫って言葉は当てにならないよな』と辛辣なこと言いますよw」

▼増井さんの作った「takahashiさんBot」との会話風景

「ああああ〜〜!!こういう上司いる!会社勤めたことないけど、いる気がする!!」

「さらに僕が作ったBotの場合には、人ごとにスコアの対応表を作ったから、社員からしてみれば、人ごとにBotの態度が違うように感じるようになってる」

「確かに人間って、例えば、『憎めない愛されキャラ』に対する態度と『誰もが認めるしっかり者』に対する態度とでは全く違うものになっちゃいますもんね。なるほどな〜」

女の子の感情はスコアじゃなくてステートマシンだ

「そもそも、乙女心ってすごく難しいよね。乙女心みたいな複雑なものを単純なスコアやフラグで管理しようなんて無謀!」

「確かに、すごく怒ってるときに『ごめん』って一言言われても怒りなんて収まらないし、逆にすんなり謝られすぎても『なんなの?』って思う」

「ホント複雑だな(笑)。僕ね、乙女心は『ステートマシン』を使うのがいいと思う」

「ステートマシン?」

「ステートマシンというのは、時系列で表現するシーケンスに対して、状態遷移で表現する手法のことです。あんまりWebシステムでは使われないんだけど、それ以外ではよく使われるみたい」

▲ステートマシン図で乙女心を表現。

コードで表現するとこんな感じ。

require 'state_machine'

class FeelState 
  state_machine :status, initial: :平常 do
    # 心の状態
    state :平常
    state :おこ
    state :まじおこ
    state :激おこ

    # 心の状態を変化させるイベント
    event :既読スルー do
      transition 
        :平常 => :おこ,
        :おこ => :まじおこ,
        :まじおこ => :激おこ
    end

    event :すっぽかし do
      transition 
        :平常 => :まじおこ,
        [:おこ, :まじおこ] => :激おこ
    end

    event :喧嘩 do
      transition all, :まじおこ
    end

    event :浮気 do
      transition all, :激おこ
    end

    event :褒める do
      # 怒ってるときに褒めても何も起こらない
    end

    event :謝る do
      transition 
        :おこ => :平常,
        :まじおこ => おこ
      # 「激おこ」は、謝ったぐらいでは収まらない
    end

    event :土下座 do
      transition 
        :おこ => :まじおこ,
        :まじおこ => :おこ,
        :激おこ => :まじおこ
      # 「おこ」ぐらいで土下座はやり過ぎで逆効果
    end

    event :プレゼント do
      # 池澤さんが適当にかえてください
      transition 
        :おこ => :平常,
        :まじおこ => :平常,
        :激おこ => :まじおこ
    end
end

「実際に我が家でもステートマシンみたいなものがあります。仲にヒビが入るようなことをしてしまったらルブタンを買って、離婚の危機だとハリーウィンストンを買うとか。幸いまだ買ったことないけど…(笑)」

「そういう事態にどう対処すればいいか分かりやすくていいですね(笑)。ステートマシン、コードもスッキリして分かりやすい!」

脱、シンプルボット!

これまで3回に渡る連載では、Botマスターの増井さんに「人間らしいふるまいをどう実装するか」というテーマでいろいろ教えていただきました。

Botの活用事例や、Chatbotプログラムで役立つツールのご紹介

人の持つ「あいまいさ」をアルゴリズムで表現するには

私が初めて書いたChatbotプログラムは、Slackから簡単にTumblrに投稿できるようにするというものでした。柔軟な入力への対応や状態遷移の管理などの実装にかなり戸惑ったことを覚えています。

インターネット上にはサンプルプログラムはたくさん落ちていたのですが、サンプルプログラム以上のことをしようと思ったときに、意外と参考になるプログラムもなく……。

これまでまとめてきたテクニックが、みなさんのBot実装の参考になれば幸いです。

脱、シンプルボット!

※本記事はITエンジニア向け年収提示型スカウト「moffers(モファーズ)」からの提供記事です。

オリジナル版 初回掲載日 2018年2月19日