线束工程:让智能体真正完成工作的七层环境架构

山止川行AI 前沿📡 觉醒AI2026-09-201075 阅读💛 115 收藏

你的智能体失败了。

你打开提示词,加了一条规则。

它换了个方式失败。你又加一条规则。

三周后,你的系统提示词成了一篇 900 词的「疤痕组织」,你换过两次模型,而智能体依然无法独立完成一个两小时的任务。

那些规则里的大多数,从来就不是解药。因为那些失败里的大多数,从来就不是推理能力的锅。

提示词是你唯一看得见的层,于是它成了你唯一会去改的层。

而真正的缺陷在别处:智能体能看见什么、被允许碰什么、记住了什么、什么才算完成。

那一层有个名字,叫线束(harness)

线束工程,就是构建那套能把模型智能转化为可信任工作的环境的实践。

提示词改变一次运行。

线束改变之后的每一次运行。

第一部分:先诊断,再打补丁

先给失败命名。几乎每种失败都落在六个桶里:

图片

表面现象真正缺失的
改错了文件,漏掉了对的那个上下文
在错误的位置跑了正确的命令工具网关
忘了四十分钟前做的决定持久状态
什么都没跑就宣布成功证据
部署了本该由人批准的东西策略
一模一样的失败调用重试了十一次恢复机制

这张表里没有一条写着「模型不够聪明」。

把更强的模型扔进同一个坏掉的环境,你只会得到一个更雄辩地犯同样错误的模型。

没有结构的能力,只是失败得更流利而已。

第二部分:模型只是一个组件

模型会推理、比较、选择。

而智能体要的是「运营」:找到重点、选对工具、真实改变什么、追踪变化、遵守边界、检查结果、错了能回退。

图片

模型是发动机。线束是车身的其余部分。

一台强引擎如果不装底盘,它不是一辆快车,是一个危险品。

线束并不能消除模型的不确定性——没什么能做到这一点。它做的是把不确定性装进一个能观察它、验证它、并把它拉回来的系统里。

七层结构各司其职,每层关掉上面表格里的一种失败。

第三层契约:把愿望编译成合同

大多数智能体任务始于一个愿望:

「把退款积压清掉。」

两个人之间共享上下文时这没问题。但对自主执行来说毫无用处:没有成功的定义,也没有「过头」的定义。

让智能体动手之前,先把意图编译成一份契约:

图片

objective: 清理超过 7 天的退款积压

scope:
  - services/refunds
  - 退款分析事件

constraints:
  - 不碰支付服务商客户端
  - 不做 schema 变更

acceptance:
  - 本地回放中队列 p95 年龄低于 48 小时
  - 退款回归测试套件全绿
  - 端到端追踪一笔退款

approval_required:
  - 任何生产写入
  - 任何面向客户的消息

一个小文件,一个完全不同的问题。

没有它,智能体优化的是「看起来很忙」。有了它,智能体优化的是可检验的目标。

契约也是唯一诚实的失败方式。如果成功从未被定义,「做完了」就只是一种情绪。

第四层上下文:给地图,别给说明书

把整个代码库、全部文档和完整历史塞进上下文窗口,不叫上下文工程,叫洪水灌溉。

图片

那条真正要紧的一行字,依然淹没在四百条不要紧的里面。

给一张地图,让智能体按需拉取细节:

## 项目地图
退款规则      -> docs/refunds.md
服务代码      -> services/refunds/
分析事件      -> packages/events/
测试命令      -> docs/testing.md
发布规则      -> docs/release.md

任务,然后地图,然后子系统,然后具体文件,然后局部规则。

上下文应该因为任务需要而扩张,而不是因为数据存在而扩张。

你优化的不是上下文总量,而是每 token 的信号密度

第五层工具:要网关,不要工具堆

二十个工具不是二十种能力,而是二十种出错方式,外加每一步的选择难题。

图片

每个工具都该有一份契约,像一个 API 端点:

TOOL: edit_file
inputs:        path, patch
preconditions: 路径存在
               路径在工作区内
               路径不是生成代码
success:       补丁已应用,返回 diff
failure:       不做部分写入,返回结构化错误
risk class:    可回退

然后在所有工具前面放一个网关。

它负责校验参数、隐藏无关工具、限制路径和域名、设置超时、让重试幂等,并且返回证据而不是「成功」这个词。

真正要紧的职责分离:

  • 模型提出意图
  • 网关授权动作
  • 工具改变环境
  • 传感器报告结果

模型有发言权,但没有最终拍板权。

第六层记忆:从事务日志到状态

一份对话记录不是记忆,它是事件日志。

作为执行基底很糟糕:关键的那行和随手一提的那行,长得一模一样。

图片

把日志编译成四个桶,从这四个桶上跑任务:

facts:
  - 退款资格判定在 services/refunds/policy.ts
  - 分析管道会丢弃超过 4KB 的事件

decisions:
  - 复用现有资格检查
  - 原因:第二份事实来源曾引发上次事故

progress:
  done:    [按账龄拆分队列]
  blocked: [预演环境回放需要新数据集]
  left:    [部分退款的回归测试]

lessons:
  - 测试运行器需要 TEST_DB_URL,否则会静默通过

原始日志留着审计用。执行从编译后的状态出发。

这也是获得「可恢复智能体」的方法:

一个死在第 14 步的运行,从状态重启,而不是从一段没人想重读的对话重启。

把三个关注点物理分离:大脑做规划,双手在沙箱里执行,历史活过上下文窗口。分离之后,你可以换掉任何一个而不重建另外两个。

第七层策略:红线不靠模型自觉

有些规则绝不能依赖模型「记得」:

  • 永远不在没有批准的情况下发布
  • 永远不写工作区之外
  • 永远不暴露凭据
  • 永远不超出花费上限
  • 永远不在测试没跑的情况下标记通过

这些不是指令。指令只是建议。

这是策略,策略属于代码,由网关强制执行。

图片

按后果分级:

读取、搜索、检查:自动放行。

可回退变更:自动放行,但留痕。

外部影响(发送、部署、花钱):显式批准。

不可逆或敏感(删数据、轮换密钥):硬门禁,或干脆不暴露。

自主不是没有限制。

自主是在真正被强制执行的边界之内,跑出速度。

第八层完成:证据,不是声明

「任务完成」不是一种状态,它是又一个 token 预测。

图片

完成是环境的属性,只有环境能授予它:

声明证据
「bug 修好了」那个失败的测试现在通过了
「流程没问题」一个真实会话完整走通了它
「迁移是安全的」演练和回滚都通过
「数字是对的」输出与源数据对得上
「任务完成了」每条验收标准都通过

最便宜的确定性检查优先:语法、类型、聚焦测试、集成,然后才是判断力,最后是人。

永远不要在编译器、schema、校验和或一条 SQL 查询能回答问题的地方,花一次模型调用。

模糊性问题交给模型。管道问题交给代码。

验证是一种攻击

让同一个智能体在同一个上下文里自查,它会重新推导自己的假设。

那不叫验证,叫信心回路。

图片

把目标拆开:工人构建最强候选方案,验证者尽力搞坏它。

给验证者一份拒绝评分标准、产物、契约和全新上下文。

还要给它「拒绝但不必修复」的权利。

最后这条很关键。一个必须顺手修复的验证者,会悄悄把标准降低到自己会修的水平。

第九层恢复:对症下药

默认恢复策略通常是:什么东西坏了,再跑一遍。

那不叫恢复,那是一台带 API 账单的老虎机。

图片

先分类,再响应:

工具超时          -> 退避后重试
参数非法          -> 修复调用
上下文缺失        -> 检索特定来源
测试失败          -> 检查具体行为
权限拒绝          -> 请求批准或走安全路径
约束互相矛盾      -> 上报人工
同样的失败原样复发 -> 停

底层规则:每次重试必须至少改变一个相关条件。

否则你是在花钱复现一个已知结果。

每个循环都要有预算:最大尝试次数、最长耗时、最大花费、最大破坏范围,以及一个升级触发器。

可靠的智能体知道怎么继续。

优秀的智能体知道什么时候继续下去已经不理性了。

第三部分之后:让运行可读

一个干净的回答可以藏着一个丑陋的过程。

智能体可能读错了数据、忽略了一条失败的命令、把外部 API 调了两次、烧掉十倍预算,然后碰巧对一个下周就不再成立的理由给出正确结果。

你要的是一条能让运行可复现的轨迹:

09:14  契约创建
09:15  上下文加载: docs/refunds.md
09:17  编辑 services/refunds/queue.ts
09:18  聚焦测试失败: 部分退款重复计数
09:21  修复已应用
09:22  聚焦测试通过
09:24  集成套件通过
09:25  部署被阻断: 需要批准

记录状态迁移、上下文来源、工具输入输出、验证结果、重试原因、批准、成本、延迟。

这不是监控,这是「在第 14 步重启」和「从零重启」的区别。

交付收据,不是对话

没人会审查四百轮智能体 chatter。一次运行结束时,编译出这样一张表:

字段
目标清理超过 7 天的退款积压
变更队列拆分逻辑,一个回归测试
已验证lint、单元、退款集成套件
未验证生产支付服务商、旧移动客户端
决策保留现有资格检查作为唯一事实来源
风险预演回放用的是三周前的数据集
待批准部署到预演环境

收据不是模型说了什么的摘要。

它是系统能证明什么的摘要。

最好的交接从来不是「给你看对话」,而是「给你看状态、证据和未解决的风险」。

飞轮,然后是修剪

弱队修坏掉的产出。强队修让产出坏掉的那个东西。

图片

每次失败后跑一遍诊断:

契约是否含糊?上下文是否不可见?是否暴露了错误的工具?是否缺了前置条件?结果是否无法验证?策略是否活在提示词里?恢复是否太粗?轨迹是否太薄?

然后沿着这架梯子往下沉淀教训:

解释 → 检查清单 → 模板 → 自动化检查 → 强制策略

「记得用格式化工具」变成一个自动运行的格式化工具。

「不要跨层 import」变成一个架构测试。

提示词承载判断力,线束承载不变量。

修正一个答案,帮到一次运行。修正一个线束,帮到之后的每一次运行。

然后删掉一半

线束会腐烂,没人写这部分。

你去年为绕过上下文限制搭的便道,现在挡着更好的策略。

某个糟糕一周后加的重试规则,现在给每次调用平添四秒延迟,而那个故障三月起就没再出现过。

把线束组件当生产代码对待,衡量它们是否还挣得回成本。对每个路由器、评估器、记忆层和重试规则问四个问题:

  • 它防止哪种失败?
  • 那种失败现在还发生吗?
  • 它增加了多少延迟和复杂度?
  • 删掉它会坏什么?

最好的线束不是最大的那个。

它是最小的、能可靠弥合「意图」与「证据」之间鸿沟的系统。

为删除而构建。

构建顺序

你不需要一个编排平台。你需要一次加一层,每层都加在你真实见过的失败之后。

  1. 一个有边界的任务:目标、范围、约束、验收。
  2. 一个可读的环境:地图、命令、局部规则、依赖。
  3. 受控的动作:类型化工具、校验、路径限制、结构化结果。
  4. 持久的执行:显式状态、检查点、决策、教训。
  5. 证据:确定性检查、对抗性验证、收据。
  6. 恢复与学习:失败分类、有限重试、升级、线束更新。

不要因为一个提示词偶尔需要澄清就上多智能体架构。

复杂度是由观察到的失败挣来的,不是提前预支的。

规格表

授予真实自主权之前,把这张表填满:

  1. 契约:目标、范围、约束、验收证据
  2. 上下文:常驻地图、检索来源、新鲜度规则
  3. 工具:允许集、前置条件、副作用、超时
  4. 状态:事实、决策、进度、教训、检查点
  5. 策略:自动、需批准、禁止、预算上限
  6. 验证:确定性检查、对抗性检查、验收
  7. 恢复:失败分类、重试上限、升级、回滚
  8. 可观测性:轨迹事件、指标、最终收据

空着的字段,意味着智能体并不自主。

它正拿着你的凭据在即兴表演。

衡量对的东西

Token 数不是指标,「尝试过的任务数」也不是。单位是被接受的工作

被接受的产出
--------------------------------------------
    人工审查分钟数 + 单次运行成本

同时跟踪一次通过率、工具故障后的恢复率、重复失败率、每任务人工干预次数、以及无依据的完成声明数。

这能杀死一种特定幻觉:一个智能体可以看起来极其高效,同时在为人制造昂贵的审查工作。

活跃不等于产出。

什么时候不需要这些

不是每次模型调用都需要一个操作系统。

任务短、输出好扫一眼、失败便宜、没有外部状态改变、而且你在旁边看着——用普通提示词就好。

当工作跨工具或跨会话、环境在变、动作有后果、完成与否难以靠阅读判断、同样的失败反复出现、或审查成了瓶颈——那就构建线束。

范式转移

第一代 AI 产品围绕提示词构建。

下一代围绕环境构建。

问题不再是「怎么得到一个更好的回答」。

而是:怎么构建一个系统,让好的动作容易做、危险的动作被门禁拦住、失败看得见、完成可证明。

模型提供智能。线束提供结构。

可靠性住在后者里。

如果你的智能体总是散架,别再往提示词里堆形容词了。

去构建它成功所需的环境。

原文信息

作者:spectnfa(@spectnfa) 原文地址:

文章评论(0

暂无评论,快来抢沙发~