从一个现象说起

用 AI 写代码的人大概都有过类似的体验:同一个模型,放在网页聊天框里改一个复杂项目,它给你贴一大段代码,粘哪儿你自己想;换到 Claude Code 这类编码工具里,它能自己读文件、跑测试、看报错、再来一轮,几分钟后交回来一个能跑的 diff。

模型明明是同一个,差别在哪?

在模型外面那一层:谁来维持任务状态、给它什么工具、允许它碰哪些文件、上下文快满了怎么办。这层东西有个名字,harness。

这个词原本是赛马用的马具,套在马身上,把马力变成人能驾驭的速度。放到 AI 语境里,它指包裹模型的整套工程脚手架。

harness 里都有什么

把一个 agent 产品拆开看,大致几层:

  • 调度循环:最核心的部分。收任务、调模型、执行工具、看结果、决定下一步,直到任务完成或需要人介入。
  • 工具层:文件读写、shell、搜索、浏览器。每个工具的定义、描述、错误信息都是设计出来的。
  • 上下文管理:什么时候压缩历史、裁掉什么、哪些信息要挪到外部存储。
  • 权限与沙箱:哪些操作直接放行、哪些要人确认、危险命令怎么拦。
  • 记忆:跨会话记什么、忘什么。

骨架用伪代码写出来其实很短:

while not task_done:
    response = model.call(context, tools)
    if response.wants_tool:
        result = sandbox.execute(response.tool_call)  # 权限检查在这
        context.append(result)
    else:
        break  # 模型认为任务完成

跑得起来,demo 一小时就能写完。但生产级 harness 的复杂度全在省略号里:工具调用失败怎么重试、上下文超限怎么压缩、用户中途打断怎么恢复、两个工具并发改同一个文件怎么办。工程量和这个 while 循环完全不在一个量级。

判断一个 harness 的成色,我的经验是别看它顺利的时候多流畅,看它出错的时候怎么表现:重试有没有上限,错误信息有没有传回给模型,会不会带着坏状态继续跑。

五个常见误区

误区一:harness 就是个 API 封装

最低配确实如此,所以很多人低估了它。但"能跑"和"能用"之间隔着大量脏活:权限模型、上下文管理、失败恢复、可观测性。Anthropic 在 Building Effective Agents 里反复强调别急着上复杂框架,先把简单模式的可靠性做扎实。这句话反过来读,就是说简单模式做到可靠本身就很难。

误区二:上下文窗口够大,就不用管上下文了

窗口从 128K 涨到 200K 再到 1M,于是有人觉得历史记录一股脑塞进去就行。但窗口大不等于注意力够用。长上下文有个被反复观察到的现象(有人叫它 context rot):信息越多,模型对中段内容的利用越差,关键细节容易被淹没。

1M 的窗口更像一个 1T 的书架,书都放得下,不代表你过目不忘。该压缩压缩,该外置外置,这是 harness 的活,不是模型的活。

误区三:工具越多越好

直觉上工具全一点,agent 能力就强一点。实际常常相反:工具一多,描述互相干扰,模型选错的概率明显上升,功能有重叠的工具尤其如此。

质量比数量重要。工具描述写得好、错误信息清晰(“参数 X 不合法,合法范围是……“而不是一个裸堆栈),agent 的自我纠正率完全不在一个水平。十几个精心设计的工具,往往胜过五六十个堆出来的。

误区四:安全可以在外面补一层

Prompt injection 的根源在于 agent 要读不可信的外部内容(网页、issue、文档),同时手里有真实权限。这两个条件凑齐,注入就有了通道,事后加关键词过滤堵不住。

权限模型得一开始就设计:最小权限、高危操作人工确认、文件和网络的沙箱边界。这是我认为 harness 层最不能省的工作。

误区五:benchmark 分数高,我的场景就一定好

各家模型厂商报的 SWE-bench 之类分数,都是用自家 harness 跑出来的。社区这几年反复观察到:同一个模型换个 harness(换脚手架、换提示词组织方式、换工具集),分数能差出一大截。

所以选型的时候,benchmark 只能当参考。拿自己的真实任务、在接近生产的 harness 里测一遍,才算数。

harness 和 agent 的区别

这两个词经常被混用,但不是一回事。

我的理解:harness 是静态的,是代码库里那套脚手架;agent 是运行时的,是模型跑在 harness 里处理具体任务的那个过程。

同一套 harness,接不同的模型、不同的工具集、不同的系统提示词,跑出来就是不同的 agent。反过来,同一个模型跑在不同的 harness 里,能力上限也完全不同。

打个比方:模型是司机,harness 是整辆车,方向盘、油门、刹车、安全带都算。讨论"这个司机开得怎么样"的时候,不提车是没有意义的。

还有一条分界线值得单独说:chatbot 和 agent 的区别不在模型,在 harness 给不给它三样东西:自主循环、工具调用、终止判断。网页聊天框里没有这三样,所以模型再强,它也只是个 chatbot。市面上大量"网页版套个壳"的产品和真正的 agent 产品之间的差距,几乎全在 harness 层。

最后

下次评估一个 agent 产品,可以先别问"你们用的什么模型”,换几个问题:上下文快满的时候怎么处理?agent 能自己删生产库吗,还是要人确认?工具调用失败之后呢?

答案的质量,往往比模型名字更能说明这个产品的成色。