こんにちは、CCCMKホールディングスTECH LAB三浦です。
はじめに
もうすぐ2月も終わりです。今期もあと残すところ1か月なので、来期に取り組みたい研究テーマを探すため、最近は色々な論文に目を通しています。今回も最近読んで面白いと感じた論文の内容を紹介させてください。
今回読んだ論文は次の論文です。
Title: Chain of Agents: Large Language Models Collaborating on Long-Context Tasks
Authors: Yusen Zhang, Ruoxi Sun, Yanfei Chen, Tomas Pfister, Rui Zhang, Sercan Ö. Arik
Submit: 4 Jun 2024
arXiv: https://arxiv.org/abs/2406.02818
Chain of Agentsは複数のworker agentを用いてドキュメントを順に解析し、最後にmanager agentに回答を生成させることで長いドキュメントに対する質問や要約を可能にするアプローチです。長いドキュメントをLLMで扱うためのアプローチは他にも色々ありますが、それぞれ課題も存在します。Chain of Agentsはシンプルなアプローチですが、他のアプローチに比べて長いドキュメントを用いた様々なタスクにおいて優れた成果を出すことが示されています。
LLMに長い文章を与える時の問題点
LLMに長いドキュメントに関する質問に回答させたり要約させる場合、いくつかの課題が発生します。
まずLLMが扱える長さ"context window"に収まり切らない場合、一部の情報が欠損してしまいます。その問題に対処するため、関連する情報だけを参照するRAGというテクニックがありますが、関連する情報を正しく取得できないと正確な回答が出来ない問題があります。
一方、最近のLLMの中には非常に長いcontext windowを持つものもあり、たとえば"Claude-3"であれば200kトークンを一度に入力することが出来ます。それらのLLMを使えば長いドキュメントをそのまま入力することが出来るのですが、LLMは"lost in the middle"というcontextの最初と最後の部分に集中して注目してしまう性質があることから長いドキュメント全体を等しく読み込むことが出来ないという問題が発生します。
Chain of Agents(CoA)のアプローチ
Chain of Agents(CoA)ではRAGと同じように文章を細かい単位(chunk)に分割します。その後、複数のworker agentがリレーのように自身に対応するchunkと質問、前のworker agentが生成した回答に役立つ情報を受け取り、自身もまた回答に役に立つ情報を生成して次のworker agentに渡していきます。そして最後のworker agentが生成した情報をmanager agentが受け取り、質問に対する回答を生成する、というアプローチを取っています。
worker agentに与えるプロンプトのテンプレートはたとえば以下のようなフォーマットになっています。以下の図の"CoA"に該当する部分がCoAで使用しているプロンプトで、worker agentとmanager agentごとに設定されています。worker agentの"{Previous Communication Unit (CUi−1)}"の部分に前のworker agentが生成した情報が設定されます。
manager agentは最後のworker agentが生成した情報を使って質問に対する回答を生成する役割を担います。worker agentで全て完結させるのではなくmanager agentを使って回答を生成させている点がChain of Agentsの工夫の1つで、実際にmanager agentを使わない場合に比べ、使った場合の方が回答精度の向上が見られるそうです。chunkの内容を読み解く役割と回答生成する役割を明示的に分けて各agentに割り振ることで、それぞれの役割を最大限果たすことが出来るようになります。
他の手法との精度比較
論文では、CoAとその他のアプローチとの質問回答系、要約系、コード補完系タスクの精度比較が行われています。
比較が行われている他のアプローチは以下です。
アプローチ | 内容 |
---|---|
Vanilla | 質問と参照ドキュメントをそのままLLMに入力して回答生成させるパターン。ドキュメントがLLMのcontext windowに収まらない場合は、収まらなかった部分を切り取る。 |
RAG | 300単語で分割されたchunkに対し、質問との関連性の強さで順位付けをする。LLMのcontext windowに収まり切るまで上位からchunkを取得し質問とともにLLMに与える。 |
使用するLLMはPaLM2というシリーズから"text-bison@001", "text-unicorn@001", GoogleのGemini1.0から"gemini-ultra", さらに長いcontext windowを持つLLMとしてAnthropicの"claude-3-haiku", "claude-3-sonnet", "claude-3-opus"を使用しています。
まずCoAが全てのタスクにおいてVanilla, RAGの精度を上回ることが出来ることが示されています。
また、claudeシリーズは200kという長いcontext windowを持つため、ドキュメントによっては全て入力することが可能です。ドキュメントを全て入力出来た場合(No Trun.)と出来なかった場合(Trun.)における、claudeシリーズでの性能比較も行われています。この結果から、ドキュメントを全て入力に含められた場合でも、CoAの方が性能が高いことが分かります。
No Trunの性能がCoAに比べると低い理由の1つに、"lost in the middle"の問題があります。質問に回答するために必要な情報が、ドキュメントのどの位置にあるのかで精度指標のF1Scoreがどう推移するのかが検証されています。下のグラフのx軸は回答に必要な情報がドキュメントのどの位置にあるのかを示していて、すべてドキュメントを入力した場合の精度(青いライン)が、必要な情報がドキュメントの真ん中に位置していると減少してしまう傾向が示されています。
シーケンシャルであることの重要性
CoAではagentが順番に必要な情報を生成し、次のagentに渡していきます。一方長いドキュメントを複数のagent、つまりMulti-agentのアプローチで読ませる方法は他にも考えられます。
たとえばドキュメントのchunkごとにworker agentに質問に対する回答を生成させ、それらから最も多い回答をmanager agentに選択する、という方法です(Multi-Agent Voting (Merge))。また、各chunkごとに回答に必要な情報を各worker agentに独立して生成させ、それらをmanager agentがまとめて質問に対する回答を生成する、という方法もあります(Multi-Agent Hierarchical Structure (Hierarchical))。どちらの方法もworker agentが独立して情報の生成を行っている点が異なります。
これらのMulti-agentのアプローチと比較して、CoAの性能が優れていることが以下の表に示されています。特に質問回答系のタスクの性能が他のアプローチよりも高いように見えます。質問の中には、1回の情報検索では解けないようなマルチホップな問題も含まれています。こういった問題は、worker agentが独立してchunkに対して処理を行う方法では対処することが出来ず、前のworker agentが出した結果を見ながらさらに必要な情報を探索させるシーケンシャルなアプローチが求められます。
回答精度の面でシーケンシャルなアプローチであるCoAが他のMulti-agentに比べて優れていることは分かったのですが、一方で気になるのがシーケンシャル故の計算コストや処理の遅延という課題です。worker agentの処理を独立出来るのであれば、それらを並列で実行することが出来、処理時間を削減することが出来ますが、CoAの場合はworker agentに順に処理を行わせる必要があるので、ドキュメントが長くなればなるほど処理にかかる時間が増えてしまいます。コストや遅延に関する課題は論文の"Conclusion-Limitations"でも触れられていました。worker agentをLLM以外の効率的なモデルを使った処理に置き換えるなど、今後工夫がされていくのだと思います。
まとめ
今回はChain of Agentsという、複数のworker agentを用いてドキュメントを順に解析し、最後にmanager agentに回答を生成させることで長いドキュメントに対する処理が可能になるMulti-agentのアプローチを調べてみました。論文のAppendixにはプロンプトのテンプレートも掲載されているので、一度自分でもこのアプローチを試してみたいと思いました。