文章

为什么 Agent 能不能跑稳,关键不只是模型:从 Prompt、Context 到 Harness Engineering

为什么 Agent 能不能跑稳,关键不只是模型:从 Prompt、Context 到 Harness Engineering

这两年,AI 圈很喜欢造新词。

先是 Prompt Engineering,后来是 Context Engineering,现在又轮到 Harness Engineering。如果你只是远远看着,很容易觉得这不过是换个术语继续包装旧东西。

但如果你真的做过一点 AI 应用,尤其是做过 Agent,很快就会发现:这几个词不是在争流行度,它们对应的是三类完全不同的问题。

最开始,大家在解决的是一个很直接的问题:模型到底有没有听懂你在说什么。
接着,问题变成了:模型有没有拿到足够而且正确的信息。
再后来,问题继续往外扩了一层:就算模型听懂了,也拿到了信息,它能不能在真实任务里一直做对?

Harness Engineering,就是在回答第三个问题。

这篇文章不打算把概念讲得很学术,只想把一件事讲清楚:为什么今天做 Agent,重点已经不只是模型和提示词,而是模型外面的那套“工作系统”。

一切先从 Prompt Engineering 开始

先把问题说简单一点。

大模型本身并不神秘。你可以把它理解成一个非常擅长“根据当前输入,继续往下生成”的系统。它会根据你给它的上下文,预测下一段最可能出现的内容。

这意味着一件事:如果你的指令很模糊,它的输出就很容易发散。

比如你丢给它一段代码,只说一句“帮我加个排序”,它可能只返回一小段排序逻辑;但如果你再补几句:

  • 给我完整函数
  • 不要改动其他逻辑
  • 保持原有风格

结果通常就会好很多。

这就是 Prompt Engineering 最朴素的价值。它不是神秘技巧,也不是咒语大全,本质上就是通过更清晰的表达,把模型往你想要的方向推。

常见的做法无非这些:

  • 给角色
  • 给背景
  • 给示例
  • 给格式要求
  • 给限制条件
  • 说明什么不能做

所以 Prompt Engineering 解决的核心问题,其实可以总结成一句话:

让模型别乱答,而是尽量按你的要求来答。

在大模型刚火起来的时候,这件事非常重要。因为那时候很多任务本来就不复杂,更多是在考验“你有没有把话说清楚”。

但很快,提示词就不够用了

问题在于,很多任务不是你说清楚就能解决的。

比如:

  • 让模型分析一份公司的内部文档
  • 让它根据最新配置回答问题
  • 让它按一套很长的开发规范改代码
  • 让它在多个步骤之间传递信息,完成一个完整流程

这时候你会发现,提示词再漂亮,也弥补不了一个根本问题:模型不知道那些它本来没看到的事实。

于是第二层问题出现了。

大家开始意识到,真正影响结果的,不只是“怎么说”,还有“给了什么信息”。

这就是 Context Engineering

什么是 Context Engineering

所谓 context,你可以把它理解成一次请求里,模型真正能看到的全部内容。

提示词只是其中一部分。除此之外,还可能包括:

  • 当前任务描述
  • 历史对话
  • 代码文件
  • 报错日志
  • 测试结果
  • 检索出来的文档
  • 项目规则
  • 外部工具返回的数据

这些东西放在一起,才构成了模型“这一轮做判断时的视野”。

Context Engineering 做的事,就是想办法管理这个视野。

因为现实里有一个很烦的问题:上下文不是无限的。

模型一次能处理多少内容,是有上限的。对话一长、文件一多、日志一堆,上下文窗口很快就会被占满。这个时候系统只能做几件事:

  • 压缩一部分信息
  • 丢掉一部分信息
  • 摘要一部分信息
  • 重新组织一部分信息

麻烦也正是在这里开始的。

一旦处理不好,模型就会出现你很熟悉的那些毛病:

  • 忘记前面的约束
  • 回答前后不一致
  • 目标慢慢漂移
  • 对项目的理解越跑越偏

所以 Context Engineering 关心的,已经不是“怎么把提示词写得更花”,而是:

在有限的窗口里,怎么把最合适的信息,在最合适的时候,用最合适的结构送进去。

上下文工程,通常离不开三个动作

如果把它拆开看,Context Engineering 常见的动作大概就三个。

1. 召回

先决定这一轮需要什么信息。

可能是:

  • 当前文件
  • 历史聊天记录
  • 相关文档
  • 测试失败日志
  • 外部知识库里的资料

很多 RAG、记忆系统、语义检索,本质上都属于这一层。

2. 压缩

信息拿到了,不代表能直接全塞进去。

上下文窗口是有限的,所以必须压缩。压缩的方法可能是摘要、结构化、提炼关键片段,或者只保留和当前任务最相关的部分。

重点不是“越短越好”,而是“尽量别丢掉真正关键的东西”。

3. 组装

信息顺序也很重要。

什么放前面,什么放后面,什么固定注入,什么按需加载,都会影响模型最后抓住什么重点。

这也是为什么同样一个模型,换到不同工具里,效果可能差很多。很多时候差的不是模型,而是它背后的上下文管理策略。

Prompt Engineering 和 Context Engineering,其实是一层包含关系

很多人会把这两个词拆得很开,其实没必要。

更准确的理解是:

Prompt EngineeringContext Engineering 的一部分。

因为提示词本身就是上下文的一部分。只不过,提示词更偏向“如何写约束”,上下文工程更偏向“如何管理整包信息”。

如果说 Prompt Engineering 解决的是“模型该怎么说”,那么 Context Engineering 解决的就是“模型到底看到了什么”。

讲到这里,其实都还只是输入侧的问题。

真正更难的部分,还在后面。

为什么 Prompt 和 Context 都做好了,Agent 还是会跑偏

很多人第一次做 Agent 时,都会经历一个幻灭时刻。

你会发现:

  • 提示词已经写得很细了
  • 检索也做了
  • 文档也喂进去了
  • 工具也接上了

但它还是会在执行任务的时候出问题。

比如:

  • 计划写得很好,执行时却走偏
  • 调了工具,但误解了工具结果
  • 前面明明做对了,后面越走越歪
  • 测试已经报错,它却还以为自己做完了

这说明一个问题:

让模型“会说”,和让模型“会做事”,根本不是同一个难度级别。

一旦模型开始进入真实任务,它面对的就不再是一次回答,而是一整个循环:

  1. 看任务
  2. 做判断
  3. 调工具
  4. 看结果
  5. 再判断
  6. 再执行

循环一长,上下文就会膨胀,状态就会变复杂,错误也会累积。

这个时候,仅靠提示词工程和上下文工程,已经不够了。

你需要一套更外层的系统,去约束它、驱动它、纠偏它、验收它。

这套东西,就是 Harness Engineering

什么是 Harness Engineering

你可以把 Harness 理解成一套“驾驭系统”。

它的重点不是单次回答,而是让模型在一个可控的环境里,持续完成任务。

换句话说,Harness Engineering 关注的是:

  • 模型怎么和工具协作
  • 任务怎么拆分和推进
  • 中间状态怎么保存
  • 错误怎么反馈回来
  • 结果怎么验证
  • 跑偏之后怎么拉回来

如果说:

  • Prompt Engineering 是在解决“怎么说”
  • Context Engineering 是在解决“看什么”

那么 Harness Engineering 解决的就是:

怎么让模型在真实世界里持续干活,而且别越干越偏。

一个很容易懂的比喻

假设你要安排一个新人去见重要客户。

这时候三者的区别就很好理解了。

Prompt Engineering 是你把任务讲清楚:
先寒暄,再介绍方案,再问需求,最后确认下一步。

Context Engineering 是你把资料给对:
客户背景、历史沟通记录、报价、竞品情况、会议目标,都要提前准备好。

Harness Engineering 是你开始管理整个过程:
让他带 checklist,关键节点实时汇报,会后核对纪要,发现偏差就立刻纠正,最后按照明确标准验收结果。

到这里就能看出来:

前两者还是在“准备输入”,而 Harness Engineering 已经是在“管理整个执行过程”了。

从工程上看,Agent 的本质其实就是一个循环

很多 Agent 听起来很神秘,但从工程实现上看,它通常就是一个循环:

  1. 读取任务和上下文
  2. 让模型做判断
  3. 调用工具执行动作
  4. 把执行结果放回上下文
  5. 继续下一轮,直到完成或停止

常见的 ReAct,本质上就是这种“思考 + 执行 + 反馈”的循环。

问题也正是在这里。

只要循环够长,模型就一定会遇到这些现实问题:

  • 看过的东西越来越多
  • 状态越来越复杂
  • 前面的目标开始被后面的噪音冲淡
  • 错误会一轮一轮积累

所以,Harness Engineering 的价值,不是在模型外面再套一层漂亮概念,而是在于它真的在解决这些工程问题。

一个成熟的 Harness,通常至少有这四层能力

为了让普通读者更容易抓住重点,这里不展开复杂框架,只讲最核心的四层。

1. 记忆层

模型在长流程里很容易忘事,所以必须有一些固定的核心信息,持续跟着任务走。

比如:

  • 项目目标
  • 技术栈
  • 编码规范
  • 禁止事项
  • 交付标准

这些信息常常会被写进规则文件里,在每一轮调用时固定注入,避免模型跑着跑着就把方向忘了。

2. 执行层

没有执行层,大模型只能聊天。

有了执行层,它才能:

  • 读写文件
  • 运行命令
  • 调用浏览器
  • 跑测试
  • 访问外部工具

这是“会说”变成“会做”的分界线。

3. 反馈层

模型之所以能不断修正,不是因为它突然变聪明了,而是因为执行结果被喂回来了。

例如:

  • 测试失败
  • 编译报错
  • Lint 不通过
  • 工具调用失败

这些结果进入下一轮上下文之后,模型才有机会继续修复。

4. 编排层

如果没有更高层的编排,Agent 很容易陷入“想到哪做到哪”的局部试错。

所以还需要一层来负责:

  • 拆解任务
  • 定义步骤
  • 判断何时继续
  • 判断何时停止
  • 决定失败后是重试、回滚还是换路径

这层能力,决定了 Agent 是在“认真完成任务”,还是只是在忙。

所以,为什么同一个模型在不同工具里效果差很多

很多人会把差异都归因到模型版本上,这当然有影响,但通常不够解释全部问题。

更大的差异,往往来自工具背后的 Harness

比如:

  • 规则文件写得好不好
  • 上下文召回准不准
  • 压缩是否丢了关键约束
  • 工具调用是否合理
  • 错误有没有进入下一轮
  • 任务拆分是否清晰
  • 有没有明确的停止条件

这些东西看起来不像模型能力,但它们往往更直接地决定了 Agent 能不能稳定交付结果。

简单说就是:

模型像大脑,Harness 像工作系统。
大脑决定潜力,系统决定这份潜力能不能稳定发挥出来。

对普通开发者来说,这意味着什么

如果你正在做 AI 应用,尤其是 Agent,有一个认知值得尽早建立:

接下来真正拉开差距的,不只是“谁用了更强的模型”,而是谁把模型外面的工程系统搭得更稳。

也就是说,未来很多优化,可能不是继续死磕提示词,而是去补这些能力:

  • 更清楚的规则
  • 更稳定的上下文管理
  • 更合理的工具接入
  • 更完整的反馈链路
  • 更可靠的任务编排
  • 更明确的验收和恢复机制

这也是为什么现在越来越多团队会说:

Agent = 大模型 + Harness

凡是不属于模型本身,但又决定它能不能持续稳定交付的那部分,都可以看作 Harness Engineering 的范围。

最后总结

如果只用一句话来概括这三个概念,大概可以这样记:

  • Prompt Engineering:让模型知道你想让它怎么说
  • Context Engineering:让模型在这一轮看到正确的信息
  • Harness Engineering:让模型在一个可控系统里持续把事情做对

前两个词解决的是输入问题,最后一个词解决的是执行问题。

这也是今天做 Agent 时最容易被忽略、但又最关键的一点:

模型当然重要,但真正决定一个系统能不能落地、能不能跑稳的,往往不是模型本身,而是你给它搭了怎样的外部系统。

说得更直接一点:

真正难的,已经不只是让模型“看起来聪明”,而是让它在真实世界里稳定工作。

本文由作者按照 CC BY 4.0 进行授权