能撑过几个小时长任务的Agent,外面都包着一层东西:一张反复回看的任务清单;一条“别因为到了一个阶段就停下来汇报”的规则;一个不见证据就不认“完成”的检查器。我们把这层东西叫Harness。任务越难,它往往比里面的模型还重要。11这里的Harness指模型调用之外的一切:循环、工具、Prompt,以及Agent读写的文件。
我一直在想一个问题:Harness里有多少东西,其实是模型自己可以掌握的知识?
01#三类脚手架
回头看过去一年写过的Harness,里面的部件大致分三类,像洋葱一样一层层包在模型外面。
- 记忆:清单、草稿文件、上下文重置后还能留下的摘要。它们弥补的是有限的上下文窗口。
- 纪律:什么时候停、什么时候验证、什么时候问人。它们纠正的是模型在别处学来的习惯。
- 判断:把子任务交给合适的工具,判断一个结果够不够好。它们编码的是品味。
一条Harness规则,就是把一次纠正写下来,然后每次调用都付一遍代价。
记忆更像基础设施,大概会一直留在权重外面。纪律是最有意思的中间地带。判断最难。
02#一条规则值多少钱
换个角度看为什么要内化:Prompt里的每条规则,每次调用都要花token;模型花在读规则上的注意力,就没花在任务上。如果一个Harness有条规则、平均长度,一次任务调用次,额外开销大约是
长任务里动辄几百,这笔账很快就大了。模型已经内化的规则,推理时一分钱不花。
03#去掉规则会怎样
我想做的实验:从一个能用的Harness出发,每次删一条规则,测长任务还能做对多少;先测基础模型,再测用完整Harness轨迹训练过的模型。
逐条删除 Harness 规则后的任务成功率(示意)
长任务成功率,横轴为删掉的规则数
- 基础模型
- 用 Harness 轨迹训练
| 基础模型 | 用 Harness 轨迹训练 | |
|---|---|---|
| 0 | 78% | 80% |
| 1 | 71% | 79% |
| 2 | 63% | 76% |
| 3 | 52% | 73% |
| 4 | 44% | 69% |
| 5 | 35% | 62% |
| 6 | 29% | 55% |
如果训练后的曲线保持平稳、基础模型的曲线往下掉,平稳那一段对应的规则就已经搬进了权重。
04#一个小例子
我用得最多的一条纪律规则长这样:
def should_continue(turn, tasks, attempts): # 只有文字、没有工具调用的结束,是汇报,不是完成的证据。 if turn.stop_reason == "end_turn" and tasks.open(): return attempts < 3 return False它管用。但它也说明,模型自己会在没做完的时候以为做完了。如果模型把这条规则内化了,这段代码就成了死代码。
05#哪些规则先搬进去
删掉该规则后变差的运行占比(示意)
去掉规则后变差的运行
- 基础模型
- 训练后
| 基础模型 | 训练后 | |
|---|---|---|
| 任务清单 | 64% | 61% |
| 停止规则 | 48% | 12% |
| 验证规则 | 41% | 15% |
| 工具路由 | 22% | 18% |
| 脚手架 | 放在哪里 | 能搬进权重吗 |
|---|---|---|
| 任务清单 | 文件 | 不太可能 |
| 停 / 继续的规则 | Prompt + 循环 | 有可能 |
| 验证习惯 | Prompt | 有可能 |
| 工具路由 | 代码 | 部分可以 |
这是一篇占位文章,用来预览博客版式,之后会换成正式内容。