fbpx

Blender Bot 2の紹介

この記事は1年以上前に投稿されました。情報が古い可能性がありますので、ご注意ください。

Meta(Facebook)社の研究チームが2021年7月に公開したOSSのチャットボットです。 本ブログではBlender Botがどんなものか?を実際に動かしてみて説明してみようと思います。

Blender Bot 2.0とは?

2021年7月に公開されたチャットボットのモデルです。チャットボットの目的としては、「できるだけ自然に自由に深い会話ができる」というものになり、その研究の成果としてBlender Botが公開されています。このモデルには次のような特徴があります。

  1. ブレンディングスキル:パーソナリティ、知識、共感といったスキルをシームレスに統合
  2. 長期記憶:長期間の継続的な会話の知識を活用
  3. タイムリーな情報に対応:会話中の文脈に応じてネット検索を行ない会話に取り入れ

2と3に関する特徴が今回の2.0で追加された機能になります。

(画像はMeta AIのブログから引用)

1があるの?

2.0なのでもちろんその前のバージョン1があります。 2020年4月に1.0が公開されました(公開時のブログ記事:A state-of-the-art open source chatbot)。
公開されているデータセット(Redditの会話)を用いて学習し、いくつかのスキルを学習させ、融合させるようなモデルを構築しています。 並列処理が可能なニューラルネットワークに分割して効率よく学習できるようになっていました。 バージョン1のスキルは以下の3つです。

  • パーソナリティの利用(Persona Chat)
  • 知識の利用(Wizard of Wikipedia)
  • 共感の表現(Empathetic Dialogues)

公開時の論文では、GoogleのMeenaと比較してどちらが人間らしいか?どちらと長く会話したいか?という評価でBlender Botに軍配が上がっています。 1.0公開時の論文のまとめでは、対話モデルが事実と異なる話をする場合もあるという問題点があると述べています。
なおBlender Botは研究成果をオープンにして再検証などが可能となるように、ParlAIと呼ばれるプラットフォームにて公開されています。 このParlAIはFacebookが公開しているオープンドメインのチャットに関連するモデルの共有、トレーニング、評価のためのPythonフレームワークです。 利用方法については後述します。

1との違い?

1.0の公開から約1年後に2.0が公開されました。 2.0では、最初に紹介したようにこれらに加えて次の機能が追加されました。

  • 長期記憶
  • タイムリーな情報に対応

1.0ではWikipediaを用いた知識を活用して会話をしていましたが、モデル学習時点での情報しか活用できないため、最新の話題についていけないという問題がありました。 場合によっては事実とは異なる会話になることもあります。 例えば野球選手がモデル学習時点より後に、他のチームに移籍しているなどといった状況です。 この問題に対処するために追加されたのが「タイムリーな情報に対応」するための機能です。 実際にはチャットボットが会話をしているときにインターネットに対して検索をし、得られた情報を利用して答えるという手法です。


(画像はMeta AIのブログから引用)

チャットボットがネット検索?

個人的に「検索」に興味があるので、この部分をさらに調べてみました。 別の論文(Internet-Augmented Dialogue Generation)として公開されています。こちらをもとに少しだけ紹介しましょう。
機械学習などの手法でチャットボットを構築した場合に出てくる問題に情報の古さがあります。 これに対応するために、会話をもとに検索エンジンを使って検索を行い、検索結果の文書の情報に基づいてチャットボットが回答を行います。

どうやって検索するの?

論文で検証された検索エンジンは2種類です。 FAISS(Facebookが開発している検索エンジン)とMicrosoftが提供しているBing Searchです。
実際に検索エンジンを利用する部分は2つのコンポーネントで構成されています。 1つは対話の履歴をもとに検索エンジンへの検索クエリを生成しN件の文書を返却するコンポーネント、 もう1つは検索結果の文書をもとに応答を生成するコンポーネントです。
このコンポーネントを利用することで、検索を利用した会話を生成しています。 実際に検索エンジンに対して検索をする部分はParlAIのコードの中でインターフェースが決められており、他の検索エンジンを利用する実装に切り替えることも可能となっています。(後半で実際に動作させていますが、この時に利用する検索エンジンはGoogle検索を利用した実装になっています)。

何をモデルにしてどうやって学習している?

それぞれのコンポーネントのトレーニングには次のような教師付きデータを利用しています。

  1. クエリ生成部:文脈と検索クエリのペア
  2. 応答生成部:文脈と応答のペア

論文に利用された学習データはクラウドワーカー(適切なワーカーになれるかどうかの選別も行われたらしいです)により、次のような手順で行われた会話およびその時の行動(検索クエリと回答に利用した文書およびスニペット)をもとに作成されました。 クラウドワーカーには次の2つの役割が与えられます。

  1. ウィザード:検索エンジンにアクセスできる役
  2. 見習い:興味のある話題を選択できる役(検索エンジンへのアクセスは不可)

最初に見習いの人が興味のある話題を選択し、それに基づいて深い会話をしてもらうという目的で会話をしてもらった結果を収集して教師データに活用しています。 実際に会話した内容と、ウィザード役の人が会話をするときに検索するために利用した検索キーワードと、検索結果に関連すると選択した文章が採取されています。 検索はしなくてもいいですし、再検索も可能になっています。
このように今回のタスクに適したトレーニングデータをもとにモデルの評価が行われました。

検索できる仕組みを利用した結果は?

ベースラインは、外部知識としてWikipediaのみを利用するモデルが利用されています。 また、事前学習済みのモデルもいくつかのパターンを検証しています。
この論文では検証について、いくつかの軸で行なわれています。

  • 事前トレーニングで、会話履歴のみを用いた場合と、検索した情報も使った会話履歴の違い
  • トレーニングデータとして、Wikipediaを利用した会話履歴と上記の新たに論文向けに作成した検索を用いた会話履歴
  • また、モデルもFAISSを利用する場合やBing Searchを利用したものなど複数パターン

人手による検証も実施されています。クラウドワーカーの方に指定されたペルソナをもとにボットと会話をしてもらい、会話について知識、魅力、一貫性などを評価してもらっています。 それをもとにボットのモデルをそれぞれ評価した結果、検索エンジンベースの手法が、検索を利用しないモデルよりも優れていたとなっています。
そのほかにもこの論文では、人と検索エンジンを使用したモデルの間の会話の例がいくつか紹介されています(カクテルの作り方や、レストランなどに関する対話で正しい情報を返しています。また、うまくいかない会話例も紹介されています)。

検証した結果の詳細については論文(Internet-Augmented Dialogue Generation)をご覧ください。

動かすには?

では、実際にどんなものかを動かしてみましょう。 ParlAIという研究用のプラットフォームにモデルが公開されています。こちらを利用します。 ParlAIは対話型AIの研究に関するモデルの共有、学習、テストを目的としたPythonベースのプラットフォームです。 また、ParlAIでは今回紹介しているBlender Bot以外にも学習済みモデルが多数公開されています(参考:モデルの一覧ページ:Model Zoo)。 ちなみに、Blender Bot 1.0についてはGoogle検索をすると日本語で動かした方の記事が見つかります。

今回はBlender Bot 2.0のモデルを動かします。 Blender Bot 2.0では、ネット検索のサーバーが別途必要になりますが、検索サーバーのAPIは公開していますが、実装までは公開されていません。幸いにも第三者がGoogleを利用する検索サーバーを公開していますのでこちらを今回は利用します。

今回のデモの構成としては以下のようになります。 今回は簡略化のために1つのコンテナ上でParlAIと検索のサーバーを起動しています。 次のDockerfileを使い、次のように動作させます。

Dockerfile

RUN apt update -y && apt upgrade -y && \
apt install -y vim

RUN pip install --upgrade pip

# for parlai
RUN pip install fairseq transformers
RUN pip install parlai
RUN pip install subword_nmt

# search engine server clone & install
RUN git clone https://github.com/JulesGM/ParlAI_SearchEngine.git /opt/searchengine
RUN pip install -r /opt/searchengine/requirements.txt

CMD ["/bin/bash"]

用意したDockerfileでコンテナを起動します。 次にコンテナに接続し、検索サーバーを起動します。

$ python /opt/searchengine/search_server.py serve --host 0.0.0.0:8080

最後にParlAIでBlender Bot 2.0のモデルを実行します。今回は400Mのモデルを利用しました。

$ parlai interactive --model-file zoo:blenderbot2/blenderbot2_400M/model --search_server 0.0.0.0:8080

ParlAIが起動した後にモデルファイルなどをダウンロードしますので、少し時間がかかります。 起動が成功すると次のメッセージが表示されます。

...
Enter [DONE] if you want to end the episode, [EXIT] to quit.
08:15:49 | creating task(s): interactive
Enter Your Message:

これで英語で会話が始められます。 試しに、次のような文章を入力してみましょう。

Enter Your Message: My favorite winter olympic games is curling

次のような回答が返ってきました。

[BlenderBot2Fid]: I love curling too! It's one of the most popular winter sports in the world.

Botもカーリングが好きみたいですね。その流れで今年(2022年)のオリンピックの結果について聞いてみました。

Enter Your Message: I agree! Do you know which country won the 2022 winter olympic curling?

インターネット検索をしないボットの場合は、結果を知らないはずの質問です。 ただ、今回紹介した論文にも記載があったように、このモデルは裏でインターネットに検索を行なっています。
上記の手順で起動した検索サーバー側で、どのようなクエリで、どんな結果を取得したかがログ出力されています。今回の会話に対してのログは次のようなものでした。

Received query: {'q': 'Curling 2022', 'n': '5'}
> Result: Title: `Curling at the 2022 Winter Olympics - Wikipedia`
https://en.wikipedia.org/wiki/Curling_at_the_2022_Winter_Olympics
> Result: Title: `Curling at the 2022 Winter Olympics – Qualification - Wikipedia`
https://en.wikipedia.org/wiki/Curling_at_the_2022_Winter_Olympics_%E2%80%93_Qualification
> Result: Title: `Curling at the 2022 Winter Olympics – Men's tournament - Wikipedia`
https://en.wikipedia.org/wiki/Curling_at_the_2022_Winter_Olympics_%E2%80%93_Men%27s_tournament
> Result: Title: `Curling at the 2022 Winter Olympics – Mixed doubles tournament - Wikipedia`
https://en.wikipedia.org/wiki/Curling_at_the_2022_Winter_Olympics_%E2%80%93_Mixed_doubles_tournament
> Result: Title: `Curling at the 2022 Winter Olympics – Women's tournament - Wikipedia`
https://en.wikipedia.org/wiki/Curling_at_the_2022_Winter_Olympics_%E2%80%93_Women%27s_tournament
127.0.0.1 - - [22/Feb/2022 05:16:33] "POST / HTTP/1.1" 200 -

この検索結果をもとにボットからは次のような答えが返ってきました。

[BlenderBot2Fid]: I'm not sure, but I do know that Great Britain won in the 2022 Winter Olympics.

このように、インターネット検索を行うことで、学習時点以降の情報を利用した会話ができるようになっています。 最新の情報も取り込みつつ会話ができるのは面白いですね。
もちろん、会話がうまくいかない場合もあります。 次は失敗例を見てみましょう。

Enter Your Message: I love Cardi B. She is so awesome
[BlenderBot2Fid]: Cardi B is one of the best female rappers of all time.
Enter Your Message: What is your favorite song of her?
[BlenderBot2Fid]: My favorite song is "Bodak Yellow" by Bruno Mars. What about you? Do you have a favorite song?

論文に掲載されていた例です。 Cardi Bさんの曲について話をしたのですが、「Bodak Yellow」という曲の作曲が「Bruno Mars」であるという間違った文章が返ってきています(他の曲でコラボしていますが、この曲に関しては間違った文章が生成されています)。 残念ながら間違うこともまだあります。
ただ、英語とはいえそれっぽい会話ができることはわかっていただけたかと。

まとめ

簡単ですが、Facebook(現在はMeta)がOSSとして提供しているBlender Bot 2について解説し、動作させてみました。 ParlAIという簡単に再現可能なフレームワークにより、手軽に動作させることが可能になっているのが驚きです。 コマンドで指定するだけで必要なモデルのダウンロードまで実行できる仕組みは素晴らしいです。 今回のインターネット検索のモデルに関しては、OSSとして検索サービスを作成してくれている方にも感謝です。
今回のデモで使用したモデルは残念ながら英語のモデルになります。 日本語で利用する場合には、トレーニングデータの作成から必要となり、またデータが少し特殊なものになっているのでハードルは高いかと思います。 ただ、インターネットの知識をうまく活用することで、より自然な会話ができるようになっています(機械翻訳する処理をボットの入出力の直前に入れると対応できるかもしれませんが、翻訳自体でのずれも出てくるおそれもあります)。 常に学習をしなくても最新の情報を利用できることは会話の幅も広がるのではないでしょうか。 もちろん、失敗例に示したように全てがうまくいくわけではありません。
今回紹介したモデル以外にも様々なモデルがParlAIでは公開されています。興味のあるものを探し出して動かしてみてはどうでしょうか?

参考文献

新規CTA