サブエージェント
コアループサブタスクごとに新しい文脈を使う|200 LOC|5 ツール
探索作業をきれいなサブコンテキストへ移して初めて、親 agent は主目標へ集中し続けられます。
s00 > s01 > s02 > s03 > [ s04 ] > s05 > s06 > s07 > s08 > s09 > s10 > s11 > s12 > s13 > s14 > s15 > s16 > s17 > s18 > s19
大きな仕事を全部 1 つの context に詰め込む必要はありません。
subagent の価値は「model を 1 個増やすこと」ではなく、「clean な別 context を 1 つ持てること」にあります。
この章が解く問題
agent がいろいろな調査や実装を進めると、親の messages はどんどん長くなります。
たとえば user の質問が単に
「この project は何の test framework を使っているの?」
だけでも、親 agent は答えるために、
pyproject.tomlを読むrequirements.txtを読むpytestを検索する- 実際に test command を走らせる
かもしれません。
でも本当に親に必要な最終答えは、
「主に
pytestを使っています」
の一文だけかもしれません。
もしこの途中作業を全部親 context に積み続けると、あとで別の質問に答えるときに、
- さっきの局所調査の noise
- 大量の file read
- 一時的な bash 出力
が main context を汚染します。
subagent が解くのはこの問題です。
局所 task を別 context に閉じ込め、親には必要な summary だけを持ち帰る
のがこの章の主線です。
先に言葉をそろえる
親 agent とは何か
いま user と直接やり取りし、main messages を持っている actor が親 agent です。
子 agent とは何か
親が一時的に派生させ、特定の subtask だけを処理させる actor が子 agent、つまり subagent です。
context isolation とは何か
これは単に、
- 親は親の
messages - 子は子の
messages
を持ち、
子の途中経過が自動で親 history に混ざらないこと
を指します。
最小心智モデル
この章は次の図でほぼ言い切れます。
Parent agent
|
| 1. 局所 task を外へ出すと決める
v
Subagent
|
| 2. 自分の context で file read / search / tool execution
v
Summary
|
| 3. 必要な結果だけを親へ返す
v
Parent agent continues
ここで一番大事なのは次の 1 文です。
subagent の価値は別 model instance ではなく、別 state boundary にある
ということです。
最小実装を段階で追う
第 1 段階: 親に task tool を持たせる
親 agent は model が明示的に言える入口を持つ必要があります。
この局所仕事は clean context に外注したい
その最小 schema は非常に簡単で構いません。
{
"name": "task",
"description": "Run a subtask in a clean context and return a summary.",
"input_schema": {
"type": "object",
"properties": {
"prompt": {"type": "string"}
},
"required": ["prompt"]
}
}
第 2 段階: subagent は自分専用の messages で始める
subagent の本体はここです。
def run_subagent(prompt: str) -> str:
sub_messages = [{"role": "user", "content": prompt}]
...
親の messages をそのまま共有しないことが、最小の isolation です。
第 3 段階: 子に渡す tool は絞る
subagent は親と完全に同じ tool set を持つ必要はありません。
むしろ最初は絞った方がよいです。
たとえば、
read_file- 検索系 tool
- read-only 寄りの
bash
だけを持たせ、
- さらに
task自体は子に渡さない
ようにすれば、無限再帰を避けやすくなります。
第 4 段階: 子は最後に summary だけ返す
一番大事なのはここです。
subagent は内部 history を親に全部戻しません。
戻すのは必要な summary だけです。
return {
"type": "tool_result",
"tool_use_id": block.id,
"content": summary_text,
}
これにより親 context は、
- 必要な答え
- もしくは短い結論
だけを保持し、局所ノイズから守られます。
この章の核になるデータ構造
この章で 1 つだけ覚えるなら、次の骨格です。
class SubagentContext:
messages: list
tools: list
handlers: dict
max_turns: int
意味は次の通りです。
messages: 子自身の contexttools: 子が使える道具handlers: その tool が実際にどの code を呼ぶかmax_turns: 子が無限に走り続けないための上限
つまり subagent は「関数呼び出し」ではなく、
自分の state と tool boundary を持つ小さな agent
です。
なぜ本当に useful なのか
1. 親 context を軽く保てる
局所 task の途中経過が main conversation に積み上がりません。
2. subtask の prompt を鋭くできる
子に渡す prompt は次のように非常に集中できます。
- 「この directory の test framework を 1 文で答えて」
- 「この file の bug を探して原因だけ返して」
- 「3 file を読んで module 関係を summary して」
3. 後の multi-agent chapter の準備になる
subagent は long-lived teammate より前に学ぶべき最小の delegation model です。
まず「1 回限りの clean delegation」を理解してから、
- persistent teammate
- structured protocol
- autonomous claim
へ進むと心智がずっと滑らかになります。
0-to-1 の実装順序
Version 1: blank-context subagent
最初はこれで十分です。
tasktoolrun_subagent(prompt)- 子専用
messages - 最後に summary を返す
Version 2: tool set を制限する
親より小さく安全な tool set を渡します。
Version 3: safety bound を足す
最低限、
- 最大 turn 数
- tool failure 時の終了条件
は入れてください。
Version 4: fork を検討する
この順番を守ることが大事です。
最初から fork を入れる必要はありません。
fork とは何か、なぜ「次の段階」なのか
最小 subagent は blank context から始めます。
でも subtask によっては、親が直前まで話していた内容を知らないと困ることがあります。
たとえば、
「さっき決めた方針に沿って、この module へ test を追加して」
のような場面です。
そのとき使うのが fork です。
sub_messages = list(parent_messages)
sub_messages.append({"role": "user", "content": prompt})
fork の本質は、
空白から始めるのではなく、親の既存 context を引き継いで子を始めること
です。
ただし teaching order としては、blank-context subagent を理解してからの方が安全です。
先に fork を入れると、初心者は
- 何が isolation で
- 何が inherited context なのか
を混ぜやすくなります。
初学者が混ぜやすいポイント
1. subagent を「並列アピール機能」だと思う
subagent の第一目的は concurrency 自慢ではなく、context hygiene です。
2. 子の history を全部親へ戻してしまう
それでは isolation の価値がほとんど消えます。
3. 最初から役割を増やしすぎる
explorer、reviewer、planner、tester などを一気に作る前に、
clean context の一回限り worker
を正しく作る方が先です。
4. 子に task を持たせて無限に spawn させる
境界がないと recursion で system が荒れます。
5. max_turns のような safety bound を持たない
局所 task だからこそ、終わらない子を放置しない設計が必要です。
この章を読み終えたら何が言えるべきか
- subagent の価値は clean context を作ることにある
- 子は親と別の
messagesを持つべきである - 親へ戻すのは内部 history 全量ではなく summary でよい
一文で覚える
Subagent とは、局所 task を clean context へ切り出し、親には必要な結論だけを持ち帰るための最小 delegation mechanism です。