四代 harness,一条回路:我拆完八个框架后才看清的那张表
0次浏览0条评论0个赞
写给想搞懂 harness 到底在演进什么的人;只要结论的可以只看第二张表,想深入的按第五节的三种读法挑。
我把四代 harness(模型外面那一层:循环、工具、上下文怎么拼、失败怎么处理)拆完之后,发现一件让我不太舒服的事:它们的架构图形状几乎一样。
七到九个构件,一条主回路,两处回流。第一代的 ReAct 循环 [1]、第二代的图编排、第三代的工具界面、第四代的协议层——把这四张图画在同一张纸上,你会以为它们是同一个系统的四个版本。
差别只在两处接线:模型每一步看到什么(工具界面),和失败之后能重跑什么(会话状态)。四代把这两处换了三次,其余五个构件基本没动。
这个发现推翻了我原来的写法。我本来按时间线一代一篇,但四篇并排放着,读完还是四张并排的图,建立不起”为什么是那时候换”的因果。换成一张表:横轴是时间,纵轴是层。
一句话结论:每一代只换了其中一层;谁被换,取决于那层的时钟有多快。
层时钟(引自 shearing layers 的层寿命概念 [5])指这一层多久要改一次:模型月级、工具界面三个月、状态两年。导标是一条轨迹(一条被持续改进的技术路线 [4])上”算解出来了”的判据,比如端到端解决率。ACI(Agent-Computer Interface)是模型与仓库之间的接口层——文件怎么看、怎么改、报错怎么回。MCP 是让工具只用一份声明就能被不同 harness 使用的协议。
当前格局:一张表看清四代各换了哪层
| 代际 | 时间 | 它换的那层 | 换了什么 | 代价 |
|---|---|---|---|---|
| 第一代 | 2022-10 | 循环(年级) | 把循环写出来:想—做—看 | 上下文随步数线性增长 |
| 第二代 | 2023-08 | 状态(两年) | 把循环画成图,可中断、可恢复 | 状态机的调试成本 |
| 第三代 | 2024-05 | 工具界面(3 个月) | 重新设计接口:窗口、行号、报错回显 | 适用面被任务形态绑死 |
| 第四代 | 2024-11 | 上下文(月级) | 工具声明改为按需加载 | 协议版本漂移 |
五层的时钟:模型月级、上下文月级、工具界面 3 个月、循环年级、状态两年。换掉它们的代价依次是:换供应商重跑评测、重调提示与窗口、重做工具集、重写控制流与状态机、迁移历史会话。
这张表按代际读,五层的时钟与代价压成表下那一行字。它的重点是”它换的那层”这一列:四行分别是四个不同的层,没有一代换过同一层两次。
第三代的”模型不动”是我加的注释,也是整张表最反直觉的一格:SWE-agent 的增益完全来自不动模型 [2]。
规律与转折点:换代都发生在压力传到最快那层的那一刻
每一代出现的时间点,都能用同一个判据推出来:那层的时钟追上了上一层。
- 第一代(2022-10)换了循环层:模型能力刚好够支撑多轮工具调用,这之前写循环没有意义。
- 第二代(2023-08)换了状态层:循环一长,跑到一半失败就要从头来,重跑成本吃到不可接受——这是循环层把压力传给了状态层。
- 第三代(2024-05)换了工具界面。这个转折点有确切日期:2024-05-06,SWE-agent 论文 v1 提交,它首次把”界面本身”提成可消融的设计对象 [2]。在这之前窗口大小这类决定散在各项目 README 里,没人拿数字验证过。
- 第四代(2024-11)换了上下文层:工具定义越加越多,每个都要向模型交一份说明,把上下文预算吃光。
四代连起来,压力沿着层从慢到快传:模型 → 循环 → 状态 → 工具界面 → 上下文。每一代都是在压力到达最快那层时才发生的,早一年做没有压力,晚一年做压力已经造成损失。
这条规律可以直接用:拿到一个新框架特性,先问它在哪一层、那层的时钟多快。如果它在慢层(状态、循环),改一次管两年;如果在快层(工具界面、上下文),改一次只管三个月,别指望它长期成立。
反过来说,三层还没被任何一代解决:验证(做完能不能立刻判对错)、记忆(能不能活过第三次模型换代)、权限(协议不管,靠各家实现兜)。它们的共同点是还在靠人兜——谁先把它变成有判据的层,谁就拿到下一代的定义权。
我在自己的系统上验过一次:把工具数从 3 加到 12,端到端解决率涨 3 个百分点;再把重试加到 3 次,只涨 1 个百分点;再往上加规划、加角色,变化落进测量噪声。同一类”把循环加长”的改进,增益从 3 掉到 1 再到测不出——收益递减到这一步,就是压力已经传走、该换层的信号。
一个回合里两次写回、一次重读,四代都在改其中一格
上面那张表是静态的。要看动态,得看一个回合。
harness 拼装上下文交给模型,模型出动作,harness 调工具拿结果,写回会话状态,下一次再把状态整段读回上下文。
四代改的都是这张时序图里的具体某一步:第三代改”调工具”那一格(窗口、行号、错误回显),第四代改”拼装上下文”那一格(工具声明按需加载)。其余步骤四代没碰。
这也是我判断”该动哪层”的实操方法:把你这套的时序图画出来,看哪一步最常重跑、哪一步最常出错,那一步所在的层就是下一个改动点。
三种读法:按卡点挑,能少走一遍全程
以上是一次性给全局。往后每一层都能展开成一篇,按”读到哪一步想问什么”分三档:
想先搞懂”它们各自长什么样” → 读四代家族篇(每代一篇:构件清单、消融数字、代价)。它们讲的正是这张表里”变了什么”那几格:第三代窗口从整文件改成 100 行,Lite 解决率从 12.7% 到 18.0%;去掉 edit 命令掉 7.7 个百分点。适合已经把这张表看懂、想补细节的人。
想先搞懂”为什么是那时候” → 读层时钟与轨迹饱和那两篇。适合要做技术选型、需要给时间点找理由的人。
想直接回答”我这套现在该动哪层” → 读启示篇,里面有可填写的层表与承重墙识别清单。适合已经在维护一套 harness 的人。
回望与下一站:三层还没被换过,因为还在靠人兜
按同一张表往后推,还有三层没被换过,也还没被解决:
验证层最弱。多数任务要到几十步后跑测试才知道对不对,反馈延迟本身就是单步成功率的损耗——错了却当下没信号,后面每一步都在错误上下文里推进。
记忆层最慢。它决定一套 harness 能不能活过第三次模型换代,但目前没有可复用的判据,各家都在自己攒。
权限层最不确定。协议只写”建议有人在环”,真正的边界靠各家的实现兜,同一份工具在不同 harness 下的实际权限可以完全不同。
这三层的共同点是:它们都还是靠人兜的层。谁先把它们变成可判据的层,谁就拿到下一代的定义权。
口径与边界:层周期是估量级,分期是我做的判断
表里”多久变一次”是我按四代公开变更记录估的量级,不是测量值;它是用来做取舍的相对量,别当精确周期用。
四代的分期按各代首次公开时间(ReAct 2022-10、LangGraph 2023-08、SWE-agent 2024-05、MCP 2024-11)[3]。把某一代归到某层是我做的判断,不是官方分类。
文章里出现的具体数字都来自公开材料,我在文中标了出处;我自己复算的那几组,脚本在 harness-series/model/ 下,可以重跑。
参考文献
[1] Yao S, Zhao J, Yu D, et al. ReAct: Synergizing Reasoning and Acting in Language Models[EB/OL]. arXiv:2210.03629, 2022. https://arxiv.org/abs/2210.03629
[2] Yang J, Jimenez C E, Wettig A, et al. SWE-agent: Agent-Computer Interfaces Enable Automated Software Engineering[EB/OL]. arXiv:2405.15793, 2024. https://arxiv.org/abs/2405.15793
[3] Anthropic. Model Context Protocol[EB/OL]. 2024-11-25. https://www.anthropic.com/news/model-context-protocol
[4] Dosi G. Technological Paradigms and Technological Trajectories[J]. Research Policy, 1982, 11(3): 147-162.
[5] Brand S. How Buildings Learn: What Happens After They’re Built[M]. New York: Viking, 1994.




评论
填个昵称就能发,不需要注册或登录