资源推荐
harness-engineering
harness-engineering

AI Agent 老是出错?不是模型太笨,是你缺了这层设计

你有没有遇到过这种情况:

用 GPT-4o 或者 Claude 搭了个 Agent,测试的时候跑得挺好,但一到复杂任务就翻车——中途忘记前面做了什么、步骤跳过、自我评价说"完成了"但其实根本没完成。

你开始怀疑:是不是模型不够聪明?是不是提示词写得不够好?

都不是。

问题在于你少了一层东西:Harness(线束)


从提示词工程到 Harness 工程

AI 应用开发经历了三个阶段:

第一阶段:提示词工程(Prompt Engineering) 核心问题是"怎么问"。调整措辞、加上下文、改变语气——本质上是在优化一次对话。

问题是:它很脆弱,没有持久性,下一次对话就全忘了。

第二阶段:上下文工程(Context Engineering) 核心问题变成了"给模型看什么信息"。RAG、长上下文、记忆系统都属于这个范畴。

但它仍然是无状态的,你很难控制模型在多步骤任务中的行为。

第三阶段:Harness 工程(Harness Engineering) 核心问题是"如何结构化执行过程"。

Harness,直译是"线束",来自汽车工程——那条把电气系统捆在一起、确保每个组件按正确顺序运行的系统。

对 AI Agent 来说,Harness 就是那个把模型、工具、状态、验证捆在一起的执行骨架。

Agent 失败,不是因为模型太弱,而是因为系统没有定义边界。


七层架构:一个生产级 Agent 的骨架

一个能真正跑在生产环境的 Agent 系统,需要七层结构:

第一层:认知层(Cognition)

给模型的不是百科全书,是一份工作描述

系统提示要明确三件事:

  • 这个 Agent 的角色是什么
  • 成功的标准是什么
  • 禁止做什么

同时,每次执行的任务简报要动态生成,把模型的注意力锁定在当前步骤,而不是让它自由联想。

第二层:工具层(Tools)

工具调用不能直接把原始输出塞给模型,中间需要三道处理

  1. 排序:用相似度或 BM25 评分,把最相关的结果排前面
  2. 去重:删掉重复内容
  3. 截断:硬上限截断,防止工具输出把上下文撑爆

这一层相当于工具和模型之间的适配器,原始数据进来,干净数据出去。

第三层:契约与接口层(Contracts & Interfaces)

模型说话用概率,系统必须用类型。

每一个系统边界——模型输入、模型输出、工具调用——都要有严格的 JSON Schema

数据跨边界之前,先做验证。这样能捕获那些"看起来正确但结构已经漂移"的沉默故障,比方说模型输出了个字符串,但系统期待的是数组。

第四层:编排层(Orchestration)

Agent 的执行流程不能让模型自由决定,要用有向无环图(DAG)或状态机来约束。

比如研究任务的标准流程:

规划 → 收集 → 草稿 → 验证

模型可以建议下一步做什么,但系统决定哪些动作被允许执行。非法的状态转移,直接拦截。

第五层:记忆与状态层(Memory & State)

状态必须显式存在于上下文窗口之外

分两层管理:

  • 工作记忆:当前步骤需要的上下文,存在内存里
  • 持久化状态:用结构化文件(比如 state.json)追踪所有待办、进行中、已完成的子任务

这样,就算上下文被清空、Agent 重启,也能从中断的地方继续跑。

第六层:评估与观察层(Evaluation & Observation)

验证不能只靠一种方式,要用异构检查

  • 规则检查:JSON Schema 验证结构
  • 工具执行:真正跑代码、跑测试,看有没有报错
  • LLM 评判:只用于主观判断,比如文风是否合适

重要的是,不要用同一个模型既生成内容又评判内容。

第七层:约束与恢复层(Constraints & Recovery)

失败是必然的,问题是失败之后怎么办。

核心原则:幂等性

任何步骤失败后,都能安全重试,不会破坏整体状态,也不会把之前完成的工作重做一遍。

这一层建议最先实现,因为没有它,整个系统都脆弱。


四个你一定会踩的坑

坑一:上下文焦虑

当上下文用量超过 70% 时,模型开始变得"慌张"——跳过步骤、过早结束、输出质量下降。

不是模型变笨了,是它在帮你"省空间"。

解决方案:触发上下文重置

1. 把当前状态保存到磁盘(state.json)
2. 终止这个 LLM 实例
3. 用干净的上下文启动新实例
4. 读取 state.json,从中断处继续

就像给电脑重启一次,但进度不丢。

坑二:自我评分幻觉

让模型评价自己生成的内容,它会倾向于给自己打高分。

这不是模型在骗你,而是它没有足够的"距离感"来发现自己的问题。

解决方案:生成器和评估器分离

在任务开始前,让两者协商一份"成功定义":具体、可测试的验收标准。然后评估器基于干净的上下文独立运行,不继承生成器的前提假设。

更重要的是:评估器要真正执行验证——运行代码、跑浏览器测试——而不只是看内容像不像对的。

坑三:正确性幻象

当系统给出的约束互相矛盾时,模型不会报错,而是优化"看起来正确"——格式对了,但实质上没有解决问题。

解决方案:给模型客观反馈,而不是情感化评价

不要说"这个答案不够好",要给:

  • 编译错误的堆栈信息
  • 失败的测试用例
  • 具体的 Schema 不匹配报告

给模型问题,而不是给它"负面评价"。

坑四:记忆膨胀

长时间运行后,持久化状态文件会越来越大,充满重复和矛盾的条目,模型读起来越来越慢,也越来越容易犯错。

解决方案:定期整合(Consolidation)

系统空闲时,触发一个后台任务:

  1. 读取原始日志
  2. 去重、解决矛盾
  3. 压缩状态文件

实际案例:32K token 的状态文件,整合后压缩到 7K,信息没有丢失。


最小可行实现

不需要一次把七层全搭好。从这四件事开始:

组件作用
state.json把任务状态持久化到上下文窗口外
重试包装器让每个步骤都能安全重试
Schema 验证在边界处捕获结构漂移
工具输出截断防止上下文被撑爆

这四件事能解决 80% 的 Agent 不稳定问题。


为什么这个视角重要

大多数人遇到 Agent 问题,第一反应是换个更大的模型,或者改提示词。

但真正的瓶颈往往不在模型,而在系统。

Harness 工程的核心思想是:让模型做它擅长的事(推理和生成),让系统做系统该做的事(约束、验证、恢复)

模型和系统各司其职,Agent 才能真正稳定地运行在生产环境里。


如果你正在构建 AI Agent,不妨对照这七层检查一下:你的系统缺了哪几层?