Featured image of post Agent 不是缺 Prompt,而是缺一套 Harness

Agent 不是缺 Prompt,而是缺一套 Harness

Anthropic 的长任务 Agent 实验说明,AI 编程的瓶颈正在从“怎么提示模型”转向“怎么给模型设计反馈、验证和约束系统”。

这两天看 Anthropic 那篇长任务 Agent 的工程文章,我最先想到的不是“Claude 又能连续干几个小时了”,而是另一件事:我们可能太习惯把 AI 编程的问题归结为模型了。

模型不够强,所以换模型。结果不好,所以改 prompt。上下文不够,所以塞更多文件。过去几年,这几招确实有用。但当 Agent 开始被允许连续工作几个小时,问题会变得不一样。

Anthropic 这次反复提到一个词:Harness

直译成“支架”有点生硬,但意思很准确:模型本身只是核心执行器,真正让 Agent 能稳定做事的,是围在它外面的一整套工程支架。工具、权限、沙箱、测试、浏览器、日志、规则文件、评估器、人工确认,这些都算。

换句话说,Prompt 关心“怎么问”,Context 关心“给它看什么”,Harness 关心的是:当 AI 开始替你行动时,它怎么被约束、怎么被验证、怎么被纠偏。

这才是长任务 Agent 最难的地方。

长任务的坏结果,通常不是一上来就坏

短任务里的 AI 错误很好抓。

让它写一个函数,测试红了就是红了;让它解释一段代码,讲错了你很快能看出来;让它改一个小 bug,diff 也不会太大。

长任务麻烦得多。

一个 Agent 连续工作 1 小时、3 小时、6 小时,它不一定会在第一步失败。它可能一开始方向没问题,后来逐渐偏离需求;中途为了补前面的坑,又引入几个新抽象;最后交付时,还能给你一段很完整的总结,说自己已经完成了。

这类失败最烦,因为它看起来不像失败。

Anthropic 在长时间应用开发实验里提到过几种典型现象:上下文会变脏,计划会漂移,模型会提前收尾,自我评价会过于宽松。BestBlogs 今日精选里对 AI Engineer 相关分享的概括更直白:长 session 容易出现 context rot、规划缺陷和输出 sycophancy。

这些词听起来像论文里的术语,放到日常开发里其实很熟悉。

你让 Agent 修一个 bug,它改到一半开始重构半个项目;你让它加一个小功能,它顺手加了你没要求的抽象层;你让它检查是否完成,它认真说“已经完成”,你打开页面发现按钮根本点不动。

这不是“模型完全不会做”。很多时候它确实做了一大半。问题在于,它缺少一个持续把它拉回正轨的系统。

这就是 Harness 的位置。

Agent 不是模型本身

O’Reilly 那篇《Agent Harness Engineering》里有一句话很直接:Agent = Model + Harness

这个说法有点像废话,但我觉得它很有用。因为很多人聊 Agent 时,还是会不自觉地把 Agent 等同于模型。

模型强,Agent 就强。模型弱,Agent 就弱。

现实没这么简单。

一个裸模型不是 Agent。一个聊天框也不是 Agent。真正能做事的 Agent,至少需要一堆模型之外的东西:它能调用哪些工具,不能调用哪些工具;它能不能读日志;能不能跑测试;能不能开浏览器;能不能改数据库;失败之后有没有重试;完成之前有没有验收。

这和软件工程团队很像。

一个优秀程序员当然重要,但团队产出不只看个人能力。有没有测试,有没有 CI,有没有 code review,有没有监控,有没有回滚机制,有没有清晰的需求和验收标准,这些东西都会决定结果。

AI Agent 也是一样。

如果你只给它一句“帮我做完这个功能”,再给它一堆工具权限,然后等它自己判断完成,本质上是在让一个非常自信、又没有责任边界的实习生独自负责需求、设计、开发、测试、验收和上线。

它可能偶尔给你惊喜,但这不该叫生产流程。

Harness 做的事情,就是把流程重新搭起来。

把“写”和“评”拆开

Anthropic 在长时间应用开发实验里用过一个三角色架构:Planner、Generator、Evaluator。

Planner 把用户几句话的需求扩展成规格;Generator 负责实现;Evaluator 打开应用、点击页面、检查状态、找问题,再把反馈交回去。

重点不是“用了三个 Agent”。多 Agent 本身没什么神秘的,做得不好只会更贵、更乱。重点是写代码和验收结果被拆开了。

单 Agent 模式里,一个模型既负责写,又负责判断自己写得好不好。这个安排天然有问题。人类写作者自己校对都会漏错,更何况模型还有一种很强的“任务完成倾向”:它很擅长解释为什么自己已经完成,而不是证明自己其实没完成。

独立 Evaluator 的价值就在这里。

它不继续写代码,只负责挑错。它可以被设定得更严格,可以用 Playwright 打开页面,可以检查 UI、路由、API、数据库状态,也可以按照一套标准打分。

这样一来,流程从“AI 自己说自己完成了”,变成“AI 必须通过另一个评审者的验收”。

Planner、Generator、Evaluator 把规划、实现和验收拆成独立反馈回路

这个变化比表面看起来大。

过去我们优化 AI 编程,第一反应往往是换更强模型、写更长 prompt、塞更多上下文。Harness 的思路刚好相反:先承认模型会漂移、会自信犯错、会提前宣布完成,然后用工程流程把这些失败模式包住。

它不是让模型变聪明一点,而是让模型没那么容易糊弄流程。

真实环境比“看起来没问题”重要

很多 AI 编程失败,不是代码语法错了,而是它只在“想象中的环境”里成立。

按钮看起来在页面上,但点了没反应。API 路由写好了,但鉴权状态不对。数据库字段改了,但迁移没跑。Kubernetes 配置显示成功,但生产环境里的网络策略、权限、存储、监控指标早就漂移了。

The New Stack 那篇关于云原生 Agent Harness 的文章,讲的就是这个问题。分布式系统里的反馈信号非常分散。Terraform 绿色不等于云上系统健康,Prometheus 没报警也不等于服务真的可用,CI 通过更不代表真实环境没有漂移。

人类工程师调试生产系统时,会同时看日志、监控、命令输出、用户反馈、历史经验和团队上下文。Agent 如果只看代码 diff 和测试输出,就很容易在局部正确的世界里做出全局错误的判断。

所以 Harness 不能只等于“跑测试”。

它要把真实反馈接进来:浏览器点击、命令执行、日志读取、状态检查、权限限制、成本记录、人工审批。越接近生产的任务,Harness 越不像 prompt 模板,越像一个小型控制平面。

生产级 Agent Harness 更像控制平面,连接工具、权限、日志、测试和人工审批

这也是为什么 Anthropic 的示例里会强调 Playwright。浏览器验证不是为了炫技,而是代表一种朴素的工程态度:不要听 Agent 说页面能用,打开它,点它,看它是不是真的能用。

不是再写一句“请认真测试”

过去几年,我们很习惯用 prompt 解决 AI 问题。

模型不认真,就写“你是资深工程师”。模型会偷懒,就写“不要偷懒”。模型容易漏测,就写“请仔细测试”。模型容易幻觉,就写“如果不知道请说不知道”。

这些提示不是完全没用,但它们有明显上限。

任务短的时候,prompt 可以起到约束作用。任务一长,问题就会转移到系统层:模型什么时候该停?它如何知道自己偏题了?谁来判断完成标准?上下文太长时哪些信息应该保留?工具权限如何收紧?失败经验如何沉淀到下一次?

这些问题不是一句“请认真一点”能解决的。

举个最简单的例子。

如果你不希望 Agent 在没跑测试的情况下声称完成,最弱的方法是在 prompt 里写“请务必运行测试”。稍强一点,是给它一个完成检查清单。再强一点,是在 workflow 里要求测试命令必须成功。更进一步,是用 hook 或 CI 把测试失败直接变成无法通过的状态。

前面是提醒,后面是制度。

AI Agent 真要进生产,可靠性最终还是要靠制度,而不是靠提醒。

先别急着堆多 Agent

看到 Planner / Generator / Evaluator 这种架构,很容易得出一个粗糙结论:多 Agent 更强。

我觉得这反而容易把人带偏。

Anthropic 的实验里有个细节很重要:随着模型能力增强,他们会删掉一些不再必要的 Harness 结构。也就是说,Harness 不是越复杂越好。每个组件都应该证明自己还有价值。

对普通开发者来说,这一点更实际。

不要一上来就设计五个 Agent、十个角色、二十个工具。很多时候,你需要先看清楚它到底在哪里失败。

经常误解需求,就加需求澄清。经常写完不测,就加测试门禁。经常说完成但页面不能用,就加浏览器验证。经常被上下文污染,就把任务拆小,写 handoff 文件,必要时重置上下文。经常执行危险命令,就收权限,加人工确认。

Harness 的本质不是画出漂亮架构图,而是把真实失败固化成流程。

O’Reilly 那篇文章里有个原则很实用:每一次错误都应该变成一条规则。当然,这不是说把所有偶发问题都塞进文档,而是把反复出现、代价明确的失败,沉淀成可执行的约束。

Prompt 技巧追求的是一次性效果。Harness 工程追求的是可重复、可调试、可继承。

这两者不是一个层级的问题。

“AI 生码率”会误导管理者

BestBlogs 今日精选里还有一条 InfoQ 中文的线索:阿里云 CIO 复盘 AI 提效时,拒绝把“AI 生码率”纳入考核。

这个判断和 Harness 话题可以放在一起看。

如果只看 AI 生成了多少代码,很容易鼓励错误行为。Agent 可以生成很多行代码,但这些代码可能增加维护负担,可能没有测试,可能绕开原有架构,也可能只是把简单问题复杂化。

软件工程的目标不是更多代码,而是更稳定地交付价值。

Harness 关心的也不是 Agent 写了多少,而是它有没有按正确流程完成任务:需求是否清楚,变更是否最小,测试是否通过,风险是否可控,失败是否可追踪,结果是否能被验收。

当 AI 编程从个人尝鲜进入团队生产,管理者不能只问“用了多少 AI”“生成了多少代码”。更该问的是:AI 参与的变更有没有更高缺陷率?哪些任务适合 Agent?哪些权限不该开放?哪些失败模式反复出现?哪些规则已经自动化?

这些问题都不是模型排行榜能回答的。

答案大多在 Harness 里。

下一代 AI 工程师,不只是写 Prompt 的人

如果说 2023 年大家争着学 Prompt Engineering,2025 年开始谈 Context Engineering,那么接下来 AI 工程里会越来越多出现一种新工作:给 Agent 设计 Harness。

这个角色不一定真的叫 Harness Engineer,但工作内容会越来越清楚。

他不只是写 prompt,也不只是接模型 API。他要知道怎么给 Agent 设计工具,怎么控制权限,怎么构造上下文,怎么记录 trace,怎么写评估标准,怎么接入测试和浏览器,怎么把失败反馈变成下一轮改进。

他关心的不是“让 AI 回答得更漂亮”,而是“让 AI 在真实流程里更可靠”。

这也是开发者可以从 Anthropic 这次实验里带走的东西。

不要把 Harness 理解成大公司的复杂玩具。你自己的项目里也可以有很小的 Harness:一份清晰的 CLAUDE.md,一个必须运行的测试命令,一个禁止删除数据的权限规则,一个 PR 前检查清单,一个用浏览器验证关键路径的步骤。

这些东西单独看都不酷,但它们决定了 Agent 是偶尔惊艳的助手,还是可以反复使用的工程成员。

模型会继续变强。某些脚手架会被删掉,某些流程会变简单。但只要 Agent 开始替人连续行动,我们就绕不开那个问题:

你准备用什么系统来相信它?

Harness 的意义就在这里。

它不是再给 AI 多写几句提示词,而是给 AI 装上刹车、仪表盘、验收员和事故复盘机制。

参考来源

RSS Feed 使用 Hugo 构建
主题 StackJimmy 设计