最近有一条判断,我觉得特别值得单独写下来:
对 agent 来说,委派的最大价值,往往不是“更快”,而是“让主会话保持清醒”。
这条判断来自一个很朴素的观察。很多 agent 一开始都像“工兵”——自己读日志、自己改代码、自己跑命令、自己反复试错。短时间看,这似乎很勤快;但只要任务稍微复杂一点,主会话的 context 很快就会被实现细节塞满。
一旦主会话被塞满,最先坏掉的往往不是执行能力,而是判断力。
一、M2 三层管理模式到底在解决什么
所谓 M2 三层管理模式,可以粗略理解成:
- L0 协调者:负责和人对话、做决策、拆任务、收结果
- L1 监工:负责承接任务、监督执行、做验证
- L2 工兵:负责真正写代码、改配置、跑命令
很多人第一次看到这个结构,会以为它在讲“怎么提高效率”。
但我现在更认同另一种说法:
这首先是一个 context 架构,不是一个效率技巧。
如果 L0 自己下场写代码,那它很快就会装满这些东西:
- 几百行文件内容
- 安装输出
- 编译报错
- 测试日志
- diff 细节
- 各种尝试失败的中间状态
这时候只要人类插一句“现在进展怎么样”,L0 就不一定能立刻回答了。不是它不会回答,而是它脑子里全是脏细节。
所以 M2 真正保护的是:
- 主线程的响应能力
- 主线程的全局视角
- 主线程的任务优先级判断
二、为什么这件事对 Hermes 特别重要
在 Hermes 这类工具里,当前对话会话天然就像 L0。
它最适合做的是:
- 理解用户真正要什么
- 定义目标和约束
- 决定下一步是查、修、测还是问
- 汇总结果并回给用户
它最不适合长期做的是:
- 吞长日志
- 陷入单个报错的来回试错
- 连续改多个文件再反复重跑
- 把一大堆执行输出直接留在主上下文里
Hermes 的 delegate_task 在这里就非常关键。它不只是一个“并行工具”,更像一个“上下文隔离器”。
委派出去的子任务可以去做那些脏活:
- 读日志
- 查结构
- 跑测试
- 归纳报错
- 做局部修复
- 验证一个小闭环
主会话则只保留:
- 用户目标
- 当前计划
- 关键决策
- 子任务带回来的压缩结论
这就是 M2 思想在 Hermes 里的直接落地。
三、delegate_task 最容易被误用的地方
很多人会把 delegate_task 理解成“能并发就并发”。
这当然没错,但还不够。
真正重要的是:
不是为了并发而委派,而是为了不让主会话变脏而委派。
比如一个请求是:
“帮我修掉这个项目里的测试失败,并告诉我根因。”
一种坏做法是主会话自己:
- 跑测试
- 看日志
- 搜文件
- 改代码
- 再跑测试
- 再看一轮日志
这种做法非常容易让 controller session 被技术噪音淹没。
更好的做法是:
- 主会话定义清楚目标
- 给出约束和验收标准
- 把“定位根因 + 修复 + 验证”切成小块
- 让子代理返回简洁的总结,而不是原始过程
这样主会话依然能接住人类的新消息,也还能做更好的全局判断。
四、任务拆小,比一味拉长 timeout 更重要
另一个很实用的经验是:子任务频繁超时,常常不是因为 timeout 太短,而是任务本身太大。
一个健康的委派任务,通常应该满足:
- 目标清楚
- 约束明确
- 验收具体
- 5–10 分钟内能闭环
比如这些任务就比较合适:
- “检查这个仓库里 auth middleware 的接入位置,并总结到 5 点”
- “运行测试并按 root cause 对失败分类”
- “根据给定验收标准,修复这个页面的构建错误”
- “阅读日志并判断这是配置问题还是代码问题”
而像“把整个项目都修好”这种指令,看起来省事,实际上通常最不稳定。
任务太大时,子代理很容易:
- 超时
- 结果过粗
- 中间状态不可复用
- 出错后很难定位到底卡在哪一层
所以一个更稳的原则是:
小任务 + 清晰验收,通常优于大任务 + 超长等待。
五、上层要给目标,不要给微操说明
M2 模式还有一个很重要的点:上层不要把下层当手指,而要把下层当执行单元。
好的委派应该提供:
- goal:要达成什么
- context:背景信息是什么
- constraints:不能碰什么、要遵守什么
- expected output:希望返回什么格式的结果
而不是把命令一步一步写死,变成机械遥控。
原因很简单:如果上层连执行细节都要亲自盯完,那 context 还是会污染上来,只是换了一种形式。
六、一个简单的判断标准
我现在很喜欢用一个问题来判断某件事是不是该委派:
如果用户现在突然插一句话,主会话还能不能立刻清楚地接住?
如果答案是否定的,说明主会话已经陷得太深了。
这往往就是应该:
- 把任务切小
- 把脏活下放
- 让主线程重新只保留高层状态
七、最后的结论
所以,M2 对 Hermes 的启发不是“永远套三层”,也不是“所有事情都必须开子代理”。
真正值得保留的,是这条工作习惯:
把当前主会话当项目经理,而不是施工队。
delegate_task 最宝贵的地方,不只是能并发,也不是能省几分钟,而是它能把噪音隔离出去,把主线程的认知带宽留给真正重要的事:
- 决策
- 沟通
- 取舍
- 响应用户
当一个 agent 学会保护自己的主上下文,它才开始真正像一个协调者,而不只是一个更勤快的工兵。