Agent Harness Engine:LLM Agent をプロンプト遊びから工学システムへ

Agent はモデルとプロンプトだけではなく、コンテキスト、ツール、権限、サンドボックス、フィードバック、復旧から成る実行システムであるという工学的整理。

问题从哪里开始

很多人第一次做 Agent,注意力会自然放在模型和 prompt 上:换一个更强的模型,写一段更长的系统提示词,再接几个工具,好像就能得到一个稳定工作的智能体。

但真正跑过一段时间后,问题会变得很具体:

  • Agent 不知道项目里的约定,改出了风格不一致的代码。
  • Agent 调用了危险命令,差点删掉不该删的文件。
  • Agent 在长任务里越做越偏,最后给出一个“看起来完成了”的错误结果。
  • Agent 读取网页、邮件或文档时,把外部内容里的指令也当成了该执行的命令。

这些问题很容易被归因成“模型不够聪明”。但在工程上,更有价值的问法是:模型外面的运行环境是不是设计得太松了?

这就是 Agent Harness Engineering 想解决的问题。Agent 不是单独一个大模型,而是:

1
Agent = Model + Harness

模型负责推理和生成,Harness 负责把模型放进一个可执行、可约束、可观察、可恢复的工程环境里。换句话说,Harness Engine 是 Agent 的运行支架和控制系统。

Harness 到底负责什么

可以把 Harness 理解成所有“不属于模型权重本身”的部分。它不只是 prompt,也不只是工具调用框架,而是一组围绕模型工作的工程能力。

上下文

模型每次能看到什么,先看到什么,哪些内容必须进入上下文,哪些内容应该被压缩、裁剪或延迟加载,这些都不是模型自己决定的。

在代码 Agent 里,常见的上下文包括:

  • 系统提示词。
  • AGENTS.md、项目规范、代码风格说明。
  • 当前任务描述和历史对话。
  • 文件内容、命令输出、测试失败日志。
  • 工具说明、权限说明和外部资料。

上下文不是越多越好。塞得太多,模型会丢重点;给得太少,模型会瞎猜。Harness 的第一件事,就是把上下文变成一种工程资产,而不是临时复制粘贴。

工具

Agent 能否读文件、改文件、运行命令、打开浏览器、查文档、调用 API,本质上都由 Harness 提供。

工具设计会直接影响 Agent 的行为。一个含糊的工具名、过宽的参数 schema、互相重叠的工具集合,都会增加模型选错工具的概率。工具越多,不一定越强;很多时候,十个边界清楚的工具,比五十个互相重叠的工具更可靠。

更重要的是,工具描述本身也会进入模型上下文。也就是说,工具 schema 不只是开发体验问题,也是安全边界问题。一个外部 MCP server、浏览器插件或第三方工具,如果把不可信说明注入给模型,就可能在用户输入任务之前影响 Agent 的决策。

权限和沙箱

只要 Agent 能运行命令、访问文件或调用外部系统,就必须有权限边界。

好的 Harness 不会默认把所有能力一次性交给 Agent,而是根据任务分配最小权限。例如:

  • 读文档任务只给读取权限,不给写文件权限。
  • 总结邮件任务只给读取邮箱权限,不给发送邮件权限。
  • 本地代码验证可以在沙箱里跑,不直接污染用户机器。
  • 高风险命令需要人工确认或被 hook 拦截。

沙箱的意义不是让 Agent 更“聪明”,而是让 Agent 出错时伤害可控。工程系统不能假设模型永远不犯错,只能设计成犯错时不会造成不可恢复的后果。

Hooks 和反馈循环

prompt 里写“请不要犯错”并不可靠。Harness 需要把一部分规则变成可执行的约束。

比如:

  • 修改代码后自动跑 typecheck。
  • 测试失败时把错误日志反馈回 Agent。
  • 提交前检查是否有被跳过的测试。
  • 阻止 rm -rf、强推、删除生产表这类危险动作。
  • 当 Agent 试图提前结束任务时,重新检查验收条件。

这类机制的关键是:成功时尽量安静,失败时给出足够清晰的信号。这样 Agent 不会被无用信息淹没,但一旦偏离目标,就能收到可操作的反馈。

每一次失败都应该沉淀成规则

Harness Engineering 最重要的心态,是把 Agent 的失败当作长期信号,而不是一次性事故。

如果 Agent 忘了项目使用 pnpm,而去运行 npm,那可以把包管理器约定写进 AGENTS.md。如果 Agent 经常在没有跑测试的情况下说完成了,那就把测试命令接进完成前检查。 如果 Agent 总是改动无关文件,那就要求它在编辑前先查看 git 状态,并在最终说明中列出 touched files。

但这并不意味着把所有想得到的规则都塞进去。规则也有成本。每一行规范都会占上下文,每一个 hook 都会增加运行时间,每一个权限弹窗都会打断流程。

更稳的做法是:

  1. 先让 Agent 真实工作。
  2. 记录它具体失败在哪里。
  3. 把高频或高风险失败沉淀成规则。
  4. 当模型能力或工作流变化后,再删除不再有价值的规则。

好的 Harness 不是越厚越好,而是每一层都能解释自己在防什么问题。

Harness 与 Loop Engineering 的关系

Loop Engineering 关注的是 Agent 怎么持续做事:观察、思考、行动、再观察,直到任务完成。

Harness Engineering 的范围更大。它不仅包含循环本身,还包含循环运行所需的环境:

  • Agent 在循环里能看到哪些上下文。
  • 每一步能调用哪些工具。
  • 失败信号如何回流。
  • 长任务如何压缩上下文或重启会话。
  • 多个子 Agent 如何分工。
  • 人类在什么节点介入确认。

如果说 loop 是 Agent 的工作节奏,Harness 就是让这个节奏能长期稳定运行的工程系统。

这也是为什么同一个模型,放在不同产品里表现差异会很大。底层模型可能相同,但工具、上下文、权限、沙箱、计划机制、恢复策略都不同,最后得到的 Agent 体验当然不同。

工程上怎么开始做

如果要在自己的项目里建设一个 Agent Harness,不需要一上来做复杂平台。可以从最小可用的几件事开始。

第一,写一份短的项目规则。不要写成长篇说明书,只保留真正会影响 Agent 行为的约定:包管理器、测试命令、禁止改动的目录、代码风格、完成标准。

第二,把验证命令接进工作流。只靠模型自评不够,至少要让 lint、typecheck、单元测试或构建命令成为完成任务前的反馈。

第三,给工具做边界。读和写分开,高风险操作需要确认,外部内容默认是不可信数据,不让它直接变成指令。

第四,保留失败日志。每次 Agent 出错,都记录触发场景、错误行为、应该新增的约束。不要靠感觉优化 prompt,要让真实失败驱动 Harness 演进。

第五,不急着平台化。多数团队的第一版 Harness,就是一份规则文件、几个脚本、几个 hook、一个清晰的权限策略。先让它解决真实问题,再决定是否抽象。

一个判断框架

当 Agent 出问题时,可以用下面这张表先定位问题:

现象 可能不是模型问题,而是
Agent 不知道项目约定 上下文注入不完整
Agent 乱选工具 工具命名、描述或 schema 不清楚
Agent 长任务跑偏 缺少计划、检查点和上下文压缩
Agent 说完成但结果坏了 没有自动验证和失败反馈
Agent 执行了危险动作 权限、沙箱和 hook 不够
Agent 被外部文本带偏 不可信内容隔离不足

这个框架比“换个模型试试”更有工程价值。模型升级当然重要,但能不能把能力稳定落到任务里,往往取决于 Harness。

小结

Agent Harness Engine 的核心不是做一个更华丽的 Agent 外壳,而是承认:大模型要进入真实工程,必须被放进一个有状态、有工具、有权限、有反馈、有恢复路径的运行系统。

未来模型会继续变强,但 Harness 不会消失。模型擅长的部分变了,Harness 负责的边界也会移动。旧的脚手架会被删掉,新的安全、协作、长期记忆和评估机制会长出来。

真正值得积累的,不是某一版 prompt,而是这套把失败变成规则、把规则变成系统、再让系统持续变轻的能力。

参考资料