Babel, Inc. Engineering Blog

株式会社バベルのtech blogです

Babel | Engineering Blog

 

株式会社バベルのtech blogです

ぼっち向け雑談AIを本気で作った話

こんにちは。株式会社バベルで自然言語エンジン開発のインターンをしている満石風斗(@futo_mitsuishi)です。バベルではAIオートメーションを念頭に、AIを用いたプロダクト開発を行っています。 本記事ではそのうちの一つ、AI✕雑談 プロダクト開発のための取り組みを紹介したいと思います。

モデルの選定


現在チャットボットの開発は、いくつかの応答を用意し、ユーザーの発言に応じて選択する手法が一般的です。このような手法は特にカスタマーチャットボットで広く使われていますが、雑談に用いるには

  1. カスタマーチャットに比べて作成が必要な文章が多く、人手が必要
  2. 単一的な応答になるため雑談では満足度が低くなる

といった課題があります。そこでニューラルネットワークディープラーニングを用いた生成ベースの手法を用いることにしました。 しかし生成ベースの手法は高い精度を出すのに多くの計算資源・データ数が必要になるため自社で0から開発するのは現実的ではありません。大企業が公開しているOSS(オープンソースソフトウェア)のモデルを用いるのが一般的です。

自然言語処理タスクの実務応用といえばGoogle社が公開しているBERTですが、BERTは文章生成タスクには強くなく、また雑談は生成タスクの中でも特殊な位置に属しているため他のモデルを探す必要がありました。

arxiv.org

そこで雑談に特化したモデルをリサーチし使用することにしました。しかしpaper with codeのDialogue Generationタスクを見てもわかりますが、多くの論文でSOTA(State of the Art, 最高性能)が報告されていますが、実務で使用可能なレベルでコードが公開されているものはほとんどありません。

paperswithcode.com

その中でMeta社(旧Facebook社)のBlenderBot はコード・モデルの公開がありました。また実際に使用してみると驚くほど精度高く会話を行えることがわかったため、BlenderBotを用いてプロトタイプを作成することにしました。

BlenderBotとは


Meta社が提供している会話AIフレームワークであるParlAI内で提供されている雑談モデルの一つです。人格・知識・共感それぞれ基づく会話データから学習されており、それらをBlendした応答を返すことができます。

github.com

課題


BlenderBotを用いて実際にプロダクトを運用してみると、やはり応答の精度は非常に高くユーザーの方々にも満足度高く使って頂けていることが分かりました。しかしユーザーレビュー等を通して多くの課題も残っていることがわかりました。特に1

1. 応答が長い

f:id:FutoMitsuishi:20211115215617p:plain:w450
例1 課題1.の例

2. ボットが同じ質問を繰り返す

f:id:FutoMitsuishi:20211115220330p:plain:w450
例2 課題2.の例

の2つの問題が挙げられました。

課題解決


1. 応答が長い問題への解決策

BlenderBotはあまりに長文を喋ることがあり、ユーザー体験を損ねる原因になっていました。また長文の応答は文中にBy the way やBtw, が含まれており、話題が変えられている場合が多いことが分かりました。そこでBy the way・Btwで応答を区切り、別々に送信することにしました。

具体的には

  1. メッセージを区切った後まずは1文目を送信

  2. ユーザーの応答があった場合は2文目以降を破棄

  3. 次の応答を生成

という実装を行いました。

f:id:FutoMitsuishi:20211116032524p:plain:w450
例1 解決バージョン

しかしユーザーが応答に困り、会話を続けてもらえない場合も考えられます。そこで、ユーザーからの応答が一定時間以上なかった場合に限り2文目以降の文章を送信することにしました

f:id:FutoMitsuishi:20211116032134p:plain:w450
例1 解決バージョン2

これによって文章が長くなりすぎず、かつ会話も途切れないようなチャットを実現することができました。

2. ボットが同じ質問を繰り返す問題への解決策

BlenderBotの応答の中身をよく見ると繰り返される質問は完全一致の文章であることがわかりました。そこで単純な文字列一致を用いて同一ユーザーに同じ質問をしているかの検出を行いました。

しかし検出だけできても解決策とはなりません。また同じ質問を繰り返すといっても、よく調べてみると

1. いきなり質問をする

2. 1つの応答内で途中から質問をする

f:id:FutoMitsuishi:20211115220330p:plain:w450
例2を再掲 いきなり質問する例(1行目)と途中から質問する例(最終行目)

の2パターンがあり、それぞれ別々の対応をする必要があることがわかりました。

なかでも2.途中から質問するは同一質問以降のメッセージを削除するだけで解決できました。

しかし、問題は1.いきなり質問をするです。2.途中から質問すると同様に質問以降のメッセージを削除すると、全メッセージを削除することになり、ボットが応答できなくなってしまいます。

そこでGreat!やI seeなど、多くのメッセージに対応できるpreset messageを予め用意し、これらの質問に置き換えることで解決を図りました。

f:id:FutoMitsuishi:20211115223952p:plain:w450
例2 の解決バージョン

これらの解決策を導入した結果、よりユーザーに満足してもらえるチャットを行えるようになりました。

残された課題


上記の方法により、

1.応答が長い

2.ボットが同じ質問を繰り返す

という課題は解決することができました。しかし、解決策に用いたpreset messageには、応答は返せるものの

1.文脈を読めていないため会話が続かなくなってしまう

という課題が残されていました。また他にもBlenderBotで対応できない例として

2.ロールプレイができない

という課題もありました。 次回の記事ではこれらの課題をGPT-Jというモデルを用いて解決した内容について紹介いたします。

最後に


今回、生成ベースのOSSモデルを用いてプロトタイプを作成し、課題を一つ一つ解決していくという手法を用いた雑談モデル開発を紹介させて頂きました。

生成ベースの手法を用いた雑談ボットのプロダクト活用はまだまだ未発達の領域です。そんな中、このような手法を用いてユーザー満足度の高い雑談ボットを開発できることが分かったのは非常に意義ある事例なのではないかと思います。

そして、株式会社バベルでは一緒にAIオートメーション事業に携わってくれる方を募集しています!

jobs.babel.jp


  1. 紹介するチャット画像は全て説明のための例であり、実際の会話ではありません。