• トップ
  • ブログ一覧
  • AIエージェントチームで開発してみた(パラレル型 vs オーケストラ型)
  • AIエージェントチームで開発してみた(パラレル型 vs オーケストラ型)

    はじめに

    「マルチエージェント開発」や「エージェントチーム」という言葉を最近よく聞くようになりました。きっかけは、Claude Code × tmux を組み合わせた記事をたくさん見かけたことです。「tmux でペインを分割して複数の Claude を同時に走らせる」という使い方に興味を持ち調べてみました。

    複数のAIエージェントが協調して開発を進める

    との事、そのアイデアは魅力的ですね。ですが、実際にどうやるのか、また単一のエージェントを使用してのバイブコーディングと何がどう違うのか、いまいちよく分かっていませんでした。

    ので実際にマルチエージェント体験してみました。

    お題は2つ。

    • TODO管理 REST API(Hono/Node.js)の実装
    • 技術調査レポート の自動生成

    それぞれをパラレル型とオーケストラ型の2パターンで実施しました。

    なおClaude Code × tmuxを調べている中で amux というツールを知りました。後ほど詳細は説明しますが、Claude Codeを利用したマルチエージェント開発を簡単に実行できるツールで、今回こちらを使用しました。


    amux とは

    amux は「AIエージェントのコントロールプレーン」を謳うOSSツールです。

    ブラウザやスマホから、複数のClaudeエージェントセッションを並列実行・管理するためのダッシュボードシステム、で簡単にいうとマルチエージェント開発を手軽に実行できるツールとなります。

    アーキテクチャ

    特徴的なのはシンプルさです。Python サーバー + HTML/CSS/JS が1ファイル( amux-server.py )に収まっており、Githubからクローンしてインストールして数コマンド実行するのみで利用できます。

    1git clone https://github.com/mixpeek/amux && cd amux && ./install.sh
    2amux register myproject --dir ~/Dev/myproject --yolo
    3amux start myproject
    4amux serve # → https://localhost:8822

    これだけでダッシュボードが立ち上がります。

    特徴詳細
    シングルファイルamux-server.py 1ファイルにサーバー + ダッシュボードを内包
    自動再起動ファイル保存を検知してサーバーがリスタート
    セルフヒーリングコンテキスト圧縮・クラッシュ復旧・スタック検出を自動化
    SQLiteバックのカンバンボードタスクのアトミック取得(CAS: Compare-and-Swap)で競合防止

    amuxの主な機能一覧

    amux には多くの機能が搭載されています。

    機能概要
    セッション管理複数エージェントの起動・監視・停止
    カンバンボードタスクの積み・取得・完了管理(SQLite CAS)
    チャンネルエージェント間のリアルタイムメッセージング
    ノートエージェント間で共有するMarkdownメモ
    REST APIエージェント間の協調に使うHTTP API
    スケジューラ定時タスクの自動実行
    ブラウザ自動化Chrome CDP経由でリアルタブを操作
    MCP連携Model Context Protocol サーバー設定の集中管理
    モバイルPWAiOS/Android対応のWebアプリ
    iCal連携ボードの期日をGoogle/Appleカレンダーに同期
    スラッシュコマンド/commit/review-pr などのカスタムスキル

    amuxが「やること」と「やらないこと」

    やることやらないこと
    複数エージェントの立ち上げ・監視・管理エージェント協調ロジック自体(プロンプト設計に依存)
    タスクの競合防止(アトミッククレーム)LLM自体の提供
    エージェント間メッセージング
    セルフヒーリング(クラッシュ復旧)

    今回の実験で使った機能・使わなかった機能

    今回の4実験で実際に使ったのは、全機能のうち一部です。

    今回使った機能

    機能用途
    セッション管理4エージェントの起動・監視
    カンバンボードタスクの積み・完了マーク
    REST API( /api/sessions/:name/send コーディネータ→サブへの指示送信
    REST API( /api/sessions/:name/peekサブの出力・状態確認

    今回使わなかった機能(リッチ過ぎる。機会があれば試したい)

    機能コメント
    チャンネルサブが完了を通知する「プッシュ型」連携に使えそう
    ノート調査途中の中間メモをエージェント間で共有する用途と思われる
    スケジューラ夜間に自律実行させるバッチ処理に向いていそう
    ブラウザ自動化フロントエンドのビジュアルテストや操作自動化に活用できそう
    MCP連携外部ツール(GitHub、Slack等)との連携を集中管理できるみたい
    アドバイザーパターンSonnetメインで動かし、設計判断のときだけOpusに相談するパターン。コスト削減効果がありそう

     


    マルチエージェントのパターン

    マルチエージェント開発のパターンは大きく6種類に分類できるようです。

    6つのパターン

    1. パラレル型(独立並列)

    各エージェントが独立してタスクをこなすパターン。amux ではネイティブに対応している模様。

    • 各エージェントがボードから「取得→実行→完了」を自律的に繰り返す
    • 複数のエージェントが同じタスクに被らないよう保護する仕組みが必要でamux ではこれが組み込まれているみたいです。素敵
    • 「退勤前にタスクを積んで、翌朝出社したら全部終わってる」に最適のようです

    2. オーケストラ型(階層委譲)

    コーディネータがサブエージェントに指示を出すパターンです。依存関係のある複雑な仕事に向いています。

    1[コーディネータ]
    2↓ 指示を送信
    3[サブA] [サブB] [サブC]

    3. パイプライン型(直列連鎖)

    前工程の出力が次工程の入力になるパターンです。

    1エージェントA(設計)→ エージェントB(実装)→ エージェントC(テスト)→ エージェントD(レビュー)

    各ステージのスコープが明確なため、コスト管理がしやすいようです。

    4. ピアツーピア型(メッシュ)

    中央コーディネータなしでエージェント同士が直接通信・協議するパターンです。柔軟性は高いですが、プロンプト設計が複雑になるそうです。と、思ってたのと違う、ってなりそう。

    5. 批評/ディベート型

    1エージェントA: 案を出す
    2エージェントB: 批判・改善案を出す ← ループ
    3エージェントA: 修正する

    品質向上・ハルシネーション低減が目的のようです。ループ回数次第でコストが膨らみそうですね。

    6. スペシャリスト型

    役割分担(フロントエンド専門・テスト専門・レビュー専門など)を固定し、タスクの種類によって担当を振り分けるパターンです。役割に応じてモデルを変えれば(例: 単純タスク → Haiku、設計 → Opus)、コスト最適化効果が最も大きいパターンのようです。

    パターン別コスト傾向

    パターンコスト傾向理由
    パラレル型低〜中タスクが独立しているため重複がなく、線形にスケールする
    オーケストラ型コーディネータ自体がトークンを消費するが、モデルルーティングで最適化しやすい
    パイプライン型低〜中各ステージが明確でスコープが狭く、管理しやすい
    ピアツーピア型中〜高エージェント間通信が多くなるため、消費量が読みにくい
    批評/ディベート型ループ回数次第で青天井になりやすい
    スペシャリスト型低(うまくやれば)役割ごとにSonnet/Haikuへ落とせるため、コスト最適化しやすい

    amuxの各パターン対応状況

    パターンamux対応備考
    パラレル型ネイティブ対応
    オーケストラ型REST API活用で構築可能
    パイプライン型REST API活用で構築可能
    ピアツーピア型技術的に可能みたいですが、プロンプト設計が複雑になる
    批評/ディベート型技術的に可能みたいですが、プロンプト設計が複雑になる
    スペシャリスト型パラレル/オーケストラと組み合わせて活用できる

    実運用ではパターンの組み合わせになることが多いみたい?

    • オーケストラ × スペシャリスト(最もよくある構成)
    • パラレル × 批評(複数案を出して批評エージェントが選ぶ)

    開発内容やモデルの性能などによって採用すべきパターンを柔軟に選択して行くんでしょうね、と予想。


    実験設計

    今回はパラレル型とオーケストラ型の2パターンを、以下の2つのお題に適用して比較しました。

    実験お題パターン
    TODO API(Hono/Node.js + SQLite)パラレル型
    TODO API(Hono/Node.js + SQLite)オーケストラ型
    amuxリポジトリの技術調査レポートパラレル型
    amuxリポジトリの技術調査レポートオーケストラ型

    実験ごとに別ディレクトリを用意し、トークン使用量も個別に計測しました。


    実験① TODO API × パラレル型

    セットアップ

    4つのエージェントをそれぞれ登録・起動し、カンバンボードに4タスクを積みました。

    1Agent A: プロジェクト初期化(package.json, db.js, index.js)
    2Agent B: GET /todos, GET /todos/:id
    3Agent C: POST /todos
    4Agent D: PATCH /todos/:id, DELETE /todos/:id

    あとは「担当タスクを実装して、完了したらボードを done にしてください」と一斉送信するだけです。

    結果:1分48秒、ただし…

    4エージェントが一斉に動き出す様子はなかなか壮観でした。ダッシュボードでリアルタイムに各エージェントの動きが見えます。

    ファイルはちゃんと揃いました。

    1todo-api-parallel/
    2├── package.jsonAgent A
    3├── db.jsAgent A
    4├── index.jsAgent A
    5└── routes/
    6├── todos.get.jsAgent B
    7├── todos.post.jsAgent C
    8└── todos.patch-delete.jsAgent D

    しかし動かしてみると…

    1curl http://localhost:3000/todos
    2# → 404 Not Found

    うーん、404。。。なぜ動かない?

    原因は明快でした。index.js を見てみると:

    1app.get("/", (c) => c.text("Hello"));
    2// routes/ 以下のルートは一切マウントされていない

    Agent A が index.js を書いた時点では、まだ routes/ ディレクトリが存在していません。「B/C/D が何というファイル名で何を作るか」が分からないので、つまり app.route() を書きようがなかったみたいですね。
    結果 Agent A は「とりあえず動くサーバー」だけを作り、B/C/D が後から作ったルートファイルは宙に浮いたまま接続されなかったようです。

    さらに細かい問題もありました。GET/PATCH/DELETE の routes は相対パス(/、/:id)で書かれているのに、POST の routes だけフルパス(/todos)で書かれていました。エージェント間で「どこにマウントされる前提か」の合意がなかったためです。

    各エージェントは正しいコードを書きました。が、繋ぎ方の設計がなかったのですね。

    これがパラレル型の典型的な落とし穴のようです。


    実験② TODO API × オーケストラ型

    セットアップ

    今度は4セッションのうち1つをコーディネータとして起動し、コーディネータにだけ指示を送りました

    1「Hono + SQLiteTODO API を構築してください。
    2サブエージェント3体(sub-a/b/c)を指揮してください」

    たったこれだけです。あとはコーディネータが自律的に動きます。

    結果:7分8秒、完全動作

    コーディネータはまず SPEC.md を書き始めました。

    1# TODO API 仕様書
    2
    3## エンドポイント一覧
    4
    5| Method | Path | 説明 |
    6...
    7
    8## ファイル構成
    9
    10## index.js のルートマウント方法
    11
    12import { getTodosRouter } from './routes/getTodos.js'
    13app.route('/', getTodosRouter)

    指示していないのに、自分から設計書を作ったのです。優秀。

    そしてこの SPEC.md を「読んでから実装してください」という指示とともにサブエージェントに送りました。

    1curl http://localhost:3000/todos
    2# → [{"id":1,"title":"...","completed":false,...}]

    全エンドポイントが完全動作しました。

    小さな発見

    一点だけ逸脱がありました。指示では done というフィールド名を指定していましたが、コーディネータの SPEC.md には completed と書かれていました。サブ全員が SPEC.md に従ったため 統一はされています。コーディネータが独自判断で仕様を変えた形です。

    これはオーケストラ型の特性をよく表しているみたいで、コーディネータは単なる指示伝達者ではなく、設計者として機能します

    しかしプロンプト指示は汲み取って欲しいよなぁ、とも思いました。

    コーディネータがスタックした話

    実は途中でコーディネータが詰まりました。サブの完了を until ループで待っていたのですが、タイミングがズレてループが空回りしてしまいました。

    1until [ "$(curl -sk .../api/sessions/sub-a | python3 -c "...")" = "idle" ]; do
    2sleep 10
    3done
    4# ← ここで無限に待ち続けた

    人間が「sub-a は完了しています、次に進んでください」と介入して解決しました。

    これもオーケストラ型の課題の一つのようです。コーディネータが「プッシュ型(サブが完了したら通知)」ではなく「ポーリング型(コーディネータが繰り返し確認)」で設計すると詰まりやすいみたいです。


    実験①②の比較

    観点①パラレル②オーケストラ
    所要時間1分48秒7分8秒(スタック2回含む)
    動作確認❌ 全エンドポイントが404✅ 全エンドポイント動作
    統合作業人間の手直しが必要コーディネータが自動統合
    人間の指示回数4回(各エージェントに1回)1回(コーディネータのみ)
    output tokens22,01021,334
    推定コスト$0.766$0.785

    コストはほぼ同じなのに、結果は天と地の差です。

    パラレル型は速いです。ただし動きません。オーケストラ型はコーディネータが設計書(SPEC.md)を書く時間がかかりますが、その設計投資が統合問題を丸ごと解決しました。


    実験③ 技術調査レポート × パラレル型

    セットアップ

    amux 自身のリポジトリを調査対象として、4エージェントで分担して調査・執筆しました。

    1Agent A: 概要・アーキテクチャ
    2Agent B: 主要機能・APIリファレンス
    3Agent C: セットアップ・デプロイ
    4Agent D: 注意点・他ツールとの比較

    結果:2分47秒、4ファイル完成

    4ファイルがしっかり生成されました。

    1A_overview.md : # セクションA: プロジェクト概要・アーキテクチャ
    2B_features.md : # セクションB: 主要機能・APIリファレンス
    3C_setup.md : # セクションC: セットアップ・デプロイ方法
    4D_notes.md : # セクションD: 注意点・制限事項・他ツールとの比較

    ただし、AIに各ファイルを要約させたところ内容の重複が発生してて編集が必要とのことでした。

    コンテンツの質自体は高いです。*ただしそのまま1本のレポートにするには、重複の削除・つなぎ文の追加・構成の整理という編集作業が必要です。」(by AI)

    キーワードABCD
    セルフヒーリング4回1回1回7回
    インストール0回1回10回2回

    うーん、プロンプトの内容である程度は回避できるですかね?


    実験④ 技術調査レポート × オーケストラ型

    セットアップ

    コーディネータ1体のみに指示を送りました。前回のスタック経験を踏まえ「sleep/until ループ禁止」を明示しました。

    結果:11分36秒、1068行の完成品

    コーディネータがまず作ったのは STRUCTURE.md でした。

    1# レポート構成設計書
    2
    3## 目次(全セクション)
    4
    51. はじめに
    62. amux の概要
    73. アーキテクチャ
    8...
    94. まとめ
    10
    11## セクション間境界の定義(重複防止マトリクス)
    12
    13| トピック | section_a | section_b | section_c |
    14| ---------------- | --------- | ---------- | ---------- |
    15| セルフヒーリング | 詳細記述 | 言及しない | 比較のみ |
    16| インストール手順 | 詳細記述 | 言及しない | 言及しない |

    またまた設計。優秀。しかしここまで細かく設計するとは思っていませんでした。「重複防止マトリクス」でトピックごとの担当を明示することで、エージェント間の暗黙の前提が排除されました。

    最終的に生成された report.md1068行・約53KB の完成ドキュメントです。目次・アンカーリンク・セクション間の相互参照付きで、そのまま公開できちゃうんじゃ?なレベルの品質でした。

    コストが4倍になった理由

    実験③と比べてコストが約4倍($1.19 → $4.74)になりました。

    output tokens を見ると:

    実験output tokens
    ③ パラレル47,823
    ④ オーケストラ210,290

    コーディネータが STRUCTURE.md の作成・サブへの指示送信・3ファイルの統合・品質確認という全工程をこなすため、output tokens が突出して多くなった模様。


    実験③④の比較

    観点③パラレル④オーケストラ
    所要時間2分47秒11分36秒
    成果物4ファイル(要編集)1ファイル(完成品1068行)
    見出しスタイルほぼ統一完全統一
    重複コンテンツあり最小限
    統合作業人間の編集が必要コーディネータが自動統合
    output tokens47,823210,290
    推定コスト$1.192$4.739

     


    全体考察

    4実験の最終まとめ

    実験時間動作/品質コスト
    ① パラレル(TODO API)1分48秒❌ 404$0.77
    ② オーケストラ(TODO API)7分8秒✅ 完全動作$0.79
    ③ パラレル(技術調査)2分47秒△ 要編集$1.19
    ④ オーケストラ(技術調査)11分36秒✅ 完成品$4.74

    補足:コストの計算方法

    各実験のコストは以下の計算式で算出しています。

    1コスト = (input_tokens ÷ 1,000,000 × $3.00)
    2+ (output_tokens ÷ 1,000,000 × $15.00)
    3+ (cache_read_tokens ÷ 1,000,000 × $0.30)
    トークン種別単価(1Mトークンあたり)
    input(通常入力)$3.00
    output(出力)$15.00
    cache_read(キャッシュ読み出し)$0.30

    単価は Claude Sonnet 4.6 の API 価格(2026年4月時点)です。最新の単価は Anthropicの公式価格ページで確認できます。

    トークン数は Claude Code が ~/.claude/projects/  以下に保存する JSONL 実行ログから取得しました。各行に input_tokensoutput_tokenscache_read_input_tokens が記録されており、実験ごとに集計しています。

    パターン選択の指針

    実験を通じて見えてきた判断基準です。

    パラレル型が向くケース

    • タスク間に依存関係がない
    • 統合フェーズに人間が介入できる
    • とにかく速さが優先
    • 事前に SPEC.md(設計書)を用意できる → 統合問題をほぼ解消できる(はず)

    オーケストラ型が向くケース

    • 成果物に一貫性・統一感が必要
    • 人間の介入なしに完成品を出したい
    • タスク間に依存関係がある
    • コスト・時間より品質を優先したい

    最大の発見

    パラレル型の問題の9割は「設計書(SPEC.md)がないこと」で説明できる

    実験①では各エージェントが正しいコードを書いたのに全体が動きませんでした。原因は技術的な失敗ではなく「統合の前提が共有されていなかった」ことです。

    裏を返せば、事前に SPEC.md を用意してパラレル型で動かせば、オーケストラ型に近い品質をより低コスト・短時間で達成できる可能性があります。

    オーケストラ型の本質的な価値は「コーディネータが勝手に SPEC.md を書いてくれること」だと気づきました。

    amux が光る場面

    amux のカンバンボードは、エージェントの意思決定の足跡を可視化してくれます。

    実験②では、人間がタスクを登録したのではなく、コーディネータが自律的にボードにタスクを作成しました。ダッシュボードを見ると「AIが何を考えて動いたか」がリアルタイムで追えました。ただ思ってたよりは面白くなかったです(ペルソナ設定したら面白くなるのかも?)。


    おわりに

    「マルチエージェントは難しそう」と思っていましたが、amux を使えばセットアップのハードルはかなり低いです。コマンド数本でダッシュボードが立ち上がり、API 経由でエージェントに指示を送れます。

    今回の実験で一番印象に残ったのは、コーディネータが指示されていないのに自分で SPEC.md や STRUCTURE.md を書いたことです。人間が「設計書を作れ」と言ったわけではありません。コーディネータは「品質を出すには設計が必要だ」と自律的に判断してそれをやりました。

    指示通りに動くだけでなく文脈を読んで最善手を選ぶ、これがエージェントチーム開発の面白さなんだなと思いました。

    次はパラレル型に事前 SPEC.md を組み合わせた実験、アドバイザーパターン(Sonnet メイン + 設計判断時のみ Opus)の組み合わせ、エージェンティックテストを試してみたいと思いました。
    本当は試したかったですが、マルチエージェントでもうお腹いっぱいです、ごちそうさまでした。

    ライトコードでは、エンジニアを積極採用中!

    ライトコードでは、エンジニアを積極採用しています!カジュアル面談等もございますので、くわしくは採用情報をご確認ください。

    採用情報へ

    おすすめ記事

    エンジニア大募集中!

    ライトコードでは、エンジニアを積極採用中です。

    特に、WEBエンジニアとモバイルエンジニアは是非ご応募お待ちしております!

    また、フリーランスエンジニア様も大募集中です。

    background