最近、「マルチエージェント」「並列化」という言葉をよく聞きます。LangGraph、Google ADK、CrewAI、AutoGen── 複数のAIエージェントを組み合わせて、専門化や並列実行で高速化する、というアプローチです。

正直、最初に聞いたときは「新しいフレームワークを入れないとできないのか」と思いました。
でも、よく考えると、自分が普段やっていることも、ある意味でマルチエージェントです。
Sonnet 4.6 で実装して、Opus 4.7 でレビューする。これも複数のAIを使い分けている。今回は、マルチエージェントと並列化について、自分なりに整理してみます。

マルチエージェントは何が嬉しいか

複数のエージェントを使うことには、いくつかのメリットがあります。

専門化による品質向上

一つのエージェントに「全部やって」と頼むより、役割を分けたほうが、各タスクの質が上がります。リサーチに特化、文章作成に特化、レビューに特化。各エージェントが「自分の役割」だけに注意を払えるので、注意が分散しない。
これは、人間の組織でも同じ構造です。集中している領域が狭いほど、その領域の質は上がる

並列実行による高速化

独立したタスクを並列に実行すれば、時間が短縮できます。
5つのファイルを同時にリファクタ、複数のAPIを同時に調査、別々のテストを並列実行── 逐次処理では時間がかかるものが、並列なら速くなる

コンテキスト分離

各エージェントが自分のコンテキストだけを持つ。共通のコンテキストが肥大化しない
以前の記事で書いた「長い文脈になると注意が分散する」という問題を、構造的に避けられます。

検証層の追加

「実装エージェント → レビューエージェント」のように、別のエージェントが検証する構造
以前書いた「AIの自己評価を当てにしない」を、構造化できる。

並列化は万能ではない

ただ、「マルチエージェントにすれば速くなる」と単純には言えません。

並列が効くタスクは、こんな場合:

  • タスクが完全に独立している(互いに依存なし)
  • ファイル境界が明確、重複なし
  • 3つ以上の関連しないタスク

並列が効かないタスクもあります:

  • タスクに依存関係がある(B が A の出力を必要とする)
  • 共有ファイル・状態がある(マージコンフリクトリスク)
  • 一つのファイルを複数の観点で修正する(同時に編集できない)

通常の機能開発は、設計 → 実装 → テストの依存関係があります。
実装したコードに対してテストを書く。同時にはできない。
リファクタも、コードベース全体の整合性が必要なので、安易に並列化すると壊れる。

並列化には、隠れたコストもあります:

  • オーケストレーション(誰がどれをやるか決めるオーバーヘッド)
  • 結果の統合(並列の結果をまとめる作業)
  • 競合の解決(同じファイルを複数が触ると衝突)
  • デバッグの難しさ(並列だと問題の特定が困難)

これらが並列化のメリットを食い潰すこともあります。
並列化は判断軸が必要で、闇雲に並列にすればいいわけではない。

主なフレームワーク

業界では、マルチエージェントを構築するためのフレームワークがいくつかあります。

  • OSS: LangGraph、CrewAI、AutoGen
  • ベンダー製: Google ADK、OpenAI Agents SDK、AWS Strands Agents

これらは、自分でAIエージェントを構築するためのフレームワークです。本番のAIサービスを作る用途で活きます。

業界の動きとして興味深いのは、agentskills.io という共通仕様が広がっていること。
Claude Code、Gemini CLI、Cursor、Google ADK など40以上の製品で、同じ形式のskillが動くようになっています。フレームワークごとに skill を書き直す必要がなく、可搬性が確保される方向に進んでいる。

ただ、これらは Claude Code のようなコーディングアシスタントの代替ではなく、別レイヤーの道具です。「AIにコードを書いてもらう」という用途には、フレームワークを入れる必要はない。

Claude Codeでもマルチエージェントはできる

ここで気付いたのは、マルチエージェントのために専用フレームワークを入れる必要はないということ。Claude Code 自体に、Subagent 機能があります。主な使い方は3つ:

組み込みSubagent

Explore(高速、読み取り専用、コードベース検索)、Plan(計画立案)、general-purpose(汎用)が最初から入っている。Claude が自動的に判断して使ってくれる。

カスタムSubagent

.claude/agents/(プロジェクト)または ~/.claude/agents/(ユーザー)にMarkdownファイル(YAML frontmatter付き)を置くと、独自の Subagent が定義できる。これは skill と同じ構造です。

並列実行(Task/Agentツール)

最も興味深い部分。Claude が Task ツール(現在は Agent に改名)を呼ぶと、複数のサブエージェントが並列実行される。各サブエージェントが独立したコンテキストを持ち、結果だけが親エージェントに返される。

例えば、「75ファイルで使われている関数を deprecated にする」というタスクなら、親エージェントが grep で対象を特定して、ファイルごとにサブエージェントを並列起動する。各サブエージェントが担当ファイルを修正、親が結果を集約、という流れになる。

つまり、ADKや LangGraph のような専用フレームワークを入れなくても、Claude Code 単体でマルチエージェントの主要機能が使える。以前 skills の検証について書いた記事で書いた「今あるもので解決できないか考える」と同じ話です。新しい道具を入れる前に、手元の道具を見直す。

7-parallel-Taskを試してみたら止められた話

実際にマルチエージェントを試してみたくなって、ネット記事で見かけた 7-parallel-Task パターン── 機能実装を Component / Styles / Tests / Types / Hooks / Integration / Config の7つに並列分割するもの── を、CLAUDE.md に書こうかと考えました。これを書いておくと、機能実装のときに自動的に並列化されるらしい。

ただ、書く前に「これCLAUDE.mdに書く価値あるか?」とAIに聞いてみました。

Sonnet の応答は「効果は薄い」。理由:

  • このテンプレートは React/Next.js 前提で、自分のスタック(Rails + Vue)に合わない
  • Claude Code が並列 Agent を spawn するかはタスクの複雑さ次第。CLAUDE.md に書いても「常に7並列」にはならず、指示が宙に浮く
  • Rails の成果物(コントローラ・サービス・モデル・テスト)は相互依存。テストは実装の後

念のため Opus にも聞いてみたら、もう一段強い結論が返ってきました。
機能しない可能性が高い」。追加された観点:

  • 「7-parallel-Task distribution」という用語が曖昧。「並列で Task ツールを7つ起動せよ」と解釈するか、「7つの観点で考えろ」と解釈するか不定
  • Claude Code の方針(「不要な subagent spawn を避ける」「依存のないタスクのみ並列化」)と直接衝突する
  • 分類が React/Next.js モデル(Hooks は Vue では composables、Styles は Tailwind 中心)。どのファイルを作ればいいか分類できない指示は、Claude が無理やり当てはめてゴミファイルを生む
  • CLAUDE.md は「常時適用される制約・規約」を書く場所。「機能実装時は」という条件分岐はノイズになる。書きたいなら skill 化してトリガーを絞るのが筋

なるほど、と思いました。これは、以前から書いてきた論点が、自分が試そうとして AI に止められた事例です。

そして、ここで興味深いのは、Sonnet と Opus で判断の解像度に差があったこと。Sonnet は「効果は薄い」と慎重に言うだけだったが、Opus は「機能しない可能性が高い」と踏み込み、解決策(skill化、特定タスク向けにトリガーを絞る)まで提案してくれた。以前書いた「別モデルでレビューする」が、こういう場面で効きます。

専用モデルとレビュー体制

ここで、自分の運用を振り返ってみます。
実は、自分は既にマルチエージェントを使っていました。専用フレームワークを入れているわけではないけど、複数のAIを役割で使い分けている。整理すると、3層のレビュー体制になっています。

1層: 実装後のレビュー(push前)

  • Sonnet 4.6: 実装担当
  • Opus 4.7: レビュー(別の視点)
  • Codex(OpenAI): レビュー(別ベンダー、さらに別の視点)

レビューの指示は、タスクの重要度で変えています。通常のタスクなら「Git ステージしているファイルをレビューして」、重要な変更なら「Git ステージしているファイルを厳しくレビューして」と一言加える。同じモデル、同じ仕組みでも、指示の温度を変えることで、レビューの厳しさが変わります。

2層: PRレビュー(push後、マージ前)

  • CodeRabbit
  • Copilot code review

3層: 最終的な人間のレビュー

  • 自分
  • メンバー

なぜこんなに多層化するのか。理由は、各層で偏りを相殺できるから。

以前 skills の検証について書いた話と繋がりますが、AIに「自己評価して」と頼んでも、ハルシネーション込みで信用しきれない。同じモデルに自分の出力をレビューさせると、同じ偏りで盲点を見落とす。だから、異なるモデル、異なるベンダー、異なるタイミングでレビューする。

実際、Opus と Codex に同じコードのレビューを頼むと、指摘される点が違うことが多いです。同じ Anthropic の Sonnet と Opus でも視点が違うし、ベンダーが違えばさらに違う。各モデルに学習データや思考の癖があって、それがレビューの観点の違いとして現れる。

これは、以前書いた「完成度のギャップ(70% → 90% → 95%)」を埋める一つの方法かなと思います。一つのAIで95%に到達できないなら、複数のAIで多層的にチェックすることで、95%に近づく。

マルチエージェントというと専用フレームワークを思い浮かべがちですが、実態としては、役割を分けた複数のAIを使い分けること。これは、ADKを入れなくても、日常的にできる話です。

コストとメリット

ただ、多層化にはコストがあります。

  • API利用料が増える(複数モデルを呼ぶ)
  • レビューを統合する手間
  • 矛盾した指摘が出たときの判断負荷

3層もレビューする必要があるのか」と思うかもしれません。タスクの重要度によって、層を増やしたり減らしたりするのが現実的です。

  • 個人開発の試作品: Sonnet で実装、自分で確認(1層)
  • 業務の軽量タスク: Sonnet で実装、PRレビュー、人間のレビュー(2層)
  • 業務の通常タスク: Sonnet で実装、実装後のレビュー、PRレビュー、人間のレビュー(3層)

これは、以前開発プロセスについて書いた「部分採用、いいとこ取り」と同じ発想です。すべてのタスクで全部のレビューを通す必要はない。タスクの重要度に応じて、層の深さを変える

まとめ

「マルチエージェント・並列化」と聞くと、新しいフレームワークが必要に思えますが、よく見ると、普段の使い方の延長です。

  • 役割を分けて複数のAIを使う = マルチエージェント
  • 独立したタスクを別々のエージェントに渡す = 並列化
  • 別モデルでレビューする = 検証層の追加

これらは、Claude Code 単体でできるし、自分の運用でも(意図せず)実践していることがあります。専用フレームワーク(LangGraph、Google ADK 等)は、本番のAIサービスを構築する用途で活きる道具で、コーディングアシスタントには過剰です。

そして、並列化は判断軸が必要です。タスクが独立しているか、依存関係があるか、共有ファイルがあるか。並列化すれば速くなるわけではなく、タスクの性質で判断する。これは、人間が普通の開発で考えていることと、本質的に同じです。

7-parallel-Task の事例で見たように、ネット記事のテンプレートを鵜呑みにしないのも重要です。自分のスタックに合うか、ハーネス本体の方針と衝突しないか、CLAUDE.md と skill のどちらに書くべきか。判断軸は以前から何度も書いてきました。

これも結局、いつものエンジニアリングの延長な気がしています。道具より判断。手元の道具を見直す。鵜呑みにしないで、自分の文脈で判断する。マルチエージェント特有の話というより、何かを設計するときの基本かもしれません。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です