How we built our multi-agent research system

概要

このブログは、Anthropic が Claude Research 機能(複数の AI エージェントが協力して複雑な調査を行う機能)を開発した際に学んだ教訓を共有するものです。

1. マルチエージェントシステムとは?

基本概念

エージェント(Agent) とは、LLM(大規模言語モデル)が 自律的にツールを使いながらループ処理を行う仕組みです。人間が 1 回指示を出すと、AI が自分で考えて、検索したり、情報を整理したり、次に何をすべきか判断しながら作業を進めます。

マルチエージェントシステム は、複数のエージェントが 協力して働くシステムです。

なぜリサーチにマルチエージェントが向いているのか

リサーチ作業には以下の特性があります:

  • 予測不可能性:調査を始める前に、どんなステップが必要か予測できない
  • 動的な経路依存性:調べていく中で新しい発見があり、アプローチを随時変更する必要がある
  • 人間のリサーチャーの行動:人間も調査中に方向転換したり、派生的なつながりを探ったりする

固定されたパイプライン(「Aを調べる→Bを調べる→まとめる」のような決まった流れ)では、このような柔軟な作業に対応できません。

サブエージェントの役割

サブエージェントは以下の利点を提供します:

  1. 並列処理による圧縮:複数のサブエージェントが同時に異なる側面を調査し、膨大な情報から重要なポイントを抽出
  2. 関心の分離(Separation of Concerns):各サブエージェントが独立したツール・プロンプト・探索軌道を持つ
  3. 経路依存性の軽減:独立した調査により、1つのエージェントの判断ミスが全体に影響しにくくなる

人間社会のアナロジー

ブログでは興味深い例えが使われています:

「過去10万年で個人の人間の知性はそこまで進化していないが、人間社会は情報時代に指数関数的に能力を高めた。これは集合知協調能力のおかげである」

つまり、個々のエージェントには限界があっても、複数が協力すれば遥かに大きな成果を出せるということです。

トレードオフ(注意点)

  • トークン消費量:通常のチャットの約 15倍 のトークンを消費
  • 向いているタスク
    • タスクの価値が高い
    • 並列化が効果的
    • 単一のコンテキストウィンドウに収まらない情報量
    • 複数の複雑なツールを使う必要がある
  • 向いていないタスク
    • 全エージェントが同じコンテキストを共有する必要がある場合
    • エージェント間の依存関係が多い場合(例:多くのコーディングタスク)

アーキテクチャ

Research システムは以下の構造を採用しています:

┌─────────────────────────────────────────────────────────────┐
│                      ユーザークエリ                          │
└─────────────────────────┬───────────────────────────────────┘
                          ↓
┌─────────────────────────────────────────────────────────────┐
│              リードエージェント(Lead Agent)                 │
│              ・クエリを分析                                   │
│              ・戦略を立案                                     │
│              ・サブエージェントを生成・調整                     │
└────────┬──────────┬──────────┬──────────┬───────────────────┘
         ↓          ↓          ↓          ↓
    ┌────────┐ ┌────────┐ ┌────────┐ ┌────────┐
    │Sub    │ │Sub    │ │Sub    │ │Sub    │  ← 並列実行
    │Agent 1│ │Agent 2│ │Agent 3│ │Agent 4│
    └────────┘ └────────┘ └────────┘ └────────┘
         │          │          │          │
         └──────────┴──────────┴──────────┘
                          ↓
┌─────────────────────────────────────────────────────────────┐
│              リードエージェントが結果を統合                    │
│              ・追加調査が必要か判断                           │
│              ・必要なら新しいサブエージェントを生成             │
└─────────────────────────┬───────────────────────────────────┘
                          ↓
┌─────────────────────────────────────────────────────────────┐
│              Citation Agent(引用エージェント)               │
│              ・全ての主張に適切な出典を付与                    │
└─────────────────────────┬───────────────────────────────────┘
                          ↓
┌─────────────────────────────────────────────────────────────┐
│                    最終レポート + 引用                        │
└─────────────────────────────────────────────────────────────┘

2. プロンプトエンジニアリングの原則

マルチエージェントシステムでは、各エージェントがプロンプトで制御されるため、プロンプトエンジニアリングが最も重要な改善レバーです。

初期の失敗例

  • 単純なクエリに対して 50個ものサブエージェントを生成
  • 存在しないソースを延々と検索
  • エージェント同士が過剰な更新情報で互いを混乱させる

学んだ8つの原則

① エージェントの気持ちになって考える

Anthropicでは、本番環境と同じプロンプト・ツールを使ったシミュレーション環境を構築し、エージェントがステップバイステップで作業する様子を観察しました。

観察で発見した問題:

  • 十分な結果があるのに検索を続ける
  • 冗長すぎる検索クエリを使う
  • 間違ったツールを選択する

正確なメンタルモデルを持つことで、最もインパクトのある変更が明らかになります。

② オーケストレーターに委譲方法を教える

サブエージェントには以下の情報が必要です。詳細なタスク説明がないと、エージェントは作業を重複させたり、ギャップを残したり、必要な情報を見つけられなかったりします

  1. 目的(Objective):何を達成すべきか
  2. 出力フォーマット:どんな形式で返すか
  3. 使用ツールとソースの指針:どのツールを使うべきか
  4. タスク境界:どこまでやるか

悪い例:「半導体不足について調べて」という曖昧な指示

  • → あるサブエージェントは2021年の自動車チップ危機を調査
  • → 他の2つは2025年のサプライチェーンを重複して調査
  • → 効果的な分業ができない

③ クエリの複雑さに応じてスケールを調整

プロンプトに明示的なスケーリングルールを埋め込みます:

タスクタイプ サブエージェント数 ツール呼び出し回数
単純な事実確認 1 3-10回
直接比較 2-4 各10-15回
複雑なリサーチ 10以上 責任を明確に分割

初期バージョンでは、単純なクエリへの過剰投資が頻繁に発生していました。

④ ツール設計と選択が重要

エージェント-ツールインターフェースは、人間-コンピュータインターフェースと同様に重要です。各ツールには明確な目的と説明が必要です。

問題例:Slack にしか存在しないコンテキストを Web 検索しようとするエージェント → 最初から失敗が運命づけられている

与えたヒューリスティクス:

  • まず利用可能な全ツールを確認する
  • ユーザーの意図に合わせてツールを使う
  • 幅広い外部探索にはWeb検索を使う
  • 汎用ツールより専用ツールを優先する

悪いツール説明は、エージェントを完全に間違った方向に導きます。

⑤ エージェント自身に改善させる

Claude 4モデルは優れたプロンプトエンジニアとして機能します。

ツールテストエージェントの例:

  1. 欠陥のある MCP ツールが与えられる
  2. エージェントがそのツールを数十回テスト
  3. 失敗を避けるための改善されたツール説明を書き直す

結果:新しい説明を使うことで、後続のエージェントのタスク完了時間が 40%削減

⑥ 最初は広く、その後絞り込む

エキスパートの人間のリサーチ戦略を模倣:

❌ 悪い例:最初から長く具体的なクエリ → 結果が少ない

✅ 良い例:
  1. 短く広いクエリで開始
  2. 何が利用可能か評価
  3. 徐々に焦点を絞る

⑦ 思考プロセスをガイドする

Extended Thinking(拡張思考モード)を制御可能なスクラッチパッドとして使用:

リードエージェントの思考内容:

  • どのツールがタスクに適しているか評価
  • クエリの複雑さとサブエージェント数を決定
  • 各サブエージェントの役割を定義

サブエージェントの思考内容(Interleaved Thinking):

  • ツール結果の品質を評価
  • ギャップを特定
  • 次のクエリを改善

テストでは、拡張思考により指示追従・推論・効率性が向上しました。

参考: Building with extended thinking

⑧ 並列ツール呼び出しで速度とパフォーマンスを変革

初期エージェントは逐次検索で非常に遅かった。

導入した2種類の並列化:

  1. リードエージェントが3-5個のサブエージェントを同時に起動
  2. 各サブエージェントが3つ以上のツールを並列で使用

結果:複雑なクエリのリサーチ時間が最大 90%削減(数時間→数分)

3. 評価方法

マルチエージェント評価の難しさ

同じ開始点でも、まったく異なる有効なパスを取る可能性がある

→ 「正しいステップを踏んだか」ではなく、「正しい結果を達成したか」+「合理的なプロセスを踏んだか」を評価

実践的な評価アプローチ

少数サンプルで即座に評価を開始

Anthropic は約 20 個のクエリセットから始めました。数百のテストケースを待つよりも、少数のサンプルですぐにテストを始めることが重要です。

LLM-as-Judge(LLM を評価者として使用)

リサーチ出力は自由形式のテキストで、単一の正解がないため、プログラム的な評価が難しいです。

評価基準(ルーブリック):

  • 事実の正確性:主張がソースと一致するか
  • 引用の正確性:引用されたソースが主張と一致するか
  • 完全性:要求された全ての側面がカバーされているか
  • ソースの品質:一次情報源を使っているか
  • ツール効率性:適切なツールを適切な回数使っているか

出力:0.0-1.0のスコア + 合格/不合格

人間による評価も不可欠

自動評価では見逃すエッジケースを発見:

  • 珍しいクエリでのハルシネーション
  • システム障害
  • 微妙なソース選択バイアス

実例:テスターが、エージェントが SEO 最適化されたコンテンツファームを、学術 PDF や個人ブログなどの権威あるソースより優先することに気づいた → ソース品質ヒューリスティクスをプロンプトに追加して解決

5️. 本番環境での信頼性

エージェントはステートフルでエラーが蓄積する

エージェントは長時間実行され、多くのツール呼び出しにわたって状態を維持します。

問題点:

  • 軽微なシステム障害が壊滅的になりうる
  • 最初からの再起動は高コストでユーザーにも不満

対策:

  • エラー発生時点から再開できるシステム
  • 定期的なチェックポイント
  • ツール障害時にエージェントに通知し、適応させる

デバッグには新しいアプローチが必要

エージェントは動的な決定を行い、同じプロンプトでも実行ごとに非決定的です。

問題例:「明らかな情報を見つけられない」というユーザー報告

  • 検索クエリが悪い?
  • ソース選択が悪い?
  • ツール障害?

解決策:本番環境でのフルトレーシングを追加し、個々の会話内容を監視せずに(プライバシー保護)、エージェントの決定パターンや相互作用構造を監視

デプロイには慎重な調整が必要

エージェントシステムは、ほぼ継続的に実行される高度にステートフルなプロンプト・ツール・実行ロジックの網です。

デプロイ更新時の問題:

  • エージェントがプロセスのどこにいるか分からない
  • すべてのエージェントを同時に新バージョンに更新できない

解決策:Rainbow Deployments(虹色デプロイ)

  • 新旧バージョンを同時に実行
  • トラフィックを徐々に移行
  • 実行中のエージェントを中断しない

6️. 結論と追加 Tips

メインの結論

「AIエージェント構築では、ラストマイルがしばしば旅の大部分になる」

開発マシンで動くコードベースを、信頼性のある本番システムにするには大きなエンジニアリング努力が必要です。プロトタイプから本番へのギャップは予想以上に大きい

追加 Tips(Appendix)

状態を変更するエージェントの評価

マルチターン会話で永続的な状態を変更するエージェントの場合:

  • ターンごとの分析ではなく、最終状態の評価に焦点を当てる
  • 複雑なワークフローでは、特定の状態変更が発生すべきチェックポイントを設定

長期会話の管理

数百ターンに及ぶ会話では:

  • 完了した作業フェーズを要約し、重要な情報を外部メモリに保存
  • コンテキスト限界に近づいたら、新しいサブエージェントを生成し、ハンドオフで継続性を維持

ファイルシステムへの出力で「伝言ゲーム」を最小化

サブエージェントの出力をすべてリードエージェント経由で伝えると、情報が失われる可能性があります。

解決策:

  • サブエージェントが直接外部システムに成果物を保存
  • リードエージェントには軽量な参照のみを渡す

メリット:

  • 多段処理での情報損失を防止
  • 会話履歴を通じた大きな出力のコピーによるトークンオーバーヘッドを削減