Harness:AI 编程的下一个瓶颈

小新 正五品 (知州) 2026-03-29 21:44 0 0 返回 码工码农
小新 正五品 (知州) 楼主
2026-03-29 21:44
第1楼

摘要:太长不看版

单智能体的两大顽疾:上下文焦虑(窗口填满后急着收尾)和自我评估偏差(对自己的输出过度自信) 借鉴 GAN 的对抗思维:用独立的评估器替代自我评估,通过 Playwright 真实交互后打分,形成生成-评估对抗循环 三智能体架构:Planner 规划、Generator 实现、Evaluator 测试,通过文件通信建立"冲刺合约" 成本换质量:单智能体快但残缺(20分钟/9),完整框架慢但可用(6小时/9),完整框架慢但可用(6小时/9),完整框架慢但可用(6小时/200) 运行框架会过时:每个组件都编码了"模型做不到"的假设,模型进化后需要定期审计和简化 分工比智能更重要:把"生成"和"评估"分离,比提升单个智能体能力更有效 对软件流程的启示:开发者自测的局限性与 AI 自我评估问题本质相同,都需要独立评估机制

单智能体为什么会"累"? 很多人第一反应是:模型不够聪明,或者上下文窗口太小。经过 5-15 轮迭代,生成的设计明显比单次输出更有特色。#8A6A9A,stroke-width:2px,color:#fff

class A plannerStyle
class B generatorStyle
class C evaluatorStyle

各自的职责 Planner(规划智能体)

把简短的需求扩展成详细的产品规格 重点是范围界定,而不是具体实现细节 输出"冲刺合约":定义这个迭代要完成什么

Generator(生成智能体)

使用 React、Vite、FastAPI、SQLite/PostgreSQL 实现功能 增量式开发,每次实现一部分 用 git 做版本控制

Evaluator(评估智能体)

用 Playwright 像真实用户一样测试功能 对照"冲刺合约"检查是否达标 识别 bug 和遗漏的功能

通信机制 智能体之间通过文件通信,而不是直接对话。


Harness这个词最近被越来越多的提及。这两天在读 Anthropic 工程团队的一篇技术博文《Harness Design for Long-Running Application Development》,提出了一个更值得工程团队重视的变化:

当 AI 模型的上下文窗口越来越大、能力越来越强时,限制 AI 编程质量的瓶颈,正在从"模型能不能做"转向"怎么让模型持续做好"。

Anthropic 的工程师 Prithvi Rajasekaran 把这个问题拆得很透彻,并给出了一套基于多智能体架构的解决方案。更重要的是,这套方案背后的思路,对我们重新思考软件开发流程有不少启发。

太长不看版

  1. 单智能体的两大顽疾:上下文焦虑(窗口填满后急着收尾)和自我评估偏差(对自己的输出过度自信)
  2. 借鉴 GAN 的对抗思维:用独立的评估器替代自我评估,通过 Playwright 真实交互后打分,形成生成-评估对抗循环
  3. 三智能体架构:Planner 规划、Generator 实现、Evaluator 测试,通过文件通信建立"冲刺合约"
  4. 成本换质量:单智能体快但残缺(20分钟/9),完整框架慢但可用(6小时/9),完整框架慢但可用(6小时/9),完整框架慢但可用(6小时/200)
  5. 运行框架会过时:每个组件都编码了"模型做不到"的假设,模型进化后需要定期审计和简化
  6. 分工比智能更重要:把"生成"和"评估"分离,比提升单个智能体能力更有效
  7. 对软件流程的启示:开发者自测的局限性与 AI 自我评估问题本质相同,都需要独立评估机制

单智能体为什么会"累"?

很多人第一反应是:模型不够聪明,或者上下文窗口太小。

但如果认真看 Anthropic 的分析,会发现真正的问题是:

  • 过去:我们以为给 AI 足够大的上下文窗口,它就能持续高质量输出
  • 现在:即使有 200K token 的窗口,AI 在长时任务中仍然会出现两个系统性问题

问题一:上下文焦虑

这是个很有意思的现象。当上下文窗口逐渐填满时,模型会表现出一种"焦虑"——它会主动加速收尾,即使任务还没完成。

就像一个开发者看到 deadline 临近,开始草草了事一样。模型似乎"感知"到了上下文的边界,然后选择提前结束,而不是继续深入。

问题二:自我评估偏差

更致命的是,当你让 AI 评估自己写的代码时,它会表现出过度自信。

一个典型场景:

  • AI 写了一段有 bug 的代码
  • 你问它:"这段代码有问题吗?"
  • AI 回答:"完全没问题,运行得很完美!"
  • 实际上:核心功能根本不工作

这不是模型"撒谎",而是自我评估机制的固有缺陷。就像让开发者自己测试自己的代码,很容易陷入"我觉得应该能跑"的思维定式。

从 GAN 借来的对抗思维

Anthropic 的解法很巧妙:既然自我评估不可靠,那就引入一个独立的评估者。

这个思路直接借鉴了生成对抗网络(GAN)的设计:

  • 生成器:负责创造内容(写代码、设计界面)
  • 评估器:负责判断质量,给出反馈
  • 对抗循环:生成器根据评估器的反馈不断改进,直到达到标准

关键在于,评估器不是简单地"看代码",而是真的去用。

前端设计的实验

在前端设计任务中,Anthropic 设置了四个评分维度:

  • 设计质量:颜色、字体、布局是否形成统一的视觉风格
  • 原创性:是否有刻意的设计选择,而不是套模板
  • 工艺水平:间距、层次、对比度等技术执行
  • 功能性:可用性和任务完成度

评估器使用 Playwright 真实地与页面交互,然后打分。经过 5-15 轮迭代,生成的设计明显比单次输出更有特色。有个案例到第 10 轮时,生成了一个 3D 空间博物馆体验,这是单智能体很难做到的。

三智能体全栈架构:分工才是关键

前端设计验证了思路,接下来是更复杂的全栈应用开发。Anthropic 设计了一个三智能体系统:

graph LR
    A[Planner<br/>规划智能体] -->|产品规格| B[Generator<br/>生成智能体]
    B -->|实现代码| C[Evaluator<br/>评估智能体]
    C -->|反馈报告| B
    C -.->|重大问题| A

    classDef plannerStyle fill:#1A5050,stroke:#1A9090,stroke-width:2px,color:#fff
    classDef generatorStyle fill:#2A4A6A,stroke:#4A8ACA,stroke-width:2px,color:#fff
    classDef evaluatorStyle fill:#4A3A5A,stroke:#8A6A9A,stroke-width:2px,color:#fff

    class A plannerStyle
    class B generatorStyle
    class C evaluatorStyle

各自的职责

Planner(规划智能体)

  • 把简短的需求扩展成详细的产品规格
  • 重点是范围界定,而不是具体实现细节
  • 输出"冲刺合约":定义这个迭代要完成什么

Generator(生成智能体)

  • 使用 React、Vite、FastAPI、SQLite/PostgreSQL 实现功能
  • 增量式开发,每次实现一部分
  • 用 git 做版本控制

Evaluator(评估智能体)

  • 用 Playwright 像真实用户一样测试功能
  • 对照"冲刺合约"检查是否达标
  • 识别 bug 和遗漏的功能

通信机制

智能体之间通过文件通信,而不是直接对话。这样做有两个好处:

  • 强制结构化输出(规格文档、测试报告)
  • 避免上下文污染(每个智能体只看到自己需要的信息)

实际效果:成本换质量值不值?

理论听起来不错,但实际效果如何?Anthropic 给出了两个对比案例。

在复古游戏制作器项目中,同样的需求用两种方案实现:单智能体 20 分钟花费 9,但核心功能损坏无法使用;完整运行框架6小时花费9,但核心功能损坏无法使用;完整运行框架 6 小时花费 9,但核心功能损坏无法使用;完整运行框架6小时花费200,功能完整可正常使用。20 倍的成本差距,但产出质量天壤之别。单智能体版本看起来"完成了",实际上核心功能根本跑不通。

更有意思的是数字音频工作站(DAW)案例。使用升级后的运行框架(基于 Claude Opus 4.6),3 小时 50 分钟花费 $124.70 完成开发。关键发现是:生成器一度认为"任务完成",但评估器发现还有重要功能没实现。如果没有独立评估,这些问题会被掩盖。

这两个案例说明,评估器的价值不只是找 bug,更重要的是防止生成器"自欺欺人"式的完工。

运行框架也会过时

这里有个很重要的洞察,Anthropic 的原文是这么说的:

"Every component in a harness encodes an assumption about what the model can't do on its own."

(运行框架中的每个组件,都编码了一个关于"模型自己做不到什么"的假设。)

换句话说,运行框架本质上是对模型能力边界的补偿。当模型能力提升时,有些补偿就不再需要了。

实际演进案例

在早期版本中,Anthropic 的运行框架包含了"冲刺分解"功能——把大任务拆成小任务,逐个完成。

但当升级到 Claude Opus 4.6 后,他们发现这个功能可以移除了。新模型已经能够自己管理复杂任务的节奏,不需要外部框架强制分解。

移除这个组件后:

  • 架构更简单
  • 成本更低(少了一个智能体的调用)
  • 质量没有下降

这说明什么?运行框架不是一劳永逸的,需要随着模型进化定期审计。

对传统软件开发流程的反思

读到这里,如果你是工程师或架构师,可能会有种似曾相识的感觉。

Anthropic 遇到的问题,和我们在传统软件开发中遇到的问题,本质上是一样的:

开发者自测的局限

让开发者测试自己写的代码,会遇到什么问题?

  • 思维定式:按照"我以为的逻辑"测试,而不是"实际可能的场景"
  • 过度自信:觉得"这么简单的功能不可能有问题"
  • 选择性忽视:潜意识里回避那些可能暴露问题的测试路径

这和 AI 的自我评估偏差,是同一个问题的不同表现。

为什么需要 QA

传统开发流程中,我们引入独立的 QA 角色,原因是:

  • QA 没有实现包袱,更容易发现问题
  • QA 会从用户视角测试,而不是从实现逻辑测试
  • QA 的目标是"找到问题",而开发者的目标是"证明没问题"

Anthropic 的评估器智能体,扮演的就是 QA 的角色。

分工的价值

更深层的启示是:分工比智能更重要

不是说单个智能体不够聪明,而是"既要写代码,又要判断好坏"这件事本身就很难做好。把这两个职责分离,比提升单个智能体的能力更有效。

这和康威定律的逻辑一致:系统架构会反映组织的沟通结构。当我们把"生成"和"评估"分离成两个独立角色时,自然就形成了更健康的反馈循环。

架构师的新角色:设计智能体协作

如果 AI 编程的未来是多智能体协作,那架构师的角色也会发生变化。

从系统架构到协作架构

过去的架构师

  • 设计模块划分
  • 定义接口规范
  • 制定技术选型

未来的架构师

  • 设计智能体分工
  • 定义协作合约
  • 制定评估标准

注意,这不是替代,而是扩展。系统架构依然重要,但多了一层"智能体协作架构"。

什么时候需要多智能体

不是所有任务都需要复杂的运行框架。Anthropic 的经验是:

单智能体够用的场景

  • 任务明确、范围小
  • 20 分钟内能完成
  • 可以快速验证结果

需要多智能体的场景

  • 任务复杂、持续时间长
  • 需要多轮迭代优化
  • 质量标准主观或难以自检

关键是渐进式引入复杂度:先用最简单的方案试错,遇到瓶颈再加入分工机制。

给工程团队的实践建议

基于 Anthropic 的经验,结合当前的软件开发实践,这里有几个可以立即尝试的方向:

建立"生成-评估"分离意识

  • 写完代码后切换视角重新审视,不要问"我写对了吗",而是问"用户会怎么用"
  • 记录你的"上下文焦虑"时刻:什么时候急着收尾、对代码质量妥协,这些往往是需要外部反馈的信号
  • 考虑引入结对编程或代码审查,让另一个人做"评估者"

重新审视自测机制

  • 承认自测是必要但不充分的,引入更独立的测试环节
  • 试验 AI 辅助的评估流程,让 AI 扮演"挑刺者"角色
  • 用 Playwright 等工具做真实的端到端测试,把评估标准显式化

设计"冲刺合约"机制

  • 在开发前明确验收标准,标准要可测试、可验证
  • 定期审计工具链:哪些流程是因为"以前做不到"而引入的?现在能简化吗?
  • 建立反馈循环的度量:从提交代码到发现问题的时间、自测覆盖率 vs 实际问题分布

写在最后

当工具变得足够强大时,限制我们的往往不是工具本身,而是我们使用工具的方式。

AI 模型越来越聪明,但如果我们还是用"单兵作战"的方式使用它,就会遇到上下文焦虑和自我评估偏差这样的系统性瓶颈。

解决方案不是等待更强的模型,而是重新设计协作架构——把生成和评估分离,建立真实的反馈循环,让每个角色专注做好自己的事。


参考资料:

Niko-白色版.png

暂无回复,快来抢沙发吧!

  • 1 / 1 页
敬请注意:文中内容观点和各种评论不代表本网立场!若有违规侵权,请联系我们