05 · 子 Agent 的成本账
隔离不是甩活。五要素 brief 是生命线。
开场比喻
对前端开发者,子 Agent 最贴切的类比是 Web Worker:
| Web Worker | 子 Agent |
|---|---|
| 独立 thread,不共享主线程内存 | 独立会话,看不到主对话历史 |
| 启动有开销(Worker 冷启动) | 启动有开销(context 冷加载) |
| 只能 postMessage 通信 | 只能通过最终 return 一条结果 |
| 适合 CPU-intensive 或隔离任务 | 适合大搜索、独立分析、并行任务 |
| 滥用反而更慢 | 滥用反而更贵更慢 |
Web Worker 的黄金法则同样适用:只在"真能回本"时才开。
Claude Code 的子 Agent 种类
你环境里常见几种:
| Agent | 用途 |
|---|---|
| Explore | 快速扫全仓库(搜关键词、找模式) |
| Plan | 独立出方案(和 04 的 Plan 阶段互补) |
| general-purpose | 通用任务、多步探索 |
| claude-code-guide | 查 Claude Code 自身用法 |
每个 agent 都是独立冷启动的,不继承主对话的 context。
成本账:开一个子 Agent 的真实代价
每开一个子 Agent,你付五项成本:
| 成本项 | 含义 |
|---|---|
| Brief 成本 | 要写自包含 prompt(它看不到主对话) |
| 冷启动成本 | 整个 context 从 0 加载 |
| Token 成本 | 它读的所有文件都计费 |
| 时间成本 | 启动 + 执行 + 等结果 |
| 验证成本 | 结果回来你还得 verify 一遍 |
相比之下,主对话自己干:上下文已有,直接用 Read / Grep / Bash,即时反馈,可中断。
什么时候值得开
开子 Agent 的三个条件(满足其一就考虑):
| 条件 | 典型场景 | 推荐 agent |
|---|---|---|
| 任务独立且可并行 | 同时评审 + 依赖审计 + 安全扫描 | 多个 general-purpose |
| 要扫大量文件 / 目录(context 会炸) | "整个 monorepo 里所有 API 端点在哪" | Explore |
| 需要独立视角 | 方案评审、二次验证 | Plan / reviewer |
什么时候不开
| 情况 | 替代方案 |
|---|---|
| 知道确切路径 / 符号 | 直接 Read / grep |
| 1-2 步就能搞定 | 自己干 |
| 需要高频来回交互 | 自己干(子 Agent 没"记忆") |
| 只为"省 context" 但任务本身很小 | 不划算 |
| 需要用户反复介入调整 | 自己干 |
并行 vs 串行
规则:一条消息里发多个 Agent 工具调用 = 并行;要等前一个结果再起下一个 = 串行。
并行的好场景
完全独立的任务同时跑:
并行发出:
- Agent(Explore): 找所有用了 useEffect 的组件
- Agent(Explore): 找所有 API route handler
- Agent(general-purpose): 检查依赖是否有 deprecated 的三个 agent 同时干活,总耗时 ≈ 最慢的那个。
串行的好场景
后一步要前一步的结果:
串行:
1. Agent(general-purpose): 调研这个库的 API 设计
2. [读完结果] → Agent(Plan): 基于调研出方案
3. [读完方案] → 自己实现常见误用:能并行的硬串行(慢 2-3 倍),或依赖关系的强行并行(后一个拿不到前一个的结果,白跑)。
Brief 的艺术
子 Agent 冷启动,它看到的 prompt 就是它的全部世界。Brief 好不好,直接决定结果有没有用。
五要素公式
[背景] + [具体位置] + [明确任务] + [输出形式] + [长度限制]对比
❌ 太笼统:
帮我看看 checkout 流程有什么问题子 Agent:什么流程?什么问题?看哪些文件?多长的回答?…… 乱猜一通,交付模糊。
✅ 完备 Brief:
检查 src/app/checkout 下的提交流程是否有重复提交保护。
背景:QA 报告用户双击 Pay 按钮会重复扣款,我怀疑 handleSubmit 没 debounce。
具体位置:src/app/checkout/page.tsx 的 CheckoutForm 组件,
和 src/actions/payment.action.ts 的 submitPayment。
任务:
1. 确认 handleSubmit 是否做了 debounce 或 loading 锁
2. 确认 server action 是否有幂等检查
输出:
- 问题确认 ✓ / ✗
- 根本原因 1-2 句
- 建议修复方向 3 条以内
- 不要改代码
长度:300 字以内子 Agent 有路径、有关键函数、有边界("不要改代码"),不会跑偏。
常见 Brief 错误
| 错误 | 后果 |
|---|---|
| "按刚才说的改一下" | 它不知道"刚才" |
| "你觉得呢?" | 没约束,交付天马行空 |
| 没给文件路径 | 它要自己 grep 半天 |
| 没设输出长度 | 给你写 3000 字报告 |
| 没说"改 / 不改代码" | 可能自作主张提交 |
信任但验证
子 Agent 回来的总结是它认为自己做了什么,不等于实际做了什么。
特别要警惕:
- 子 Agent 说"已修改 5 处" → 你自己
git diff看 - 子 Agent 说"全部测试通过" → 你自己跑一遍
pnpm test - 子 Agent 说"没有相关代码" → 它可能搜错关键词,自己 grep 一次确认
反模式六连
| 反模式 | 症状 | 修正 |
|---|---|---|
| 事事开子 Agent | 每个小任务都 spawn 一个 | 小任务自己干 |
| Brief 太短 | "帮我看看 X" → 回来啥也没说清 | 五要素公式补齐 |
| 引用"刚才" | "按上面说的办" → 子 Agent 懵 | prompt 自包含 |
| 盲信总结 | "它说都改好了" → 合并后翻车 | 自己看 diff |
| 交互探索用子 Agent | 反复 spawn 多次 agent 问同一仓库 | 第一次就问清楚 |
| 能并行的串行发 | 一个接一个 spawn 独立任务 | 一条消息多个 Agent |
一句话总结
子 Agent 是"隔离 + 扩展",不是"甩活"。
开销在那里,Brief 不写到位就是浪费;真正用得好,一条消息里并行三个 agent,能把你从 15 分钟干到 5 分钟。
判断速查
任务来了
↓
能在主对话 1-2 步搞定? ── 是 → 自己干
↓ 否
要大范围搜索、独立视角、或 2+ 独立任务?
↓ 是
↓
2+ 独立任务? ── 是 → 一条消息并行多 agent
↓ 否
↓
能写完 5 要素 brief? ── 否 → 先想清楚再开
↓ 是
开!
↓
结果回来,看 diff / 跑验证(不看总结)← 04 · Plan → Execute → Review 的协作节奏 | 目录 | 06 · Hook 与自动化 →