一文读懂Harness Engineering李佳
2026年第一季度,大模型应用层最具统治力的热词,绝对是「Harness」。
今年三月,LangChain 发布了一篇题为《The Anatomy of an Agent Harness》的实证文章,彻底点燃了所有人的焦虑与狂热。他们在这份报告里引用了一个实验数据对比。仅仅是给同一个大语言模型换上一套更精巧的 Harness 架构,它在 Terminal Bench 2.0(一个专门衡量 AI 编程能力的权威榜单)上的通过率,直接从 52.8% 拉升到了 66.5%。
在这个实验中,底层模型的权重一个字节都没改,算力引擎完全没动。单靠换上一套精巧的「壳」,排名就从三十名开外狂飙到前五。
自此,无数创业公司开始疯狂包装自己的外壳。Harness 似乎成了点石成金的魔法,成了应用层公司去见投资人时最能拿得出手的「饭桌弹药」与护城河。
但在这种狂热中,概念的边界开始被无限拉扯和模糊。
究竟什么是真正的壳,什么又是壳外?很多外部介绍文章为了追求大而全,把 CLI 工具(命令行工具)的崛起、markdown文件的上浮、甚至是最近大火的外部 Skill 技能包,都统统打包塞进了 Harness 的筐里。在某种意义上这没错,因为它们都是在Agent infra这个大逻辑下,让Agent更好运行的技术选择和创造。
但如果我们要真正理解Harness这条技术演进的暗线,理解它的主轴,就还是要去溯源这个概念的发生史。
另外,时间进入当下。如果你去盯紧 Anthropic 这个最早把 Harness 体系化的团队,会发现就在全行业都在拼命往上砌砖的时候,他们已经在默默地砸墙了。
随着 Opus 新版本的迭代,他们开始毫不犹豫地拆掉了当年费尽心力搭出来的控制组件。
一边在疯狂加盖,一边在果断拆除。这场充满割裂感的行业狂热,本质上是因为绝大多数人并没有真正读透过去十五个月里那些蹚坑的工程论文。
大家只看到了最终跑分翻倍的暴利,却根本没看清那些复杂的机制当年到底是被什么样绝望的 Bug 硬生生逼出来的。
今天,我们就把这个黑盒彻底砸开。顺着这十五个月的血泪文献,看清这套「约束工程」(Harness engeniering)的每一张真实图纸。
Harness第一层:从记事本到管理制度
讲明白Harness其实不难。你就把Agent想象成是一辆车。
模型是引擎,马力大、转速高,给油就响。承载它的交互程序是车轮,方向盘是你的Prompt,你打方向引擎带着你走。但引擎、方向盘和车轮这三件套本身不是车。你不能开着一台引擎上路。你需要变速箱、制动器来让你的方向能顺利调整车轮,需要仪表盘告诉你跑了多远,需要刹车告诉它什么时候该停。这些东西加在一起,任务怎么拆能顺利跑、进度怎么记、完成怎么判,这就是 Harness,就是壳。
壳不是凭空冒出来的。它有一个前史。
大模型天生只有一种记忆,上下文窗口。窗口满了,前面的内容就被挤掉。
这其实对于短任务来说这不成问题。2024 年 12 月,Anthropic 发了一篇工程博客《Building effective agents》,核心建议只有一句话。从最简单的方案开始,只在必要时加复杂度。那时候的 Agent 任务大多是短跑,几分钟内完成,模型的短期记忆容量够用,一段精心编写的指令(System Prompt,即,预先塞给模型的「角色说明书」)就足以驱动它干活。
但所有人都想让 Agent 干更大的活儿。
2025 年上半年,随着模型的推理能力提升,它理论上可以执行的任务开始变长。但这时候上下文方面出了大问题。虽然模型现在上下文都挺长(比如100万token),但实际上其有效注意力范围没那么大,就算有这么大,它也塞不下长程任务的所有细节。人在记事儿的时候会捡重点,模型做不多,它在复杂工作里的记忆几乎就和金鱼一样。
为了解决过去有效上下文实在少的可怜,完成不了任务的问题,最早的路径之一就是记忆外化。AutoGPT 在 2023 年 3 月就给模型发了空白本子—— 一个 write_to_file 和 read_file 的工具调用权限,然后让它自己管理记忆。载体是纯 .txt 文件,没有任何结构约束。模型爱写什么写什么,爱删什么删什么。
但不管理,模型自然会乱写。Devin 在 2024 年 3 月就把本子升级成了结构化面板,引入了结构化的 Planner 面板。模型的任务规划被强制输出到一个可视化的进度条里,每一步有明确的状态标记。
到了2025年2月,Claude Code诞生,它把 Anthropic 内部在 SWE-bench 上积累的所有经验做了产品化。CLAUDE.md(项目级指令文件)+ scratchpad(草稿本)的组合,成了业内最广泛模仿的范式。
但即使有了这样的外部化记忆系统,上下文还是可能不够用。
为此,2025 年 9 月,Anthropic 自己的应用团队发了一篇《Effective context engineering for AI agents》,这一版提针对上下文问题,提出了三个方向上的解决方法。就两个招,靠提效和压缩让长程任务也能在一个上下文层完成。
第一招是提高上下文效率,即改变上下文的写入方式,首先是system Promp,它不应该是「写一段话就完了」,而是要当成代码来维护,要进行版本控制、A/B 测试、按任务类型动态拼装不同的 prompt 模块,这样更高效。然后就是改变工具描述,因为工具读取不清、错误既低效又占上下文。他们发现,模型读工具描述的方式和读 system prompt 完全一样。工具的命名、参数说明、返回值格式,都直接影响 agent 的决策质量。写烂了等于给金鱼一张标注混乱的地图。然后用上外部存储(RAG),即需即取,不是把所有东西一次性塞进去。
第二招是上下文压缩与淘汰,对话太长时做摘要压缩,把前面的对话历史浓缩成一段摘要,释放 token 空间给后续的工具调用结果。为了防止上下文溢出,Anthropic干脆设定了滑动窗口策略,只保留最近 N 轮对话的原文,更早的用摘要替代,同时让 agent 在上下文里维护一个结构化的工作笔记区域,每一步更新,避免信息在长对话中被「冲走」。然后工具返回的调用内容里,没用的也直接删掉,防止它成为上下文里无用的胖子。
这就是Context Engineering,它管的是信息。主要负责的是信息往哪存、怎么取、怎么精选。它们不管流程,金鱼模型拿到记事本之后到底有没有去翻,翻完了有没有按上面写的做,做完了有没有人验收。
这个区别,在当时并没有人明确意识到。因为 Anthropic 自己也掉进同一个坑里了。
2025 年 11 月,他们在《Effective harnesses for long-running agents》中披露了这段经历。在2025年5月,Anthropic 想让 Claude 从零开始写一个完整的 Web 应用。不是改一个 Bug,是搭一整个产品。这种任务跑几个小时,就算是配了外化记忆,上线文窗口也根本装不下全程。每开启一次新的运行,上一轮的记忆就清零。像工程师轮班,但没有交接文档。
一开始他们按照 Context Engineering 的思路搭了第一版工作框架。做法分两步走。先派一个 Agent 负责开局,分析需求、拆出 200 多个功能点、生成一份结构化清单。然后派另一个 Agent 接手写代码,每轮只做一个功能,做完提交一次,更新进度文件,留给下一轮的自己。
记事本发了,外化做了。Context Engineering 的最佳实践也照做了。听起来合理。
但实际跑起来,全面溃败。
他们发现了这里存在四种失败模式。
第一种,提前交卷。Agent 做了三个功能就宣布「项目完成」,它看到已有的代码量,以为活儿干完了。
第二种,环境盲区。Agent 真的在写代码,但环境有 Bug,它写的东西跑不起来,它自己不知道。
第三种,虚标完成。功能清单上标了 done,但实际功能是坏的。Agent 改完代码跑了单元测试,以为没问题,其实端到端根本跑不通。
第四种,失忆实习生综合征。每一轮新的运行(Session)都花大量 Token 重新摸索项目结构,像是一个新来的实习生反复问「代码在哪个文件夹」。
所以他们发现了,Context Engenieering这个记事本解决的只是「存不住」的问题。但金鱼的毛病远不止存不住。它有时候不翻本子,翻了经常压根不按本子上写的去做。除此之外,还缺乏自我验证的能力。
记事本不是问题。没人逼金鱼翻它照做、没人验证金鱼写的是不是真的,才是问题。
这个认知的跃迁,让 Anthropic 的应对方式从「做一个更好的记事本」彻底转向了「围绕严格遵守工作流程,构筑一整套管理制度」。
针对虚标完成和提前交卷,Anthropic意识到不能光靠Markdown格式的外部化,也不能让Agent既当运动员,又当管理员。在项目开始时,由一个专门的「初始化 Agent」生成一份完整的功能清单的,这个用的是JSON 结构(一种机器可读的数据格式)。它被设计成 真正干活儿的「编码 Agent」 只能改一个字段标「通过」或「不通过」的严格死流程。你不能删功能,不能改描述,只能标状态。而切Jason规定,Agent 必须在自己实际测试通过之后才能把状态改成 passing,不能光凭「看起来差不多了」就标完成。
在这种设定下,出题人用的JSON 成了防作弊的物理锁,通过强校验这段数据,死死卡住进度条。而Markdown格式的文件依然存在,但主要用于提供路标,而不是严格流程。(这也是现在Skill遵循差的原因之一)
针对失忆实习生,每个 Session 开头强制执行三步唤醒仪式。跑 pwd(确认当前目录)、读 git log(查看代码改动历史)、读 progress.txt(查看下一个任务)。像工厂换班时,下一班工人先翻交接簿。Agent 的记忆不存在它自己脑子里,存在 Git 历史和进度文件里。不信 Agent 能记住,就更系统性的帮它把记忆存在体外,并且强制它每次上班先打卡、先翻交接簿、先确认工位。
效果立竿见影。Agent 能连续跑几个小时了。每一轮只做一件事,做完提交,状态外化到进度文件里。下一轮进来,读最新的 progress.txt 就知道该干什么。
Anthropic 还加了一层更硬的保险。每一次代码改动都通过 Git 存档。一旦模型陷入死胡同,直接用 git revert 把代码库回滚到上一个能跑的干净状态,然后重新唤醒模型。不指望金鱼自己撤销错误。直接给它一台时间机器。
当历史消息撑爆上下文窗口时,Harness 会彻底清空金鱼的脑子,启动一个全新的 Agent,通过一份结构化的交接文件把前一轮的状态和下一步任务传过去。Anthropic 把这个叫 Context Reset(上下文重置)——不是压缩记忆,是直接换一条新金鱼,只给它一张写好的交接单。这比单纯的摘要压缩(Compaction)更激进,因为 Anthropic 发现,哪怕压缩了历史,模型在超长上下文里仍然会焦虑、丢失连贯性。只有彻底清空,给一张白纸,才能让它重新集中注意力。


