CodeSkill × NanoHarness:技能抽象与 Harness 效应——被低估的智能体性能杠杆
2026 年的编码 agent 领域有个显眼的惯性:谈性能必谈模型。刷榜靠更大的骨干、更强的推理模式、更长的上下文——仿佛 agent 的智能全部住在权重里。本精读的两篇论文从两个正交方向对这股惯性各捅了一刀:
论文一:CodeSkill: Latent Skill Abstraction for Long-Horizon Code Agents (arXiv 2609.33243) 机构:清华大学(一作 Song-Li Wu、Jingyi Wang)+ 华为诺亚方舟实验室 + 上海交通大学。典型的企业+高校合作:清华/上交为学术一方,华为诺亚提供工业场景与资源——通讯作者 Zhaocheng Du 与二作 Weinan Gan 均属诺亚,这解释了论文覆盖芯片设计、GPU 内核、CAD 等工业基准的独特口味。AAAI 2027 投稿格式。
论文二:Beyond the Model: Demystifying Harness Effects in Software Engineering Agents (arXiv 2609.32459) 机构:南京理工大学(第一单位)+ 慕尼黑工业大学 + 南京大学。纯高校合作,无企业参与。总实验 token 消耗超过 30B(Qwen 侧 10B+、DeepSeek 侧 20B+),估计成本超 7000 美元——这个量级在纯学术团队中相当罕见。
两篇的互补张力一目了然:CodeSkill 向模型内部要性能——把「技能」作为隐变量分层抽象,让 RL 在语义空间而非 token 空间优化;NanoHarness 向模型外部要性能——把「harness」拆成可独立开关的组件,量化每个组件的真实贡献。 但它们共享同一个底层判断:模型权重不是性能的全部来源,技能结构与基础设施是被系统低估的杠杆。
一、背景:从「是什么」讲起
技能。一个编码 agent 的典型轨迹长这样:读仓库结构→定位相关文件→理解依赖关系→写补丁→跑测试→看 traceback→改→再跑……几十上百步交互里,真正可复用的不是每一步的具体 token,而是「依赖追踪」「迭代补丁」这类多步行为模式。Skill 就像岗位操作手册:新员工(新任务)不需要重新发明「如何调试」,直接调用手册里的流程。这个概念来自机器人学习(options 框架、技能发现)与 LLM agent(Voyager 的技能库),核心主张都是——把可复用的多步模式封装为决策单元,探索就在更高层面进行。
分层强化学习(HRL)。传统 RL 每个时间步选一个动作(flat policy),长程任务里奖励稀疏且延迟——补丁是否正确要等全部测试跑完才知道,中间几百个 token 动作的功劳该记给谁(credit assignment)?HRL 的答案是分层:高层策略选「子目标/技能」,低层执行,每个技能覆盖多步——有效时间跨度变短,信用分配与探索都变容易。这个思路 1999 年就由 Sutton 等人的 options 框架奠定,但应用到代码 agent 有个特殊障碍:代码语义是离散的(文本、traceback、测试结果),而 RL 优化喜欢连续空间——CodeSkill 整套设计本质上就是在造这座桥。
VAE(变分自编码器)。一类生成模型:编码器把输入压成连续隐变量分布(均值+方差),解码器从隐变量重建输入,训练目标(ELBO)附带 KL 正则使隐空间规整。关键性质:语义相似的输入会被映射到隐空间的相邻区域——这正是 CodeSkill 看中的一点:技能「迭代修复编译错误」和「迭代修复类型错误」在文本上不同,但隐空间里是邻居,RL 探索在一个邻居处发现有效改进,扰动到另一个邻居也大概率有效。
Harness。模型外的一切基础设施:工具怎么注册、上下文怎么管理、规划怎么做、子代理怎么分工、技能怎么加载。你用的 Claude Code、OpenCode、Cursor 本质上是「模型 + harness」的打包产品。mini-SWE-agent 是这个维度的极简端——约百行代码的 agent 循环,只有 Bash 交互;OpenCode/Claude Code 是产品级的复杂端。同一模型在不同 harness 下表现可以差多少? SWE-bench Verified 榜单给出的答案是 19.4pp——这个数字与「换一个更强的模型」的 22.8pp 几乎同量级。也就是说,你精心挑选模型纠结的那几个点,可能还不如换一个 harness 来得多。
为什么要研究这两件事。因为它们同时被「模型中心叙事」遮蔽了:技能抽象方向,现有工作把技能当离散文本单元(Voyager 的技能库、Agent Skill 文件),无法与 RL 联合优化;harness 方向,每个新 agent 系统都做了大量 harness 层决策,但这些决策「作为完整系统被端到端评估」,从未被拆开单独测量——你不知道 OpenCode 比 mini-SWE-agent 强的 8.8pp 里,哪些组件在贡献、哪些其实在拖后腿。
二、论文定位和关联工作
CodeSkill:技能建模谱系的「从离散到连续」
| 相关工作 | 做法 | 与 CodeSkill 的差异 |
|---|---|---|
| token 级 RL(PPO/GRPO) | 直接在 token/动作序列上做 RL | 扁平轨迹建模,稀疏奖励下信用分配错误累积;CodeSkill 把 RL 提升到技能级 |
| Voyager 技能库 | 可执行代码作为技能,向量库检索复用 | 技能是离散符号单元,边界启发式、不可微,无法与 RL 联合优化 |
| 传统 HRL(options/FeUral 等) | 从各向同性高斯先验学习隐技能,静态分段 | 先验无语义锚定、边界与运行时事件脱节——直接用于代码任务会切断完整子任务 |
| SWE-MILE 等过程奖励 | 势函数塑形做步级信用分配 | 仍在 token/动作级分配功劳,不改决策单元粒度 |
| agentic mid-training | 大规模 SWE 轨迹自回归训练 | 承认轨迹含丰富行为监督,但仍 token 级建模,可复用模式纠缠在噪声里 |
一句话定位:CodeSkill = 离散文本技能的可解释性 + 连续隐空间的可优化性,用执行反馈决定两者何时切换。 它对自身的定位也讲得很清楚——与传统 HRL 的区别在于「锚定语义的高斯先验」与「执行反馈门控的动态边界」这两处代码特有的改造。
NanoHarness:harness 研究的「从整体到组件」
| 相关工作 | 做法 | 与 NanoHarness 的差异 |
|---|---|---|
| SWE-agent(ACI 论文) | 提出 agent-computer 接口概念,展示接口设计影响性能 | 只研究接口层;NanoHarness 覆盖工具/上下文/规划/子代理/技能五组件 |
| OpenCode / Claude Code | 产品级 harness,多组件集成 | 端到端评估,无法归因哪个组件贡献多少;NanoHarness 组件独立可控 |
| mini-SWE-agent | 极简基线 harness | NanoHarness 以它为起点增量添加组件,是「测量装置」而非新 agent |
| HarnessTax 等 2026 同期研究 | 多 harness × 多模型对比 | 发现「harness 影响成本大于成功率」的异见结论(详见第六部分) |
| AHE / DGM 等自进化 harness | 让 agent 自动改自己的 harness | 前置依赖「知道哪些组件值得改」——NanoHarness 恰好提供这张地图 |
一句话定位:NanoHarness 是第一个把 harness 设计作为一等研究对象做组件级受控分解的实证工作——不是造更强的 agent,而是造一把测量 agent 的尺子。
两篇的合流点
| 维度 | 模型中心路线 | 本两篇的路线 |
|---|---|---|
| 性能来源 | 权重、规模、推理模式 | 技能结构(内)+ 基础设施(外) |
| 优化对象 | token 生成概率 | 隐技能空间(CodeSkill)/ 组件组合(NanoHarness) |
| 可复用单元 | 无(每个任务从头探索) | 隐技能库 / 五个可插拔组件 |
| 改进成本 | 重新训练(贵) | VAE 微调 LoRA(轻)/ 加一个模块(更轻) |
三、问题定义
两篇论文各自把一个模糊的工程直觉提炼成了干净的抽象问题。
CodeSkill:把「学技能」变成「学隐变量的分布」
具体问题:长程编码 agent 的 RL 为什么难?token 级轨迹又长又噪,稀疏奖励下信用分配错误累积,可复用行为模式(依赖追踪、迭代补丁)纠缠在低层动作序列里无法复用。
抽象问题:给定轨迹数据集 D(含成功与失败轨迹),学一个隐条件策略 πθ(a|s, z),其中 z 是从轨迹蒸馏出的技能的连续隐表示——它同时是生成模型与 RL actor,既最大化执行奖励又泛化到未见任务。
形式化拆解为三层对应:文本技能 s → 语义高斯先验 N(μsem, σsem) → 连续隐变量 z → 软提示前缀 → 冻结 LLM 的动作。妙处在于:「技能好不好」从不可优化的离散判断,变成了连续空间里「z 的邻域里哪个方向更好」——这是 RL 能吃的格式。反事实技能(失败轨迹蒸馏出的「本应怎么做」)进一步把负样本也变成可优化的信号源。
NanoHarness:把「harness 有用」变成「组件级可分解测量」
具体问题:产品级 harness 比极简 harness 强很多,但你不知道强在哪——是工具注册?规划?子代理?还是玄学?
抽象问题:把 harness 分解为组件集合 C = {工具注册表, 上下文压缩, 显式规划, 子代理, 惰性技能},在每个组件独立可控的平台上测量:单组件效应、全组合效应、行为级效应(工具调用数/token/探测分布)。三个研究问题——RQ1 模型×harness×任务如何联合作用;RQ2 各组件贡献几何;RQ3 组件如何改变执行行为与失败模式。
这个抽象的精妙处在于受控变量设计:固定模型(温度 0)、固定任务集(全量 ProgramBench 200 实例)、固定预算(300 步/任务),只有组件在变——任何分数差异都可归因到组件。60 配置(3 基准 × 2 harness × 10 模型)的联合矩阵加上组件级消融,构成完整的测量体系。
四、问题解法
CodeSkill:两阶段——先蒸馏技能,再在隐空间进化
阶段一:Skill Discovery(技能发现)。部署基础 agent πbase 采集轨迹,成功与失败轨迹都保留。用同骨干 teacher 模型(零样本结构化 prompting——刻意避免「更强 oracle 蒸馏」的知识混淆)把每条轨迹蒸馏为三级文本抽象:
- 高层 sH:全局问题解决策略(如「诊断→定位→修复→验证」)
- 中层 sM:时间上扩展的子任务序列(如「追踪该函数的依赖」「迭代修复该补丁」)
- 底层 sL:局部执行行为(token 级控制细节)
失败轨迹产出反事实技能:错误决策 + 执行证据 + 正确的替代方案。
阶段二:Skill Weaver(技能编织)——分层 VAE 的核心机器。这部分是全文技术密度最高处,拆开看:
- 语义先验:冻结 LLM 的文本嵌入层编码技能 s,两层 MLP 投影为高斯分布参数——语义相似的技能自动占据隐空间相邻区域(这是「连续空间允许语义邻域探索」的机制保证)。
- 执行反馈门控边界:中层技能引入二值边界变量 b_t——b_t=1 时从语义先验重采样新 zM,b_t=0 时 zM 保持不变(δ 函数)。b_t 由离散状态变化强烈偏置(新编译器 traceback = 技能切换信号)。训练时用 Gumbel-Softmax 松弛让梯度穿过离散的 b_t。这保证技能切换与程序运行时事件对齐——不是按固定步数机械分段。
- 变分推断:双向序列编码器产出近似后验 qφ,与先验做 KL 正则(分层加权:βH/βM/βL)。
- 注入与优化:隐技能变换为连续软提示 P_t 前置到交互历史;基座 LLM 全程冻结,只训 LoRA(注意力层)。PPO 的 GAE 优势驱动隐空间优化,失败轨迹的反事实技能驱动负优势显式惩罚退化行为。总损失 L = L_ELBO + λL_RL。
类比:如果说 token 级 RL 是「逐帧微调电影每个像素」,CodeSkill 是「先写分镜脚本(技能层级),在脚本空间里改戏(隐空间 RL),执行时按剧本拍(软提示条件化)」——而 b_t 是「剧本允许临场改戏的触发器」。
NanoHarness:五组件模块化增量——测量装置的设计美学
在 mini-SWE-agent(只有 Bash 交互的极简循环)之上逐一实现可独立开关的五个组件:
| 组件 | 实现 | 作用 |
|---|---|---|
| 工具注册表 | 把 Bash 交互模式扩展为统一注册的原生工具调用:read_file / write_file / edit_file / glob | 结构化文件系统操作,替代无序 shell 探索 |
| 上下文压缩 | 超长工具输出落盘只留路径+预览;历史过长时消息裁剪+观察压缩;仍超限则 LLM 摘要 | 有限窗口下的长程执行支持 |
| 显式规划 | TodoWrite 式轻量规划:todo_write 维护至多 10 项的任务列表,TodoManager 校验格式/状态/一致性 | 显式跟踪中间目标 |
| 子代理(两种) | 通用 SE 子代理(按生命周期分工:需求分析/架构设计/代码生成/测试/修复)vs 任务特定子代理(行为分析/差分测试/提交审查) | 委托与分解 |
| 惰性技能 | prompt 只含紧凑技能目录,按需 load_skill(name) 加载详细指引(6 个 SKILL.md:终端工作流/最小实现/构建诊断/测试分诊/CLI 模糊测试/提交审查) | 降低提示开销的程序性知识 |
设计上的克制值得注意:子代理不嵌套委托、共享工作区、工具白名单、返回结构化报告;规划器会在计划过期时注入提醒。每个组件都是「最小可识别实现」而非产品级全家桶——这保证了测出来的效应是「该机制的效应」,而非「某产品工程质量的效应」。这也正是 NanoHarness 这个名字的含义:纳米级可分解的 harness。
五、评估证据
CodeSkill:通用 + 工业双线基准,消融四类齐全
主骨干 Qwen2.5-Coder-32B-Instruct。通用基准(Table 1,与开源权重的对比):
| 基准 | CodeSkill | 最强开源基线 | 说明 |
|---|---|---|---|
| EvalPlus | 99.2 | Kimi-K2-Thinking 98.2 | 开源第一 |
| BigCodeBench-Full | 94.8 | Kimi-K2-Thinking 92.7 | 开源第一 |
| FullStackBench | 98.3 | Kimi-K2-Thinking 97.4 | 开源第一 |
| SWE-bench Verified | 76.2 | — | 32B 骨干的 agent 任务成绩 |
| Terminal-Bench v1.0 | 42.6 | — | 终端任务 |
工业基准(芯片/GPU/CAD,多为诺亚口味):VeriScope 89.6、RealBench Module Syn@1 66.2(开源最优)、CAD-Coder 87.0、SuperCoder 93.4、KernelBench L1 25.2——32B 模型在多个工业基准上超过 1T 参数的 Kimi-K2 系与闭源 API,这是「技能抽象补偿规模」主张最有力的证据。
方法对比(Table 4,SWE-bench Verified,pass@1 三次均值):Qwen3-Coder-30B 上 CodeSkill 58.7 vs GRPO 49.5(+9.2pt)vs PPO 48.1 vs SFT 43.8 vs 原始 37.7;GLM-4.5-Air 上 62.8 vs GRPO 54.2(+8.6pt)——跨骨干一致增益。
消融(Table 5,四类,与参数量/提示长度严格匹配的公平对比):
| 消融项 | EvalPlus | BigCodeBench-Full | 说明 |
|---|---|---|---|
| CodeSkill 完整 | 99.2 | 94.8 | — |
| 去整个层级 | 95.8 | 88.7 | 最大退化来源 |
| 去 zM(中层) | 95.9 | 88.9 | 层级内部影响最大 |
| 固定分段(去边界门控) | 96.5 | 90.1 | 执行反馈对齐是必要的 |
| token 级 RL(去技能) | 96.1 | 89.2 | — |
| 文本技能+RL(去 VAE) | 95.6 | 88.4 | 连续隐空间必要性的直接证据 |
| 文本技能 SFT(去 RL 和 VAE) | 94.5 | 86.2 | — |
| 仅失败轨迹训练 | 93.1 | 84.8 | failure-only 训练崩坏,混合最优 |
轨迹效率:平均交互步数 12.3→6.8(−45%),15 步内成功率 62%→94%——技能库有效剪枝了搜索空间。
NanoHarness:60 配置矩阵 + 组件级增量实验
RQ1 联合效应(3 基准 × 2 harness × 10 模型):SWE-bench Verified 榜单上,固定模型下 harness 差距 19.4pp,模型差距 22.8pp;OpenHands 对弱模型增益 +13.6pp,随模型变强收敛至 +5.47pp;自家受控实验中,Qwen 家族 OpenCode 增益从 6.0pp 平滑收窄到 2.67pp,DeepSeek 家族呈非单调(V4-Pro 上 34.3 vs 33.7 几乎收敛)——弱模型未必能驾驭复杂 harness,强模型可能不再需要。但任务类型反转了这个结论:在更开放的 ProgramBench/GitTaskBench 上,只有最强模型才能持续利用复杂 harness。
RQ2 组件级效应(全量 ProgramBench 200 实例,两个强模型):
| 配置 | Qwen3.7-Max | DeepSeek-V4-Pro |
|---|---|---|
| mini-SWE-agent | 42.88 | 45.14 |
| +工具注册表 | +4.57pp | +3.54pp |
| +显式规划 | +1.36pp | +0.77pp |
| +惰性技能 | +0.81pp | +3.07pp |
| +上下文压缩 | −4.86pp | −3.85pp |
| +任务特定子代理 | +5.91pp | +4.46pp |
| +通用子代理 | −0.70pp | −2.31pp |
| 全部组合 | 50.25(+7.37pp) | 51.35(+6.21pp) |
| 对照:OpenCode | 51.68 | 52.48 |
| 对照:Claude Code | 52.33 | 52.76 |
三个要点:任务特定子代理是最大单组件赢家;上下文压缩稳定为负(两个模型都掉);全部组合 > 任何单组件但不是单组件之和——组件间有交互。轻量 NanoHarness 与产品级 harness 只差 1.43/1.13pp——大部分产品级增益可以被少数精选组件复现。
RQ3 行为证据:+全部配置后工具调用 +131%(Qwen)但 prompt token 只 +16.37%——增益来自「更结构化的交互」而非更多预算。jqlang 案例:mini-SWE 发了 133 次参考二进制探测、通过 1602/6491 测试(24.68%);NanoHarness 降到 43 次探测、通过 4425/6491(68.17%)。反向案例 lfos/calcurse:mini-SWE 只探 3 次就实现(61.74%),NanoHarness 扩展到 45 次探测(75.18%)——harness 不是简单增减探索量,而是规范化探索:卡住时止损、过早自信时补课。
合并速览
| 论文 | 核心指标 | 关键数值 | 证明的主张 |
|---|---|---|---|
| CodeSkill | SWE-bench Verified | 76.2;vs GRPO +9.2pt | 技能级 RL > token 级 RL |
| CodeSkill | 交互步数 | 12.3→6.8(−45%) | 技能库剪枝搜索空间 |
| CodeSkill | 去 VAE 消融 | BigCodeBench 94.8→88.4 | 连续隐空间是必要的 |
| NanoHarness | harness vs 模型差距 | 19.4pp vs 22.8pp | harness 与模型同量级 |
| NanoHarness | 组件增量 | +子代理 +5.91 / +工具 +4.57 / 压缩 −4.86 | 组件效应异质且有正有负 |
| NanoHarness | 行为案例 | 133 次探测→43 次(24.68%→68.17%) | harness 规范化探索行为 |
六、效果优势的根源解释
根源机制一:为什么连续隐空间允许语义邻域高效探索(CodeSkill)
因果链:文本技能经语义高斯先验映射 → 相似技能占据隐空间相邻区域(论文实验支持:去 VAE 掉 6.4pp)→ RL 在连续空间的一个点发现有效改进时,邻域扰动大概率仍落在「同类技能的变体」上 → 探索呈局部连贯的语义漂移而非 token 空间的随机跳跃 → 样本效率提升(Fig.1b:更快收敛、更低探索熵)。
baseline 的根本局限:离散文本技能 + RL 的组合(消融里 88.4 那档)卡在哪?文本技能之间的「距离」没有定义——从「迭代修复编译错误」改到「迭代修复编译错误的变体」需要重新生成整段文本,RL 的连续梯度信号无处安放。这不是「没做 X」而是「离散表征的结构导致了优化信号不可传递的不可逾越障碍」。token 级 RL(89.2)的困境类似但更底层:可复用模式纠缠在噪声序列里,每次任务都从头发现。
外部交叉验证(检索 2026-09-30):
| 研究 | 尝试 | 相关结论 | 与本文差异 | 对根源解释的影响 |
|---|---|---|---|---|
| Emergent temporal abstractions(Meulemans et al., arXiv 2512.20605) | 在自回归模型内部表征上发现时间抽象动作并做「internal RL」 | 在抽象动作空间而非 token 级做 RL,稀疏奖励下标准 GRPO 失败而它成功 | 作用于残差流激活而非文本技能 | 方法相似+结论相近:强支持「时间抽象优于 token 级探索」 |
| HiPER(arXiv 2602.16165) | Plan-Execute 分层 + 分层优势估计(HAE) | 显式时间抽象 + 匹配的信用分配在 ALFWorld/WebShop 大幅超越 flat RL | 分段是文本子目标边界,隐空间不介入 | 方法不同+结论相近:支持「抽象层级要与信用分配粒度对齐」,补充但不依赖 VAE 路线 |
| HRL 综述(Klissarov et al. 2025 及领域共识) | HRL 长期研究谱系 | 「gains 在长程、稀疏奖励、迁移重的场景最明显;短程基准常打平」 | — | 限定条件:解释了为什么 CodeSkill 增益集中在长程 agent 任务而非单轮生成 |
| Voyager(arXiv 2305.16291) | 可执行代码技能库 | 技能复用显著提升开放任务学习 | 离散技能、无 RL 联合优化 | 方法相似+结论部分相近:支持「技能复用」本身,同时其离散性反衬 CodeSkill 连续化的增量 |
根源机制二:为什么结构化工具把无序探索变针对性调用(NanoHarness)
因果链:Bash 交互模式下「读文件」是一段自由文本命令,输出无界、错误难解析 → 工具注册表提供带类型与边界的接口(read_file 有界读取、edit_file 局部修改、glob 模式发现)→ agent 的每一步交互变成可预测、可复用、可组合的操作原语 → 探测行为从「盲试一大片」变为「针对目标的调用」→ jqlang 案例的 133→43 次探测与 24.68%→68.17% 通过率。任务特定子代理(+5.91pp)进一步把「探索目标程序行为」这个子任务委托给带专属工具白名单的专门角色——它使工具调用 +115.76% 的同时 prompt 只 +7.35%,收益来自针对性而非总量。
上下文压缩为何为负:ProgramBench 是从零生成仓库的任务,需要长程保持需求细节、接口约束与调试状态。压缩省了 token(−54%)却切断了长程依赖——「卡住时为什么放弃之前那条路线」这类信息被摘要抹掉,agent 重复走进死胡同。这是信息结构的破坏,不是参数调优问题。
外部交叉验证(检索 2026-09-30):
| 研究 | 尝试 | 相关结论 | 与本文差异 | 对根源解释的影响 |
|---|---|---|---|---|
| Beyond Token Savings(arXiv 2609.32961) | 3.5 万次运行系统研究上下文压缩 | 少 token 未必更省/更好;压缩改变后续可用信息,同策略跨模型表现迥异 | 系统变化压缩策略而非组件开关 | 结论相近:强支持「压缩有信息代价」,补充了「压缩效应依赖模型与任务」 |
| JetBrains「The Complexity Trap」(arXiv 2508.21433) | SWE-bench 上的上下文管理对比 | 观察掩码省 52% 成本还 +2.6% 解决率;LLM 摘要省钱但轨迹长 15% | 保留原文的确定性裁剪 vs 摘要 | 重要限定:压缩并非必然有害——有损摘要有害,无损/确定性裁剪可能有益;NanoHarness 实现的是摘要式压缩 |
| HarnessTax(harnesstax.github.io) | 21 模型×harness 对(Claude Code/Codex CLI/Pi) | 「harness 对成功率影响小、对成本影响大(5 倍);极简 harness 也有竞争力」 | SWE-bench Lite/Terminal-Bench 2 上的成品 harness 对比 | 相反结论:其任务集以 SWE 式 issue 修复为主——恰是 NanoHarness RQ1.2 指出「harness 增益随任务开放度变化」的场景;非否定而是适用边界互补 |
| Claw-SWE-Bench(arXiv 2606.12344) | 适配器协议统一比较异构 harness | 同模型 harness 移动 Pass@1 达 27.4pp,模型效应 29.4pp | 多语言 SWE 式基准 | 结论相近:不同任务上复现「harness 杠杆 ≈ 模型杠杆」 |
| Self-Evolving Agentic Harnesses 综述(含 SWE-agent ACI 等) | harness 进化系统综述 | SWE-agent 的接口设计单独移动 GPT-4 从 11%→18%;坏工具比没工具更糟 | 综述性证据 | 支持:组件级效应(含负效应)在多个独立研究中复现 |
综合判断与未决问题
多项研究共同支持的机制:(1) 时间/技能抽象优于 token 级优化(HRL 谱系 + Meulemans + HiPER + CodeSkill 四路独立证据);(2) harness 与模型效应同量级(NanoHarness + Claw-SWE-Bench + Epoch AI 报告);(3) 有损摘要式压缩有信息代价(NanoHarness + UT Austin + JetBrains)。
仍属推测的部分:连续隐空间的「语义邻域」结构目前主要靠消融间接证明(去 VAE 掉 6.4pp),尚无对隐空间几何的直接可视化分析;CodeSkill 的 zM 最关键(去 zM 影响最大)与「中层=时间扩展子任务」的对应是合理解释但非唯一解释。
适用条件与失效条件:harness 增益依赖「模型有能力利用组件 × 任务足够开放」的交集——SWE 式短程任务上强模型 harness 增益趋零(HarnessTax 的异见由此而来),此时 NanoHarness 的结论不适用;CodeSkill 的技能抽象在短程单轮生成任务上优势有限(HRL 综述的限定)。两者都依赖较强的基座——32B 以下骨干 CodeSkill 未测,弱模型上组件利用能力存疑(RQ1.1 的 DeepSeek-R1 证据)。
七、必要知识反推
假设一个完全没有背景的人要做这两件事,最少必须知道什么?
领域知识层。必须理解长程编码 agent 的交互形态(仓库状态、执行反馈、traceback 结构)——不知道「新 traceback 通常意味着一个子任务的结束」就无法设计执行反馈门控边界;必须理解 SWE 任务的多样性谱系(issue 修复 vs 从零生成仓库 vs 灵活仓库任务)——不知道这个区分就会把 HarnessTax 的矛盾结论当成错误而非适用边界。
方法论知识层。CodeSkill 侧:HRL 的 options 框架与信用分配理论(否则不知道为什么要分层)、VAE 的变分推断与 ELBO(整个 Skill Weaver 的数学基础)、Gumbel-Softmax 松弛(离散边界变量反传的必要技术)、PPO/GAE(隐空间 RL 的优化器)。NanoHarness 侧:受控实验设计与消融方法论(组件独立可控是全部结论可信的前提)、测量归因的逻辑(为什么必须固定模型温度 0、固定任务子集)。还有横跨两者的「评测心理学」:知道 ProductBench 榜单的 harness 混杂问题,才能想到把 harness 本身变成研究对象。
工程知识层。CodeSkill 侧:LoRA/QLoRA 的工程选择(冻结基座防灾难遗忘 + 显存管理)、软提示前缀的注入实现、跨工业基准的评测管线。NanoHarness 侧:mini-SWE-agent 的代码结构(在其上做增量)、Docker 容器隔离与网络关闭(防评测污染)、skill 目录的 SKILL.md 元数据格式(Claude/Agent 社区的事实标准,惰性技能组件直接沿用)。
知识融合的关键节点。第一处化学反应在 CodeSkill:「文本嵌入的空间结构」(NLP 知识)×「RL 需要连续可微空间」(强化学习知识)= 语义高斯先验——两个领域各自的老知识在新问题上的对接点。第二处在 NanoHarness:「产品的组件构成」(工程观察)×「消融实验设计」(科学方法)= harness 作为研究对象——把日常工程常识转化为可测量问题的范式转换。第三处是两篇共享的:把「不可比的复杂系统」约化为「可控变量的函数」——一个是把行为抽象为隐变量,一个是把 harness 分解为组件开关。
八、论文中可以提取的通用性灵感
性能的杠杆分布在权重之外。核心思想:系统的表观性能 = 模型能力 × 表征结构 × 基础设施,三者乘积而非模型单项。论文证据:harness 19.4pp vs 模型 22.8pp(NanoHarness);32B 模型 + 技能抽象在工业基准超 1T 模型(CodeSkill)。推广场景:任何「换个更强引擎 vs 改进传动系统」的决策——推理引擎的算子调度 vs 换更大模型、数据库的查询计划器 vs 升级硬件、团队的工作流设计 vs 招聘更强的个人。
离散概念要连续化才能被优化算法利用。核心思想:文本/符号/规则这类离散制品,一旦嵌入到保持语义结构的连续空间,就向梯度类优化打开了大门。论文证据:文本技能+RL 88.4 vs 隐技能+RL 94.8(BigCodeBench),参数量与提示长度严格匹配下 6.4pp 的差距全部来自「连续化」这一步。推广场景:prompt 优化的连续松弛、离散架构搜索的可微化、产品策略 A/B 测试到贝叶斯优化的升级、知识图谱推理的向量嵌入。
边界信号应该由领域事件驱动,而非固定节奏。核心思想:任何「分段/切换/交接」的时机,用领域内有信息量的事件(新 traceback、新失败、新证据)触发,优于按固定周期触发。论文证据:固定分段消融 96.5 vs 执行反馈门控 99.2(EvalPlus);交叉验证中 HiPER 的子目标切换边界异曲同工。推广场景:代码 review 的触发时机(提交完成 vs 每小时)、运维告警升级(错误模式变化 vs 固定间隔检查)、会议节奏(议题阻塞时召集 vs 每日站会)、缓存失效(写事件驱动 vs TTL)。
失败的轨迹是负样本金矿,但必须蒸馏成反事实形式并混合使用。核心思想:失败不是垃圾数据,提取「哪里错了+证据+本应怎么做」的三元组,以负优势惩罚退化行为。论文证据:failure-only 训练崩坏(93.1),成功+失败混合最优(99.2)——反事实信号有用但过量会淹没正信号。推广场景:创业复盘的事前验尸(premortem)、安全演练的攻失败例库、销售丢单分析、代码评审中的「为什么这个 patch 被拒绝」知识库。
「规范化」优于「增减」:好的脚手架修正行为的分布形状而非数量。核心思想:介入机制(harness 组件/管理制度)的价值不在于让人/agent 做得更多或更少,而在于削减极端行为(过度探索/探索不足)使分布向中间收敛。论文证据:NanoHarness 对两类失败模式的双向矫正——过度探测 133→43 次、探测不足 3→45 次,得分同升;探测分布整体右移而非简单平移。推广场景:代码评审流程(既防过度设计又防欠考虑)、交易风控(砍掉过度交易也阻止过早止盈)、新人管理(遏制蛮干也防止过早自信)。
测量复杂系统的正确方式是把它变成可独立开关的组件集合。核心思想:当「A 比 B 好」但 A、B 各含数十个决策时,唯一可靠的知识生产方式是受控分解——即使你的最终目的是造产品。论文证据:NanoHarness 五组件分解发现「上下文压缩 −4.86pp」这种端到端对比永远看不见的负贡献组件;轻量组合复现产品级 harness 95% 的增益。推广场景:微服务架构决策的组件化评估、招聘流程的环节拆解 A/B、营养学的膳食成分分解、任何「全家桶 vs 极简」的选型争议。
优化在哪个空间进行,决定了你能看见什么。核心思想:token 空间里「依赖追踪」这个模式不可见(纠缠在千百个 token 里),技能隐空间里它是单个点——可优化、可迁移、可组合。选择表征空间就是选择「什么变得容易发现」。论文证据:CodeSkill 交互步数 −45%、15 步内成功率 62%→94%——同样的任务在更高层表征下搜索空间被剪枝。推广场景:文档以「决策」而非「段落」为单元组织、bug 库按「根因模式」而非「表面症状」索引、财务分析在「驱动因子」空间而非「报表行」空间做预测。
轻量可复现的组合是对抗「全家桶迷信」的最好武器。核心思想:当产品级方案的优势无法归因时,用少数精选组件的组合逼近它,既证明「增益来自这些机制」也获得工程上的可维护性。论文证据:NanoHarness 以 5 个最小实现组件追到 Claude Code 差距 1.13~2.08pp;外部交叉验证中 Stanford Meta-Harness 搜索出的极简 harness 打败手工全家桶。推广场景:自建数据管线 vs 数据平台全家桶、轻量 K8s vs 云全家桶、个人知识管理的卡片盒 vs 全功能笔记软件。
一句话总结:CodeSkill 证明技能可以是隐变量——三级抽象、分层 VAE 与执行反馈门控让 RL 从 token 级探索升维到语义邻域探索,换来 −45% 交互步数与跨工业基准的规模补偿;NanoHarness 证明 harness 是一等性能变量——固定模型下 19.4pp 的组件差距里,工具与任务特定子代理在规范化探索(133 次盲目探测变 43 次针对性调用),而摘要式压缩在破坏长程状态。一个把「会做什么」抽象进隐空间优化,一个把「在什么里做」拆成组件测量——合起来是同一句话:模型权重之外,结构即性能。