接上工具,不等于搭好了 Harness

50 阅读9分钟

AI AGENT 工程范式进化史 • 第四站 • HARNESS ENGINEERING

Demo 里已经跑通,到了生产却不敢让它动手。

12 号桌点了一份 38 元的番茄炒蛋,备注写得很清楚:孩子吃,不要放葱。 菜端上来,葱花还是铺了一层。

第三站解决了信息问题:系统拿到了桌号、原始备注、出餐状态和餐厅的客诉规则,因此判断也没错——重做一份不放葱的,并从账单里免掉这道菜。

可真正难的地方,现在才开始。谁能改账单?重做指令发到哪个档口?原菜怎样记损耗?如果免单成功、后厨却没收到重做单,系统下一步应该做什么?


01 / 从上一站往前一步

Context 把信息递到手里,Harness 才让动作落到店里。

上一站我们关心的是:12 号桌说的“刚才那份”到底是哪道菜,原备注是什么,餐厅此刻执行哪条客诉规则。信息装配正确,Agent 才能做出靠谱判断。

但“知道该重做”与“真的完成重做”之间,还隔着收银系统、后厨出餐屏、库存、跑菜员和经理审批。Context 决定它此刻看见什么;Harness 决定它能在哪里、拿什么、按什么规矩行动。


02 / 先看真实现场

一句“重做并免单”,要穿过四套系统。

在演示环境里,我们可以做一个叫 handle_complaint 的按钮,点击以后直接返回成功。但餐馆里没有这样一只万能按钮。一个决定至少要拆成四个真实动作。

系统需要完成的动作最怕出现的情况
收银 POS从 12 号桌账单免去 38 元重复免单或越权改价
后厨出餐屏 KDS向热菜档重新发单,并保留“不放葱”备注丢失或重复出菜
库存 / 损耗记录原菜退回或报损账面库存与实际不一致
跑菜任务撤回原菜,追踪新菜送达旧任务未关,新菜无人送

Demo 证明的是“模型会选工具”;生产要证明的是:多个真实动作能在正确权限里完成,结果可以核对,中途失败也不会把现场越弄越乱。


03 / Harness 到底搭在哪里

它不是工具架,而是 Agent 的整套工作现场。

2026 年 2 月,Mitchell Hashimoto 与 OpenAI 的文章先后使用 Harness Engineering 这一说法,讨论如何把说明、工具、运行环境、验证、隔离和可观察性一起围在 Agent 周围。这个词还不是一套封闭的行业标准,但它指出了一个很实用的工程边界:模型外面那层决定行动能否可靠发生的系统。

对这家餐馆来说,Harness 不是再给 Agent 多接几个接口,而是把六件事同时说清楚:工具怎么调用、任务在哪里运行、用谁的身份、能做多大动作、怎样确认完成、出错后停在哪里。

  • 工具契约: 字段、前置条件、回执和错误类型都能被机器判断;
  • 受控环境: 每桌任务的状态、凭证、超时和可访问系统彼此隔离;
  • 身份与权限: 查单、改价、免单、作废和付款分别授权;
  • 执行记录: 一次处理经过哪些系统、拿到什么回执,可以沿同一任务追踪;
  • 结果验证: 不只看接口返回,还要核对 POS、KDS 与桌台状态;
  • 失败恢复: 重复调用、部分成功和人工接管都有明确出口。

04 / 先别造万能按钮

一个好工具,应该窄到不容易做错。

如果工具只叫“处理客诉”,Agent 很难知道它究竟改了什么。更稳妥的做法,是把真实动作拆成边界清楚的小工具,例如 void_bill_item、refire_dish、record_waste 和 close_runner_task。

{
  "table_id": "T12",
  "order_item_id": "ITEM-07",
  "instruction": "不要放葱",
  "reason": "制作未遵循原备注",
  "idempotency_key": "T12-ITEM07-REFIRE-01"
} 

idempotency_key 相当于这次重做的唯一号码。网络超时后再次提交,后厨系统应该返回同一张重做单,而不是让厨师再炒一份。工具输出也不能只有 success,还要返回新单号、档口、预计时间和最终状态,系统才能继续核对。

工具越像一句模糊指令,风险越容易藏在里面;工具越像一份可检查的动作契约,Agent 才越知道自己做成了什么。


05 / 把钥匙一把把分开

会查单,不等于能改账;能免小单,不等于能改所有账。

餐馆不会因为一个服务员会用收银机,就把后台最高权限交给他。Agent 也需要按动作分级,而不是一次拿到整套管理员账号。

动作系统默认示例放行规则
查询桌台与菜品状态只读仅当前门店、当前班次
发送重做单允许必须引用原菜品和原备注
免去不超过 50 元的单品限额执行客诉证据完整并留下回执
整桌免单、现金退款或作废付款暂停经理人工确认

人工审批不是“Agent 失败了”。当动作金额更高、不可逆,或者现场证据互相矛盾时,停下来请经理确认,本来就应该是流程的一部分。


06 / 真正棘手的不是报错

最危险的是:一半已经做成。

假设 POS 已经从账单免掉 38 元,KDS 却在发送重做单时超时。此时不能把整套流程从头再跑一遍,否则账单可能再次减 38 元;也不能把任务简单标成失败,因为顾客的账单确实已经改变。

可靠的 Harness 会把每一步的状态和回执留住:先确认 POS 的免单凭证,再查询 KDS 是否已经生成重做单。没有就补发;已经有就继续追踪。恢复不是回到开头,而是从最后一个已确认事实继续。

失败不可怕,状态不明才可怕。Harness 的价值,是让系统知道哪里完成了、哪里没完成、下一步允许做什么。


07 / 给动作留下可查的现场

一句“处理好了”,必须能对得上四张回执。

对话里只留下最终回复远远不够。一次客诉处理至少要串起:使用了哪版规则、以什么身份执行、调用了哪些工具、每个系统返回什么、顾客桌台最终处于什么状态。

这里要记录的是业务依据、工具事件和结果状态,不是把模型的隐含推理全部倾倒出来。手机号、支付信息等敏感字段也要脱敏。可观察性不是“什么都存”,而是留下定位、恢复、审计真正需要的证据。


08 / 把 12 号桌真正处理完

顾客看到的是一份新菜,系统背后完成的是一次受控执行。

  1. 确认原菜仍在桌台账单中,且此前没有处理过同一客诉;
  2. 用客诉事件号生成稳定的免单键与重做键;
  3. 从 POS 免去该单品 38 元,并保存凭证;
  4. 向热菜档发送带原备注的重做单,确认 KDS 返回新单号;
  5. 记录原菜损耗,关闭旧跑菜任务,创建新菜送达任务;
  6. 核对账单金额、新菜状态与桌台任务,再向服务员报告处理结果。

如果任何一步无法确认,系统停在可恢复的位置,并把已经完成的动作和待处理事项一起交给人,而不是只说一句“执行失败”。


09 / 上线前,先故意把它弄坏

只测顺利完成,永远测不出 Harness。

在真正开放自动执行前,团队应该主动模拟:收银权限过期、重做单重复提交、KDS 超时、菜品已经售罄、经理拒绝审批、POS 与桌台状态不一致。

可以先让 Agent 只查状态、生成处理草稿;等日志和验证稳定后,再开放低风险、可逆、容易核对的动作。每扩大一层权限,都要同时补上失败出口。

最小可用 Harness:
一组边界清楚的工具、一套最小权限、一次可追踪的执行、一个结果校验,以及一条失败后的安全出口。


10 / 下一站从哪里开始

它已经能看见错误,但还不会靠反馈把下一次做得更好。

餐馆现在能把决定安全地落到收银、后厨和跑菜现场,也能发现番茄炒蛋仍然带葱、出餐超时或顾客依旧不满意。可“发现问题”还不等于“知道下一轮该改什么”。

第四站只带走一句:
Harness 不是工具架,而是 Agent 真正工作的受控现场。下一站,我们让执行结果回到系统里,成为下一轮行动的依据。

它已经能发现问题,
下一轮为什么还会照旧重来?
因为留下执行结果,还不等于把结果变成有效反馈。

【进入第五站 · 没有反馈的 Loop,只是更贵的重试 →】

关于这个系列

《AI Agent 工程范式进化史》——跟着同一家餐馆连续升级,一站一站讲透 AI Agent 工程的演进:

Prompt → Chain → Context → Harness → Loop → Graph → 还会有的…


参考来源:
[1] Mitchell Hashimoto, My AI Adoption Journey, 2026-02-05。正文用它说明“Harness Engineering”这一称呼及“把重复错误转成说明或程序化验证”的原始表述。
[2] Ryan Lopopolo / OpenAI, Harness engineering: leveraging Codex in an agent-first world, 2026-02-11。正文用它说明工具、环境、知识组织、隔离运行、日志、指标和机器可执行约束共同支撑 Agent 工作。
口径说明:
两篇来源主要讨论编程 Agent。本文把相关工程原则映射到餐馆的收银、出餐、损耗和跑菜流程,是原创教学案例,不代表行业存在统一的 Harness 标准。12 号桌、38 元番茄炒蛋、50 元权限阈值、工具名和故障过程均为示意,不是公开实验或通用餐饮规则;正文没有引用准确率或效率提升数字。