yaxin-luo/blog/what-the-harness-knows
EN/中
what-the-harness-knows.zh.md
长文EN中 2分钟 地图之外

Harness知道、模型却不知道的东西

一个能跑几个小时的Agent,大部分是脚手架。这些脚手架里,哪些可以让模型自己学会?

能撑过几个小时长任务的Agent,外面都包着一层东西:一张反复回看的任务清单;一条“别因为到了一个阶段就停下来汇报”的规则;一个不见证据就不认“完成”的检查器。我们把这层东西叫Harness。任务越难,它往往比里面的模型还重要。11这里的Harness指模型调用之外的一切:循环、工具、Prompt,以及Agent读写的文件。

我一直在想一个问题:Harness里有多少东西,其实是模型自己可以掌握的知识?

01#三类脚手架

回头看过去一年写过的Harness,里面的部件大致分三类,像洋葱一样一层层包在模型外面。

图 1· harness-layers.svg680 × 330
模型 记忆 纪律 判断 记忆纪律判断模型 任务清单、草稿文件、摘要何时停、何时验证、何时问人工具路由、判断够不够好权重里已经有的知识
图 1Harness是包在模型外面的几层。外层弥补上下文窗口的限制,内层编码习惯和品味。
  1. 记忆:清单、草稿文件、上下文重置后还能留下的摘要。它们弥补的是有限的上下文窗口。
  2. 纪律:什么时候停、什么时候验证、什么时候问人。它们纠正的是模型在别处学来的习惯。
  3. 判断:把子任务交给合适的工具,判断一个结果够不够好。它们编码的是品味。

一条Harness规则,就是把一次纠正写下来,然后每次调用都付一遍代价。

记忆更像基础设施,大概会一直留在权重外面。纪律是最有意思的中间地带。判断最难。

02#一条规则值多少钱

换个角度看为什么要内化:Prompt里的每条规则,每次调用都要花token;模型花在读规则上的注意力,就没花在任务上。如果一个Harness有kk条规则、平均长度ℓ\ell,一次任务调用TT次,额外开销大约是

Charness=T⋅∑i=1kℓi  ≈  TkℓˉC_{\text{harness}} = T \cdot \sum_{i=1}^{k} \ell_i \;\approx\; T k \bar{\ell}(1)

长任务里TT动辄几百,这笔账很快就大了。模型已经内化的规则,推理时一分钱不花。

03#去掉规则会怎样

我想做的实验:从一个能用的Harness出发,每次删一条规则,测长任务还能做对多少;先测基础模型,再测用完整Harness轨迹训练过的模型。

图 2· line.chartline · 2 组

逐条删除 Harness 规则后的任务成功率(示意)

长任务成功率,横轴为删掉的规则数

  • 基础模型
  • 用 Harness 轨迹训练
0%25%50%75%100%0123456用 Harness 轨迹训练55%基础模型29%
基础模型用 Harness 轨迹训练
078%80%
171%79%
263%76%
352%73%
444%69%
535%62%
629%55%
图 2编造的数字,只用来展示图表组件。鼠标悬停或用方向键查看数值,点“数据”看表格。

如果训练后的曲线保持平稳、基础模型的曲线往下掉,平稳那一段对应的规则就已经搬进了权重。

04#一个小例子

我用得最多的一条纪律规则长这样:

snippet.pypython
def should_continue(turn, tasks, attempts):    # 只有文字、没有工具调用的结束,是汇报,不是完成的证据。    if turn.stop_reason == "end_turn" and tasks.open():        return attempts < 3    return False

它管用。但它也说明,模型自己会在没做完的时候以为做完了。如果模型把这条规则内化了,这段代码就成了死代码。

05#哪些规则先搬进去

图 3· bar.chartbar · 2 组

删掉该规则后变差的运行占比(示意)

去掉规则后变差的运行

  • 基础模型
  • 训练后
0%20%40%60%80%任务清单停止规则验证规则工具路由
基础模型训练后
任务清单64%61%
停止规则48%12%
验证规则41%15%
工具路由22%18%
图 3同样是编造的。我预期的形状:记忆留在外面,纪律搬进权重。
脚手架放在哪里能搬进权重吗
任务清单文件不太可能
停 / 继续的规则Prompt + 循环有可能
验证习惯Prompt有可能
工具路由代码部分可以

这是一篇占位文章,用来预览博客版式,之后会换成正式内容。