第九章 为什么 Agent 不可能被完美约束

📅 2026/6/26 2:06:54
第九章 为什么 Agent 不可能被完美约束
第九章 为什么 Agent 不可能被完美约束第 8 章把验证闭环放在状态写入之前行动会产生候选结果但只有被证据约束、被状态承接、被失败恢复的结果才有资格进入下一轮。这个判断很容易推出一个更激进的愿望既然要拦住错误写入能不能把拦截点再往前推在 Agent 行动之前就判断它会不会出错、越界、泄露或破坏约束这就是“完美约束”的诱惑。它希望有一个足够强的防御器提前看穿所有未来路径安全就放行不安全就拒绝。这样一来工具白名单、权限审批、沙盒、审计、测试、人工确认似乎都只是这个总防御器的局部实现。问题恰恰在这里。工程上当然可以约束而且必须约束不能成立的是把这些约束升级成一个通用的事前判定器。验证闭环是运行时写屏障不是全知预言机。它能让错误更早暴露、责任更清楚、失败更可恢复却不能把一个开放的、可编程的、会调用工具的 Agent 变成完全可预言的对象。只要系统足够强能够写代码、解释文本、调用外部工具、构造中间状态并根据反馈修改策略它的行为就不再是一个简单配置项而是一段会在环境里展开的计算过程。完美防御器为什么不存在假设存在一个防御器Guard。它接收一个 Agent、一段上下文、一组工具和一个任务目标然后在运行前给出结论安全或者不安全。我们希望它对所有可能输入都正确不误杀任何安全行为也不放过任何危险行为。如果它能做到Agent 工程似乎就有了一个终极闸门所有行动先交给Guard通过才执行拒绝就停止。Agent 的危险性通常不是语法性质而是语义性质。语法性质看表面形式命令里有没有某个字符串工具名是不是在白名单里参数是否符合 schema。语义性质看运行后到底会发生什么它最终会不会泄露某个秘密会不会绕过限制会不会在某条分支上删除数据会不会构造出间接执行链会不会把一个错误总结写进后续状态。前者可以大量工程化后者一旦面向足够通用的程序就进入了不可判定区域。停机问题给出第一块边界不存在一个算法能对任意程序和任意输入都正确判断它最终会不会停机。这个结论看起来离 Agent 安全很远其实很近因为很多安全问题都可以把“停机”藏进去。构造一个程序先模拟另一个程序如果它停机就执行某个危险动作如果它不停机就永远不执行。判断这个程序会不会危险就等价于判断原程序会不会停机。如果存在完美安全判定器停机问题也会被顺手解决。矛盾就在这里。Rice 定理把这个边界推得更远。它说对于图灵完备程序只要你关心的是一个非平凡的语义性质就不存在通用判定器。所谓非平凡就是不是所有程序都满足也不是所有程序都不满足。所谓语义性质就是只关心程序做了什么而不关心它表面怎么写。“是否会泄露秘密”“是否永远不会调用危险工具”“是否在所有对话历史下都保持合规”“是否最终会执行某类违规动作”这些正是 Agent 防御最关心的问题也正是 Rice 定理覆盖的问题。只要 Agent 足够通用完美事前判定就不是难而是不成立。很多直觉上的防御想法最后都会退回工程折中。你可以拦截危险字符串但危险可以通过变量拼接、编码、间接调用出现你可以禁止某个工具名但系统可能通过另一个工具产生等价副作用你可以审查当前 prompt但下一轮状态可能把问题改写成另一个形式你可以要求模型解释意图但解释本身仍然是生成文本不是外部事实。每一个局部防线都有效但没有哪一个能被升级成对所有未来行为的完备判定。规则也会变成输入完美防御器还有一个更工程化的困难Agent 不只是被规则约束它还会读取规则、解释规则并把规则变成下一步策略的一部分。这不是说 Agent 一定会恶意绕过系统。更常见的情况是目标、上下文、工具和反馈之间出现了意外组合。系统告诉它“不要直接执行危险命令”它可能改成先生成脚本、再让另一个工具运行脚本系统告诉它“高危动作要先解释意图”它可能给出一个局部上真实、整体上不充分的解释系统告诉它“测试通过才能完成”它可能选择一组太窄的测试把局部通过误当成整体成立。每一步单独看都未必荒唐连起来却可能越过设计者真正想守住的边界。这就是元层控制的难点。规则不是写在世界之外的铁板它会进入context成为模型推理材料的一部分。一个足够强的 Agent 会根据这些材料调整路径哪些工具可用哪些说法更容易被放行哪些动作需要拆成几步哪些证据足以让下一轮继续。你可以把某个字符串拦掉可以把某个工具禁掉可以要求某类动作必须解释原因这些都有效但它们解决的是局部入口不是所有未来组合。对角化给这件事提供了一个简洁的提醒只要被分析的对象能把分析结果纳入自己的行为就很难存在一个永远站在外部、永远不被对象反过来利用的判定器。放到 Agent 工程里不必把它讲成复杂的数学定理它对应的是一个朴素事实越强的系统越会把约束本身当成环境的一部分来计算。所以问题不只是“有没有坏输入”也不是“模型会不会故意作恶”。风险经常来自正常目标压力下的路径搜索。Agent 为了完成任务会自然寻找能推进目标的动作如果边界表达得不够精确它可能把“没有禁止”理解成“可以尝试”把“局部验证通过”理解成“整体成立”把“用户想要结果”理解成“可以牺牲某些过程约束”。完美约束想把这些路径事前全部列清楚但开放环境里的路径组合不会按清单展开。工程防御的真实形态完美约束不存在防御反而必须更工程化。成熟的 Agent 工程不追求一个全知的Guard而是主动放弃完美判定换取可操作的局部安全。它会限制表达能力减少系统落入不可判定区域的机会它会把工具面收窄让高危副作用必须经过明确边界它会把语义判断拆成运行时验证而不是幻想在执行前看透全部未来它会接受误报和漏报用多层机制降低风险而不是承诺零风险。工具 schema 和 allowlist 不是为了描述世界全部能力而是为了让行动空间变窄。权限审批不是为了证明动作一定安全而是在不可逆副作用前插入人类判断。沙盒不是为了知道程序会做什么而是为了即使不知道也限制它能影响什么。checkpoint 和 rollback 不是为了防止错误发生而是承认错误会发生并让错误不要变成不可恢复的历史。验证报告不是为了穷尽真理而是为了给下一轮提供可审计证据。Harness 不是全能防御器而是把这些局部约束组织成一个可运行、可观察、可回放的环境。“不能完美约束”最容易被误解成“只能放任”。事实正好相反。正因为完美约束不存在工程系统才必须分层约束。第一层限制能力不给任意工具、不给无限资源、不给未经隔离的执行环境。第二层限制路径高危动作要审批外部写入要有权限网络和文件系统要有边界。第三层限制提交没有证据不能写入状态没有验证不能声明完成没有可回放轨迹不能进入长期记忆。第四层保留恢复失败要能停止错误要能回退无法判定时要能外翻给人。Agent 工程里的安全不能只靠 prompt。Prompt 能表达偏好、规则和禁令但 prompt 仍然是上下文里的陈述。它可以影响模型选择路径却不能改变计算理论的边界也不能替代宿主层的工具声明、沙盒隔离、权限系统和运行时监控。把安全全部写进 prompt等于把约束交给被约束对象自己解释。对于一个会读上下文、会综合目标、会调用工具、会生成中间策略的系统这种约束太软最多是行为引导不是工程边界。Agent 不可能被完美约束并不是说它不可用而是说它不能被当作一个已经被完全证明安全的封闭物。它更像一个受控反应系统能力被限制行动被观察副作用被隔离结果被验证状态被审计失败被恢复人类在关键位置保留否决权。这个系统仍然可能出错但错误不应该轻易扩散它仍然可能越界但越界应该尽早被切断它仍然可能产生未知行为但未知不应该直接获得写入世界和写入历史的权利。工具给 Agent 行动边界状态让它跨轮连续Skill 让经验被复用MCP 让能力接入协议化loop 让它持续推进验证闭环决定哪些结果可以进入下一轮但边界、验证和恢复都不能被理解成完美控制它们只是让不可完全预言的行动保持在可承受范围内。Agent 工程不是寻找一个能彻底消灭风险的总判定器而是在承认可计算性边界之后设计一套分层、可观测、可恢复、可否决的约束系统。完美约束试图在行动发生前看穿所有未来工程约束承认未来不能被完全看穿于是把能力、路径、提交和恢复一层层组织起来。Agent 之所以是一种新的软件系统正在于它逼迫我们从“证明程序永远正确”的幻想转向“治理一个会持续行动、持续生成、持续改写自身状态的系统”。