認証モジュールをリファクタリングするために5つのサブエージェントオーケストレーションを立ち上げた。$11かかり、12分かかり、1つのスレッドでやるより悪い結果を生んだ。サブエージェントはソロビルダーには過大評価されており、美しいエージェント群を見せる Twitter のデモは、高くなってめちゃくちゃになる部分を語っていない。
誤解しないでほしい。サブエージェントは本物の機能で、本物の用途がある。しかし「すべてを専門化されたエージェントに分割する」というデフォルトのアドバイスは、1人でプロダクトを構築する人には間違っている。ほとんどの場合、ただ作業をこなすフラットなシングルスレッドのエージェントが欲しいはずだ。なぜかを説明しよう。
サブエージェントの実際のコスト
サブエージェントを生成するとき、単にタスクを委任しているだけではない。メインスレッドについて何も知らない新鮮なコンテキストを立ち上げている。だからブリーフィングしなければならない。すべてのサブエージェントに関連ファイル、規約、目標をゼロから再説明する必要がある。そのブリーフィングはトークンだ。サブエージェントの作業もトークンだ。そして報告が戻ってきて、その報告をメインスレッドに統合するのもさらにトークンだ。
境界がきれいな並列タスクなら、そのオーバーヘッドは価値がある。しかし要素が絡み合っているタスク(実際のコーディングのほとんどはそれだ)では、ブリーフィングの税金を何度も払い続け、どのサブエージェントも全体像を見えていないため互いに干渉し続ける。
シングルスレッド版は...すでにコンテキストを持っている。ファイルを一度読んだ。3ステップ前に何をしたかを覚えている。ブリーフィングなし、統合なし、調整オーバーヘッドなし。しばしばより安くてより良い。
コンテキスト断片化の問題
これが微妙な点だ。エージェントがコーディングに優れている全体の理由は共有コンテキストだ。モデルが問題、ファイル、そして自分自身の以前の決定を一か所に保持し、すべてを通して推論する。サブエージェントはそれを粉砕する。それぞれがスライスしか見えない。
だからサブエージェント A はエラー処理を自分のやり方で修正する。別途ブリーフィングされたサブエージェント B は検証を別のやり方で修正する。互いが何をしたか誰も知らない。メインスレッドにいるあなたは今、ローカルでは合理的だが互いに合わない2つの変更を調整しなければならない。サブエージェントが節約した時間より、サブエージェントの出力を調整するのに多くの時間を費やしてきた。これが罠だ。
ソロビルダーにとってのアドバンテージは、あなたが頭の中で全体像を持ち、エージェントがそれをコンテキストに持つことだ。チームのように見せるためにそれを断片化することは、持っていない組織のコスプレだ。
サブエージェントが本当に価値を持つとき
「絶対使わない」とは言っていない。実際に使う場面はこれだ:
- 本当に並列で独立した作業。 「テストスイートを実行しつつコードベースをもリントする。」共有状態なし、調整なし。きれいなファンアウト。
- 意図的なコンテキスト分離。 サブタスクがメインコンテキストに汚したくないゴミをあふれさせるとき(例えば1つの質問に答えるために40ファイルを読む場合)。サブエージェントが40を読み、1つの答えを返し、メインコンテキストは清潔に保たれる。良い使い方だ。
- 限定的なリサーチ。 「このライブラリの認証がどう機能するか調べて報告して。」探索は混乱するが、欲しいのは結論だけだ。
パターンに気づいてほしい:サブエージェントはサブタスクが独立していてかつ要約可能なときに価値を持つ。価値はメインスレッドから混乱を排除することにあり、チームのふりをすることではない。
オーケストレーション幻想
マルチエージェントの夢を売るコンテンツのジャンルがある。プランナーエージェント、コーダーエージェント、レビュアーエージェント、テスターエージェント、すべてが小さな会社のように協調する。図で見ると信じられないくらいすごい。ソロビルダーにとってはほとんどの場合、$0.50のタスクを$6にする方法だ。
プランナーがコーダーにタスクを再説明する。コーダーが作業を生成する。独自の新鮮なコンテキストを持つレビュアーが、すべてを再読してレビューする。テスターがもう一度読む。すべての引き渡しが同じコードを再処理する。大きなチームの非効率性を再現してしまった。すべてのコミュニケーションオーバーヘッドがあるのに、恩恵はない。なぜならまだあなたとモデルだけだから。
1つのスレッドの有能なエージェントが、すべてをコンテキストに保持しながら計画し、コードを書き、自己チェックする。最後に diff を読む。それがあなたのレビュアーだ。あなたが組織図だ。
私のルール
デフォルトはフラットに。1つのスレッド、1つのエージェント、完全なコンテキスト。サブエージェントに手を伸ばすのは、このサブタスクは独立しているか、また要約だけを返してほしいかに「はい」と答えられるときだけ。
# 生成する前に問う質問:
# - メインの作業から独立しているか? (調整すべき共有状態がない)
# - 要約可能か? (結論が欲しい、生の出力ではない)
# 両方はい -> サブエージェント。それ以外 -> フラットを維持。
それ以外はすべてメインスレッドに留まる。コンテキストが完全で請求額が少ない場所に。
エージェント群は未来のように見える。1人で1つのプロダクトをリリースする人にとっては、たいていコスチュームだ。脱いで1つのスレッドで作業をやり遂げろ。トークン予算が感謝するし、コードもそうなる。
