Agent Mentor Learn
コンテキストエンジニアリング: 有限のアテンションを効くところに使う · 第 5 回 / 全 6 回

レッスン5: サブエージェントとコンテキスト分離

学習目標:

  • サブエージェントがなぜコンテキスト管理の一手になるのかを説明する: きれいなウィンドウと、返ってくるサマリー。「過程」をメインウィンドウの外に置く
  • 過程トークンと結論トークンの比率、そして実測のコストデータを使って、そのタスクをサブエージェントに渡す価値があるか判断する
  • 本シリーズのコース7で書いたハーネスループにサブエージェントのディスパッチを組み込み、1回のディスパッチがメインウィンドウにサマリーをちょうど1件だけ返すようにする

前提: コンパクションとノートを扱ったレッスン4を修了し、本シリーズのコース7「Agent Harness Fundamentals: Loops and Control」で書いたハーネスループを実行できること | 前: レッスン4 << | 次: レッスン6 >>

視点の転換: 分業ではなく、分離のために

サブエージェントには本シリーズのコース6「マルチエージェントコラボレーション」ですでに出会っています。タスクをどう分けるか、結果をどう報告するか、複数のエージェントがどう協調するか。あのコースが答えたのは、複数のエージェントがどう協働するかという問いでした。このレッスンが答えるのは別の問いです。そもそもサブエージェントは、なぜコンテキスト管理の技法なのか?

言い換えましょう。リードエージェントが1体だけで、チームの協調がまったく必要ない場合でも、あなたはサブエージェントに手を伸ばしたくなります。分業のためではなく、分離のためにです。

レッスン1の予算という見方を思い出してください。モデルがコンテキストを解析するときはアテンション予算から引き出しており、コンテキストに入る新しいトークンはすべてその予算を少しずつ削ります1。トークンを積み上げるほど、モデルがそのコンテキストから情報を正確に想起する能力は落ちていきます1。そしてエージェントは、まさにトークンが積み上がりやすい場です。ループの各ターンが、次のターンの推論に関係しうる新しいデータを生み、捨てるのも難しく、抱えるのも難しい1

探索タスクはこの問題が最も鋭く出る形です。たとえばメインエージェントが、数十万行のリポジトリ全体から非推奨 API のすべての呼び出し箇所を追跡しなければならないとします。grep が十数回、開くファイルが 20 個、読む行数が数千行。この中間コンテンツは数万トークンに達するのに、残す価値のある結論はせいぜい5行です。「呼び出し箇所はこの3つのモジュールに集中しており、移行順序の推奨はこうです」。これがすべてメインウィンドウで起きれば、アテンション予算は過程に食い尽くされ、結論とその後の作業のためにほとんど残りません。

サブエージェントは、まさにこの問題に向けられた刃です。

仕組み: きれいなウィンドウを入り口に、圧縮したサマリーを出口に

仕組みは1文に収まります。専門化したサブエージェントが、焦点を絞ったタスクをきれいなコンテキストウィンドウで処理し1、探索が生む大量の中間コンテンツ — 検索結果、生のファイル内容、行き止まり — はすべてサブエージェントの内側に留まり1、メインエージェントに返るのは凝縮され蒸留された作業のサマリーだけ、多くの場合 1,000-2,000 トークンです1

したがってメインエージェントのウィンドウが運ぶのは結論だけで、過程は決して運びません。これは非対称な設計です。サブエージェントは探索に数万トークンを燃やすかもしれませんが、そこから出ていくのは短い一節のテキストだけです。

コードにすれば、これはコース7で書いたハーネスの新しい初手にすぎません。簡潔に保つため、あのコースのループで繰り返し登場した2つの動作をここではヘルパーにまとめています。textOf はレスポンスからテキストブロックを取り出し、appendToolResults はこのターンのツールを実行して tool_result ブロックをメッセージ配列に追加します(内部でやっていることは、あのコースで手書きしたものとまったく同じです。各 tool_use を実行し、結果を集め、送り返す)。

3つの細部に注目してください。第1に、messages はたった1件のタスク記述から始まり、メインエージェントの履歴を一言も運びません。これが「きれいなウィンドウ」の意味のすべてです。第2に、この関数が返すのは textOf(response)、つまりただの文字列です。ループの内側で積み上がった数十回のツール往復は、ローカル変数 messages とともに消えます。第3に、サブエージェントのシステムプロンプトは「生のテキストを繰り返すな」と明示的に要求しています。サマリーの圧縮品質は、まさにここで決まります。

メインエージェント側では、ディスパッチという動作は、すでにある stop_reason ループに差し込むただのツールです。

task フィールドの description を見てください。「自己完結したタスク記述。サブエージェントはこの会話の履歴を見ることができない」。この一文はメインエージェントに向けて書かれています。メインエージェントはタスクを余さず述べなければなりません。向こう側にいるのは記憶を持たない新しいウィンドウだからです。ツールの description で目的と境界をここまで正確に言い切ること自体が、レッスン2の「コンテキストとしてのツール」の考え方そのものです。ツールは自己完結し、エラーに強く、意図された用途について極めて明確であるべきです1

一次データ: 知的フィルターとしてのサブエージェント

仕組みは片づきました。次は実測です。Anthropic は自社のマルチエージェントリサーチシステム — Claude の Research 機能の背後にあるアーキテクチャ — を公開の形で書き起こしており、これは希少な一次エンジニアリング資料です2

そこにある知見のうち、3つがこのレッスンに直結します。

  • サブエージェントは、それぞれ自分のコンテキストウィンドウを持って並列に動くことで圧縮を成立させます2。各サブエージェントは自分のウィンドウの中で探索し、他を圧迫しません。
  • 彼らはサブエージェントを "intelligent filters" と呼びます。リードリサーチエージェントのために最も重要なトークンを凝縮するからです2。「フィルター」という語は的確です。入るのはコーパス、出るのは要点です。
  • 噛みしめる価値のある一文があります。"The essence of search is compression: distilling insights from a vast corpus."2 このレッスンの文脈で読めば、サブエージェントが走らせるすべての探索は、あの 1000 トークンの蒸留物を生むために存在しています。

余談ですが、並列性は速度も買います。複数のリサーチの筋が同時に進むからです。ただしそれはオーケストレーションの話題で、本シリーズのコース6ですでに扱っています。このレッスンは圧縮の側面だけを見つめます。

帳簿のもう一面: 分離はコスト削減策ではない

利点を並べたなら、請求書も並べなければなりません。同じ記事に実測値が載っています。これらは Anthropic のリサーチシステムでの実測であり、普遍的な法則ではないことに注意してください。

  • エージェントはチャットのやり取りより、おおよそ 4× 多いトークンを使います2
  • マルチエージェントシステムはチャットより、おおよそ 15× 多いトークンを使います2
  • パフォーマンスがどこから来るのかを分析したところ、トークン使用量それ自体が分散の 80% を説明し、ツール呼び出しの回数とモデルの選択が残りの大半を占めていました2

彼ら自身の結論は率直です。"Multi-agent systems work mainly because they help spend enough tokens to solve the problem."2

なのではっきり言いましょう。サブエージェントはコスト削減策ではありません。 総トークンは上がる一方です。タスクを言い直し、背景を敷き直し、複数のウィンドウが同時に燃えます。買っているのは別のものです。どのウィンドウも劣化していない範囲に留まり、アテンション密度が最後まで高いまま保たれること。これはアテンションの取引です。総トークンを多く払って、それぞれにきれいなウィンドウを得るのです。

その取引が見合うのはどんなときでしょうか。レッスン1の予算という見方に戻ります。コンテキストは限界収穫が逓減する有限の資源です1。判断の物差しは2つです。

  1. 過程と結論の比率。 このタスクの中間コンテンツはどれだけ大きく、最終的な結論はどれだけ小さいか。比率が偏っているほど、分離の見返りは大きくなります。逆に、そもそも過程が短いタスクをディスパッチすれば、それは純粋な受け渡しのオーバーヘッドです。
  2. 複雑さが結果を実証的に改善するかどうか。 Anthropic の指針は、複雑さの追加は結果を実証的に改善するときにのみ検討せよ、というものです。原文の語は "consider" であり、鉄則ではなく分量の問題です3。追加のトークンがよりよい出力を買わないなら、1つのウィンドウに戻ってください。

長時間タスクの組み合わせ技: ノートを土台に、引き継ぎで持久力を

サブエージェントのウィンドウがどれほどきれいでも、やはり有限です。本当に長期にわたるタスクについて、あの記事は組み合わせ技を描いています。エージェントは完了した作業フェーズを要約して要点を外部メモリに保存し2、それからきれいなコンテキストを持つ新しいサブエージェントを立ち上げて引き継がせ、丁寧なハンドオフによって連続性を保ちます2

これはレッスン4とこのレッスンを、ひと続きの手順に縫い合わせます。

  • レッスン4の構造化ノートが「重要な状態をウィンドウの外に置く」を担当します。NOTES.md、タスクリスト。それらはファイルシステムに住み、どのウィンドウのアテンションも占有しません。
  • このレッスンの分離が「すべての作業の区間をきれいなウィンドウの中に収める」を担当します。新しいサブエージェントが最初にすることはノートを読むことです。前任者の履歴全体を継承する必要はなく、前任者が蒸留した要点だけでいい。

引き継ぎ文書には何を書くのでしょうか。レッスン4のコンパクションとまったく同じ取捨の基準を再利用してください。アーキテクチャ上の決定、未解決のバグ、実装詳細を残し、冗長なツール出力を捨てる1。引き継ぎを書くこととコンパクションのサマリーを書くことは同じ技芸で、変わるのは読み手が「未来の自分」から「次のサブエージェント」になることだけです。

Claude Code ではこう見える

最後に、毎日使っている実装と突き合わせてみましょう。Claude Code の公式ベストプラクティスははっきり述べています。コンテキストウィンドウはすぐに埋まり、埋まるにつれてパフォーマンスは劣化する。"The context window is the most important resource to manage."4 コンテキストが根本的な制約である以上、サブエージェントは利用できる最も強力なツールの1つです4

その実装は、このレッスンが述べてきた仕組みと一致します。サブエージェントは別々のコンテキストウィンドウで走り、サマリーを報告して返します4。Claude Code に「このバグの根本原因を突き止めて」と頼めば、ディスパッチされたサブエージェントは grep し、ファイルを読み、呼び出し連鎖をたどります。その探索はすべてサブエージェント自身のウィンドウで起き、メインの会話が受け取るのは最後の調査サマリーだけです。調査のスコープを狭く切るか、サブエージェントに渡すかすれば、探索がメインのコンテキストを消費することはありません4

インターフェイスの中でサブタスクがバックグラウンドで走り、終わったときにメインの会話が短いレポートだけを得るのを見たなら、それがこのレッスンが最初から述べてきた「きれいなウィンドウを入り口に、圧縮したサマリーを出口に」です。

ここまでで、長時間タスクの道具箱の3点すべてを見たことになります。コンパクション(レッスン4)、構造化ノート(レッスン4)、そしてマルチエージェントアーキテクチャ(このレッスン)。3つに共通する狙いは、エージェントが一連の行動を通じて一貫性、コンテキスト、目標志向の振る舞いを保てるようにすることです1。レッスン6では、この3つすべてをあなた自身のハーネスに組み込みます。

まとめ

  • サブエージェントはコンテキスト管理の技法です。焦点を絞ったタスクがきれいなコンテキストウィンドウで走り、探索の中間コンテンツはサブエージェントの内側に分離され、返るのは多くの場合 1,000-2,000 トークンの蒸留されたサマリーだけ。メインウィンドウが運ぶのは結論であって、過程ではありません1
  • Anthropic のマルチエージェントリサーチシステムでは、サブエージェントが別々のコンテキストウィンドウで並列に走り、それによって圧縮を成立させ、リードエージェントのために最も重要なトークンを凝縮する "intelligent filters" として働きます。"The essence of search is compression"2
  • 同じシステムの実測値: エージェントはチャットより約 4× 多いトークンを使い、マルチエージェントシステムは約 15×、そしてトークン使用量それ自体がパフォーマンスの分散の 80% を説明します。分離はアテンションの取引であり、「総トークンを多く払って、劣化しないウィンドウを得る」ことであって、コスト削減策ではありません2
  • 分離が見合うかどうかは、過程と結論の比率と、追加した複雑さが結果を実証的に改善するかで決まります。Anthropic の語は "consider" であり、鉄則ではなく分量の問題です3
  • 長時間タスクの組み合わせ技: フェーズが完了したら要約し、要点を外部メモリに保存し、それからきれいなコンテキストの新しいサブエージェントを立ち上げ、丁寧なハンドオフで連続性を保つ。レッスン4のノートとこのレッスンの分離は一対の組み合わせです2
  • Claude Code においてコンテキストウィンドウは管理すべき最も重要な資源であり、だからこそサブエージェントは利用できる最も強力なツールの1つになります。サブエージェントは別々のコンテキストウィンドウで走り、サマリーだけを報告して返します4

>> レッスン6: 実践: ハーネスにコンテキスト管理を組み込む

Footnotes

  1. Effective context engineering for AI agents — Anthropic Engineering — https://www.anthropic.com/engineering/effective-context-engineering-for-ai-agents 2 3 4 5 6 7 8 9 10 11

  2. How we built our multi-agent research system — Anthropic Engineering — https://www.anthropic.com/engineering/multi-agent-research-system 2 3 4 5 6 7 8 9 10 11 12 13

  3. Building Effective AI Agents — Anthropic Engineering — https://www.anthropic.com/engineering/building-effective-agents 2

  4. Best practices for Claude Code — Claude Code Docs — https://code.claude.com/docs/en/best-practices 2 3 4 5

練習

01

あなたのメインエージェントが3つのタスクを引き受けます。

レベル1: 3つのタスクについて分離の判断を下す
  • タスクA: 数十万行のリポジトリで、非推奨の LegacyLedgerReader API をまだ使っているすべての呼び出し箇所を見つけ、移行順序を提案する。
  • タスクB: メインエージェントは 80 行の関数をコンテキストに読み込んだばかりです。ユーザーがその中の off-by-one バグを指摘し、修正を求めています。
  • タスクC: ライブラリ選定の判断のため、パース系ライブラリの候補3つを調査する。それぞれのドキュメントを読み、issue トラッカーを掘り、横並びで比較する。

タスクごとに、分離する(サブエージェントをディスパッチする)か、しない(メインウィンドウでやる)かの判断を書き、当てはまる場合は並列性にも触れ、このレッスンの基準を使って1〜2文の理由を添えてください。

完了基準 · ローカルでチェック
02

あなたは本シリーズのコース7のハーネスにサブエージェントを組み込み、ディスパッチロジックをこう書きました。

レベル2: 「見せかけの分離」ディスパッチ関数を直す

症状: リサーチのディスパッチを3回行ったあと、メインエージェントのコンテキスト使用量がウィンドウの上限に近づき、レッスン4で組み込んだコンパクションロジックが早すぎるタイミングで発動させられます。メインエージェントのメッセージ配列を調べると、トークンの大部分がサブエージェントの生のツール戻り値であることがわかります。

根本原因を指摘し、1回のディスパッチがメインウィンドウにサマリーを1件だけ追加するようにコードを直してください。

完了基準 · ローカルでチェック