Harness Engineering:AI Agent 真正落地的关键,不只是模型
Prompt 让模型听懂任务,Context 让模型拿到信息,而 Harness 决定 Agent 能否在真实长链路任务中稳定交付。
过去一段时间,我越来越强烈地感受到:AI Agent 的上限可能由模型决定,但它能不能稳定交付,往往取决于模型外面的那套系统。
很多时候,我们会把 Agent 表现不好归因于模型不够强、提示词没写好、上下文没塞够。但在真实项目里,问题经常不在这些显眼的位置。真正让 Agent 从“偶尔惊艳”走向“稳定可用”的,往往是任务如何拆解、状态如何管理、关键步骤如何校验、失败之后如何恢复。
这套围绕模型搭建的运行、编排、监督和纠偏系统,就是我理解的 Harness Engineering。
一句话理解 Harness Engineering
Prompt Engineering 解决的是“怎么把任务讲清楚”。
Context Engineering 解决的是“怎么把信息给正确”。
Harness Engineering 解决的是“怎么让模型在真实执行中持续做对”。
如果说 Prompt 和 Context 主要处理模型的输入侧,那么 Harness 处理的是整个任务执行过程:工具、状态、流程、检查、观测、约束、失败恢复,以及如何让 Agent 在长链路任务里不跑偏。
为什么只靠模型和提示词不够
一个常见场景是:团队已经换上了很强的模型,提示词也反复打磨了很多版,但 Agent 一进真实业务场景还是不稳定。
它有时很聪明,有时又莫名跑偏;有时步骤看起来合理,结果却交付不了;有时工具调用成功了,但模型误解了工具返回;有时任务跑到一半,上下文开始混乱,前面确认过的结论又被忘掉。
这类问题继续靠“把提示词写得更长”通常不会根治。因为问题已经不只是“模型有没有听懂”,而是“系统有没有让模型在复杂环境里持续工作”。
稳定的 Agent 不是一个裸模型加一段提示词,而是一套完整的工作环境。模型负责推理和生成,Harness 负责给它轨道、边界、反馈和恢复能力。
AI 工程的三次重心迁移
我会把近几年的 AI 应用工程粗略分成三个阶段:Prompt Engineering、Context Engineering、Harness Engineering。
这三个阶段不是互相替代,而是边界一层层往外扩。
第一阶段:Prompt Engineering
大模型刚开始被广泛使用时,大家最直接的感受是:同一个模型,换一种问法,输出质量可能差很多。
于是 Prompt Engineering 成了第一波核心能力。角色设定、风格约束、few-shot 示例、输出格式、任务拆解、反例约束,这些方法都在解决一个问题:让模型更准确地理解当前任务,并沿着我们期望的方向生成。
Prompt Engineering 的本质不是命令模型,而是塑造一个局部的概率空间。你给它身份,它会沿着身份回答;你给它样例,它会沿着样例补全;你强调约束,它会把那些约束放到更高优先级。
但 Prompt 有天花板。它可以把任务讲清楚,却不能凭空补齐事实;它可以激发模型已有能力,却很难管理动态信息和长链路状态。
第二阶段:Context Engineering
当任务从单轮问答走向真实工作流时,模型需要的不再只是一段清楚的指令。
它还需要当前文档、历史记录、业务规范、用户偏好、工具返回、中间产物、系统规则、安全约束,以及其他 Agent 传来的结构化结果。
这就是 Context Engineering 的价值:在正确的时机,把正确的信息,以合适的形式送给模型。
这里的 Context 不只是几段背景资料,而是所有会影响模型当前决策的信息总和。
RAG 是 Context Engineering 的典型实践,但成熟的 Context Engineering 不止是检索。它还包括文档怎么切块、结果怎么排序、长文怎么压缩、历史对话什么时候保留、什么时候摘要、工具返回要不要全部暴露、多 Agent 之间传原文还是传结构化字段。
我觉得 Agent Skills 也是一种很典型的上下文工程实践。它背后的思想是渐进式披露:不要一开始就把所有工具说明、所有参数、所有 SOP 全塞给模型,而是先给最少必要信息,等模型真的需要某种能力时,再加载对应的详细说明、参考资料和脚本。
上下文不是越多越好。上下文窗口是稀缺资源,信息太多,注意力反而会被稀释。
第三阶段:Harness Engineering
Prompt 讲清楚了,Context 给正确了,复杂任务仍然可能失败。
因为真实任务不是一次回答,而是一条执行链路。模型需要连续行动、调用工具、读取反馈、更新计划、管理状态、修正错误,最后交付结果。
这时最关键的问题变成:当模型开始连续行动时,谁来监督它、约束它、校验它、纠偏它?
Harness Engineering 关注的就是这个问题。
它不是替代 Prompt,也不是替代 Context,而是在更大的系统边界里把二者都包含进来。Prompt 是 Harness 的一部分,Context 也是 Harness 的一部分,但 Harness 还要负责执行编排、工具治理、状态管理、评估观测和失败恢复。
一个简单类比
假设你要派一个新人去完成一次重要客户拜访。
Prompt Engineering 是把任务讲清楚:见面先寒暄,再介绍方案,问清需求,最后确认下一步。
Context Engineering 是把资料准备齐:客户背景、过往沟通记录、产品报价、竞品情况、会议目标。
Harness Engineering 是给他一整套可执行的工作系统:带着 checklist 去,关键节点实时汇报,会后核对纪要和录音,发现偏差及时纠正,最后按明确标准验收结果。
前两者解决“说清楚”和“信息齐”,Harness 解决“过程稳”。
成熟 Harness 的六层结构
如果把 Harness 拆开看,我会把它分成六层。
第一层:上下文边界
模型能不能稳定发挥,很多时候不只取决于它聪不聪明,还取决于它看到了什么。
Harness 首先要确保模型在正确的信息边界里思考:
- 当前角色是什么
- 任务目标是什么
- 成功标准是什么
- 哪些信息必须保留
- 哪些信息应该裁剪
- 固定规则、当前任务、运行状态、外部证据分别放在哪里
信息结构一旦混乱,模型就容易漏重点、忘约束,甚至被无关信息污染。
第二层:工具系统
没有工具时,大模型主要还是文本预测器。接上工具之后,它才真正能接触外部世界,比如搜索网页、读取文档、写代码、调 API、查数据库。
但 Harness 不是简单地把工具全部挂上去,而是要回答三个问题:
- 给模型什么工具
- 什么时候允许它调用工具
- 工具结果如何筛选、提炼并重新喂回模型
工具太少,能力不够;工具太多,模型容易乱用。工具返回也不应该原样塞回上下文,而要经过结构化、过滤和压缩。
第三层:执行编排
很多 Agent 的问题不是某一步不会,而是不会把所有步骤稳定串起来。
它可能会搜索,也会总结,也会写代码,但整个过程想到哪做到哪,最后产出一堆半成品。
一个完整任务通常需要一条清晰轨道:
- 理解目标
- 判断信息是否足够
- 不足则继续补充
- 基于已有信息分析
- 生成输出
- 检查输出
- 不满足要求则修正或重试
人类靠经验维持流程,Agent 靠 Harness 提供流程。
第四层:记忆和状态
没有状态管理的 Agent,每一轮都像失忆一样。
它不知道自己刚做了什么,不知道哪些结论已经确认,也不知道哪些问题还没解决。长任务一旦跑起来,很容易上下文混杂、状态漂移、重复劳动。
至少要区分三类状态:
- 当前任务状态
- 会话中的中间结果
- 长期记忆和用户偏好
这三类东西如果混在一起,系统会越来越乱。分清之后,Agent 才能像一个稳定的协作者,而不是一个每轮重启的聊天框。
第五层:评估和观测
很多 AI 系统不是生成不出来,而是生成完之后不知道自己做得好不好。
如果没有独立的评估和观测,Agent 很容易停留在“自我感觉良好”的状态。
成熟 Harness 需要包含:
- 输出验收
- 环境验证
- 自动测试
- 日志和指标
- 错误归因
系统不只要会做,还要知道自己有没有真的做对。
第六层:约束、校验和失败恢复
真实环境中,失败不是例外,而是常态。
搜索可能不准,API 可能超时,文档格式可能混乱,模型可能误解任务,外部系统也可能返回异常。
如果没有恢复机制,Agent 每次出错就只能从头再来,甚至在错误路径上越走越远。
这一层需要处理:
- 哪些事情能做,哪些不能做
- 输出前后如何检查
- 失败后如何重试
- 什么情况下回滚
- 如何把任务交接到干净状态继续执行
这一层往往决定系统能不能真正上线。
两个值得借鉴的工程原则
1. Context Reset:不要无限压缩脏上下文
长任务运行久了,上下文会越来越满。很多系统会做 context compaction,也就是把历史上下文压缩后继续跑。
但有时压缩不够。压缩只是变短了,不代表上下文负担真的消失了。模型可能仍然带着旧上下文里的噪声、偏差和混乱状态继续工作。
更激进的做法是 context reset:启动一个干净的新 Agent,把必要状态交接过去,让新 Agent 在更清爽的上下文里继续任务。
这有点像工程里遇到内存泄漏时,不是继续清缓存,而是重启进程,再恢复必要状态。
2. 生产和验收要分离
让同一个模型先干活,再给自己的结果打分,往往会偏乐观。
尤其是产品体验、设计完整度、代码质量这类没有唯一标准答案的任务,模型自评很容易放过问题。
更稳的方式是拆角色:
- Planner:把模糊需求扩展成规格
- Generator:负责实现
- Evaluator:像 QA 一样真实验证
关键是 Evaluator 不只是读输出,而是要进入真实环境里验证。比如打开页面、点击交互、运行测试、检查日志、观察指标。
生成、检查、修复、再检查,这个闭环比一次性生成可靠得多。
对 AI 编程的启发
把 Harness Engineering 放到 AI 编程里,我觉得会得到一个很重要的视角:不要只把 AI 编程看成“让模型写代码”,而要把它看成“给模型搭一个能交付软件的工作环境”。
一个稳定的 AI 编程工作流,至少应该让 Agent 看到真实反馈:
- 能运行测试
- 能打开浏览器
- 能截图和点击页面
- 能读取日志
- 能查询监控
- 能在隔离环境中修改和验证
- 能根据失败结果继续修复
如果 Agent 写完代码就宣布完成,但没有运行、没有验证、没有观察结果,那只是文本生成,不是工程交付。
还有一个很实用的原则:当 Agent 失败时,不要只要求它“再认真一点”。更应该问:它缺了什么结构性能力?
也许是缺少测试入口,也许是缺少日志可见性,也许是上下文组织太乱,也许是任务拆得太大,也许是没有明确验收标准,也许是工具返回没有被结构化。
修复 Agent,很多时候不是修复模型,而是修复环境。
我会如何设计一个 Agent Harness
如果我要设计一个真正可用的 AI 编程 Agent,我会从这几个问题开始检查:
- 目标是否被拆成明确阶段?
- 每个阶段的成功标准是什么?
- 当前阶段需要哪些上下文?
- 哪些上下文应该延迟加载?
- 工具列表是否足够少、足够明确?
- 工具调用是否有边界?
- 工具返回是否经过筛选和结构化?
- 当前任务状态、中间产物、长期记忆是否分开管理?
- 是否有独立评估者或自动验收流程?
- 是否能真实运行并观察结果,而不是只看文本输出?
- 日志、指标、错误归因是否可查?
- 失败后是简单重试,还是有恢复、回滚、交接机制?
- 规则是否能指导修复,而不只是指出错误?
这些问题看起来琐碎,但它们决定了 Agent 是玩具,还是工程系统。
几个关键概念
- Prompt Engineering:通过任务描述、角色设定、示例和格式约束,让模型更好理解和生成。
- Context Engineering:在正确时机给模型提供正确上下文,包括知识、状态、规则、工具返回和中间产物。
- Harness Engineering:围绕模型搭建执行、编排、工具、状态、评估、约束和恢复系统,让模型在真实任务中稳定工作。
- Context Compaction:把长上下文压缩后继续运行。
- Context Reset:启动干净的新 Agent,并把必要状态交接过去。
- 渐进式披露:先给模型最少必要信息,需要时再加载详细规则、文档、脚本或 SOP。
- 生产验收分离:让负责生成的 Agent 和负责验证的 Agent 分离,形成生成、检查、修复、再检查的闭环。
结语
AI 落地的核心挑战,正在从“让模型看起来更聪明”,转向“让模型在真实世界里稳定工作”。
Prompt 决定模型是否理解任务,Context 决定模型是否拿到信息,而 Harness 决定模型能否在长链路、可执行、低容错的真实场景中持续交付。
所以,同样的模型在不同产品里表现差距巨大,并不奇怪。
模型决定上限,Harness 决定落地。