物理执行:没有撤销的安全

10 分钟读完

S22
运维 · 安全、对齐与智能体安全

运行一台会动手的智能体:当「撤销」不存在时的安全。

你那套智能体安全体系里的每一项控制,都在悄悄假设动作可以被收回——重试一次、回滚、恢复快照、向客户道个歉。而一台在驱动注射泵、位移电机或机械臂的智能体,一样也没有;这个后果是结构性的,不是程度上的:强制执行必须下沉到模型之下、下沉到一个它无法与之争辩的层里,而人的决定必须提前——从批准一个步骤,变成授权一个包络。把这两步挪对,剩下的那套打法依然管用。

STEP 1

先点名那四个不再成立的假设。

值得把「变了什么」说精确,因为「物理世界更危险」这句话没法执行,它只会让团队在一个真正问题不在那儿的循环上,再拧一个审批弹窗上去。

  • 可逆性没了。分注出去的试剂就被消耗了,切下去的就是切了,混好的批次就是混了。一整族控制手段——先空跑、快照与恢复、补偿事务——要么根本不存在,要么只以「换一种介质做的彩排」形式存在。撤销与可逆性那套手册白送给软件智能体的一切,在这里都得重新挣一遍。
  • 幂等性没了。「超时就重试」是智能体基础设施里最常见的一条韧性模式,而它对着一台执行器是主动危险的:命令可能已经执行、只是确认丢了,于是这次重试把轴移动了两遍。可对照幂等与重试——同一套纪律,只是失败模式从一笔重复扣款升级成了一次碰撞。
  • 沙箱没了。没有哪个容器装得下一台离心机。沙箱之所以有效,是因为你能给智能体一个行为像真世界的假世界;仿真在这里确实有用(STEP 4),但它是物理的一个模型,不是物理本身。
  • 观测既滞后又残缺。软件智能体读到的是精确状态。物理智能体读到的是被采样的、带噪的、偶尔干脆错的传感器,而且对真正要紧的那件事——那支放错了架位的管子——只字不提。请按「智能体会对世界产生自信的误判」来做规划。

有一个假设完好无损地活了下来,而且值得倚重:爆炸半径受限于可及范围。一台拿着被窃令牌的软件智能体,能碰到那个令牌所能碰到的一切,且不分地点。一条机械臂只能碰到它工作单元之内的东西。物理约束是唯一一种没法靠更聪明的提示词绕过去的隔离,所以工作单元的布局本身就是一项安全控制。

STEP 2

把限值放进驱动,并且不要把驱动限值当成安全功能。

目前浮现出来的那套设计——Anthropic 的 Model Hardware Standard 研究预览把它挑明了——是:设备应当自我描述并自行强制自己的限值,从而不管由哪个模型来驱动,这个包络都成立。这个架构是对的。设备知道自己的行程范围、最大负载、温度上限;把这些编码进驱动,意味着一台被说服接受了坏计划的智能体,依然执行不了其中越界的那部分,也意味着同样的限值对另一个模型、另一个编排器、或一个赶时间的人手写的脚本一样生效。

但它并不是机械安全意义上的「安全功能」,而把这两层在脑子里混着跑,正是一个项目最终得到一项「看起来很像样、却什么也拦不住」的控制的方式。这两层干的是不同的活:

  • 驱动强制的限值是命令路径上的普通软件。它非常擅长阻止一条坏指令变成一次坏运动,同时它也承受普通软件的一切失败:它会崩、会有 bug、会被在它之下直接对话硬件的东西绕过去,而且它的好坏,取决于有人往设备描述里敲进去的那些数字。
  • 经评级的防护功能——联锁、光幕、安全评级的速度与间距监控、急停回路——是按功能安全要求评估的,通常被要求达到某个性能等级并采用冗余架构,而且它的设计前提就是「控制系统本身已经失效」。ISO 10218 的 2025 年修订版(第 1、2 部分,取代 2011 年版,并把原属 ISO/TS 15066 的协作应用内容吸收进来)把这些功能安全要求写得更加显式,并在旁边补上了网络安全要求。

把这两层都写进设计、标明哪一层是哪一层,并且永远不要让一份文档声称模型「不可能」越过某个限值——如果拦着它的唯一东西,是那条由模型自己的工具链加载起来的代码。

STEP 3

授权的是包络,不是步骤。

通常那种做法的人在回路——把拟执行的动作弹出来、等一次点击——碰上一台以机器节奏跑 40 步流程的设备就活不下来。你没法在一条命令和一个伺服之间塞进一个人;硬塞的团队最后要么得到一个条件反射式全部点「通过」的操作员,要么得到一次比手工还慢的运行。

所以要把这个决定提前,并且把它放大。运行开始之前,由一位具名的人授权一个有界的包络:哪些设备、哪些耗材、哪些参数区间、多长时长、当出现超规时智能体可以自行做什么、以及它必须为什么停下。在包络之内智能体无人值守地跑;包络的边界是一次硬停,不是一次弹窗。这与人在回路自主等级是同一个结构,只是粒度被延迟逼着从「动作」挪到了「会话」。

包络必须是机器可检的,否则它只是一份备忘录。「不得超过 60 °C」属于运行配置里的一个由执行器强制的数字,而不属于提示词里那句请模型尊重一下的话。任何你不愿意写成一个上下界的东西,都是一个需要有人在场的步骤——而这是一个正当的答案:把它写成「有人值守的步骤」,而不是寄希望于运气。

STEP 4

先在仿真里彩排,再用便宜的材料彩排。

你依然需要一套预发布环境,只是它的建法不同(面向智能体的预发布环境)。三档,而跳过中间那档是常见的错误:

  • 仿真设备。能接受完整命令面、并返回像样遥测的驱动。这一档以零材料成本抓住绝大多数智能体错误——单位搞错、轴搞错、上一步还没完成就发出了下一步、计划里假设了一件它并没有的工具——你的回归套件应该住在这里。
  • 真硬件,不值钱的材料。用水代替试剂、用空白板、用泡沫块代替零件。这一档找出仿真找不出的东西:只在真实运动下才出现的时序、会打滑的夹爪、并不在模型以为的位置上的盖子、以及在全伸展时会刮到的那根线缆。
  • 生产环境,先有人值守,再无人值守。在真材料上的有人值守运行就是验收测试,而晋级标准应当是「干净运行的次数」,不是一次演示。

仿真既值回票价,也在一个特定方向上撒谎:它是用与智能体相同的那批假设搭起来的,所以它验证的是计划,不是世界。任何关于物理输入之变异的事情——一个表现不一样的批次、一个超差的部件、一位把架子装反了的操作员——在进到第二档之前都是不可见的。

STEP 5

逐台设备定义安全状态,并且把停机权留在软件路径之外。

「急停开关」在这里是好几种不同机制共用的一个词,而有用的纪律是:为每一台设备写下「停下来」到底意味着什么。在运动中给机械臂断电,可能会把负载摔下去。给加热器断电可能恰好正确,也可能毁掉一次本来可以暂停的八小时运行。一台在转移途中停住的泵,会把液体留在某个地方。不存在通用的安全状态;只有逐台设备的答案,而且必须有人在运行之前决定它,不是在事故当中。

三条容易说清、却经常缺席的要求:

  • 物理停机不依赖智能体技术栈。急停是一条硬件回路。如果让工作单元停下来的唯一办法,是一次要穿过那个此刻已经卡死的编排器的 API 调用,那你手上就没有一次停机,只有一个请求。急停开关那套纪律照样适用,只是要加一句:最后一道手段必须是墙上的一个按钮。
  • 失联意味着停止,不是继续。给每台设备一个看门狗:n 秒内收不到控制器心跳,它就自行进入自己定义好的安全状态。一份在智能体已经崩溃之后仍在继续执行的排队命令列表,是两头最坏的组合——自主的动作,加上没有人在看。
  • 恢复是一个决定,不是默认行为。任何一次停机之后,在被观测到之前,物理状态都是未知的。从你以为自己所在的那一步接着往下跑,正是一次本可挽回的运行变成一场撞车的方式。要么从传感器重新确立状态,要么要求由人来确认,然后再继续(优雅降级与回退)。
STEP 6

量停机次数与出包络次数,别量任务成功率。

最先被做出来的那块看板——完成了多少流程、省下多少小时、相对人工的吞吐提升——恰恰最说明不了这个项目能不能安全地扩大。真正要紧的是那些没人主动要的数字:

  • 每次运行的非计划停机数,按原因拆开:包络越界被拦下、看门狗触发、人工介入、设备故障。这个比率在下降,是「自主范围应当放宽」的唯一诚实证据。
  • 在包络之外结束的运行数,包括那些结果照样很好的。一次未获授权的动作带来一个好结果,那是一次险肇事故;而险肇事故是你能拿到的唯一一批便宜数据。
  • 到物理停止为止的时间,要实测,不要假设——从做出停机决定,到机器真的静止为止,包括那个得走到房间去的人所花的时间。
  • 失败运行消耗掉的材料与时间,这才是这次部署真实的单位经济学,也是扩产商业论证里通常缺掉的那个数字。

记录留存值得同等认真。一次物理运行在世界上留下的证据,比你的追踪保留期活得更久,所以运行记录——包络、授权人、设备固件与驱动版本、完整命令日志、传感器流,以及智能体当时被告知了什么——才是一次调查将会需要的那件产物(审计轨迹智能体事故响应)。并且要说清楚谁是在册操作者:机械与职业安全义务落在一个具名的人和一个机构身上,永远不落在模型身上,所以问责与角色在这里是前置条件,而不是后续事项。

先从最坏情况是「浪费材料」的设备做起,而不是最坏情况是「伤到人」的那些。先把包络仪表化,再去自动化流程;并且把第一次自动运行当成一次关于你那套控制的实验,而不是一次关于科学的实验——因为你真正要给它定价的失败,不是智能体做错一次事,而是一次看上去很像样、却悄悄跑出了包络的运行,产出了一个你随后相信了的结果。

延伸:部署安全检查清单是本页所扩展的那道上线前闸门,修复智能体的副作用讲当副作用没法靠脚本修复时的收拾纪律,保险与责任讲出事时由谁承担代价。