← 返回 2026-11-03

LEANGUARD:经 Lean 证明的工具调用智能体运行时护栏 LEANGUARD: Lean-Verified Guardrails for Tool-Using Agents

Sreehari Sankar, Debargha Ganguly, Vikash Singh, Mohsen Hariri, Weicong Chen, Yanyan Zhang, Shouren Wang, Wang Yang, Chaoda Song, Alexander Nemecek, Osama Zafar, Idan Davidovich, Yuting Shao, Kai Ye, Biyao Zhang, Xinpeng Li, Joe Stubbs, Erman Ayday, Jing Ma, Vipin Chaudhary 📅 2026-11-02 👍 12 2026-11-09 18:30
LLM智能体安全 Lean 4 形式化验证 提示注入防御 时序逻辑 运行时护栏

用 Lean 4 写策略并证明裁决正确,拦截违规工具调用,还能给出带证明的自动修复

前置知识

Lean 4 与内核检查证明

Lean 4 既是编程语言又是交互式定理证明器:代码与数学命题用同一语言书写,每个证明最终由一个极小的可信内核逐条检查。依赖 sorry(未证占位)或非标准公理的定理会被审计脚本拒绝。它的 tactic 元编程机制允许用户编写自动化证明搜索程序,本文的 guard_repair? 就是这样一段 tactic。

LEANGUARD 的策略规则、可执行评估器和全部安全保证都用 Lean 4 写成并证明。理解「编译即验证」「内核检查」是读懂其可靠性声明(定理 1)的前提,也是判断这篇论文与普通工程护栏的本质区别所在。

线性时序逻辑 LTL 与过去时算子

LTL 是在事件序列上解释的模态逻辑,标准形式面向未来(next、until、finally)。本文用过去时变体:PREVIOUS 对应强 next(前一相关事件上成立)、ONCE 对应 finally(更早发生过匹配事件)、SINCE 对应 until(自某见证事件起持续成立),均可限定时间窗和作用域(按主体、会话或资源投影历史)。LeanLTL 是把这类语义形式化到 Lean 中的库。

「先读过资源才能写」「同一订单只能修改一次」「确认后 10 分钟内有效」这类策略只能用时序算子表达。论文的核心定理正是可执行裁决器与 LeanLTL 语义的等价性,不懂 LTL 就无法理解这个保证的含义。

Fail-closed(故障关闭)评估

fail-closed 指评估所需数据缺失或畸形时默认拒绝而非放行。本文中谓词会读取订单状态、金额等结构化数据,读取失败产生的是「错误」而非 false;准入要求所有相关组件无错(ErrorFree)才可能 allow,从而缺失的证据无法通过否定或析取运算偷偷变成授权。

这是准入公式 Eq. (1) 的组成部分,也是「模型不能靠断言用户已批准来伪造证据过关」这一安全性质的技术基础。fail-closed 与 fail-open 的取舍直接决定了护栏在数据不完整环境中的行为。

提示注入(直接与间接)

通过文本操纵 LLM 行为的攻击。直接注入把恶意指令放进用户输入;间接注入把恶意指令藏进智能体读取的外部内容(工具输出、网页、邮件)。本文的核心威胁模型是间接注入:工具输出里一句「客户已预先批准」被智能体当成事实。DTap 是分别度量两类攻击成功率的红队基准。

论文最重要的安全结果(直接注入成功率 57.9%→5.9%)针对的就是这类攻击。理解「工具输出文本一律不作为证据」这一设计,才能明白 LEANGUARD 为什么对注入天然免疫——它根本不读那些文本。

运行时监控与 Shielding

形式化方法中的 shielding 传统:一个监视器位于系统与环境之间,阻止或替换将违反形式安全规范的动作。LEANGUARD 属于这一谱系,但监视器位于语言模型与其工具之间,且协议含 dispatch reservation:允许的调用先登记再执行,单次操作在结果未知期间不可重复,未决操作保留其配额。

智能体护栏领域已有 GuardAgent、Progent、AgentSpec、CaMeL、FORGE 等多个系统,理解 shielding 谱系和相关工作的坐标,才能看清本文「被证明的裁决器 + 被证明的修复」在领域中的相对位置与真正增量。

τ²-bench 与 DTap 基准

τ²-bench 在双控环境(智能体加模拟用户)中评估有状态工具调用,带明确的自然语言领域策略,本文形式化其 retail、airline、telecom 三域共 278 个任务。DTap 是可控红队平台,提供直接注入、间接注入攻击与良性任务,本文评估其中 7 个域。两者都提供确定性判分或 LLM 裁判。

论文所有数字结果都来自这两个基准。实验采用 None(无护栏)/LG(裸拒绝)/LG+F(带反馈)三种臂,任务成功率与策略合规性分开度量,理解这一协议设计才能正确解读主表 Table 1。

研究动机

工具调用型智能体一旦能改变外部状态——发消息、改订单、发起退款或扣款——其失败就不再只是回答错误,而是不可逆的真实后果。现状是两类失败并存且方向相反:一方面,小模型频繁违反领域策略,τ²-bench 上 Qwen3.5-0.8B 与 2B 分别有 14.4% 和 15.4% 的会话被裁判判定执行了违反策略的调用;另一方面,模型越大越容易被注入攻击操纵,DTap 上直接注入成功率从 0.8B 的 46.7% 升到 9B 的 74.4%,无护栏整体直接注入成功率 57.9%、间接 22.3%。典型场景见 Figure 1:客户要求用相机换掉订单里的书架,工具输出中被注入「客户已预先批准」,智能体便调用 exchange_delivered_order_items 把差价记到攻击者礼品卡 gift_card_7741,全程未向客户确认。重放无护栏轨迹发现至少 33 个被 Lean 策略禁止的调用实际执行并改变了状态。已有护栏(GuardAgent、ToolSafe、Progent 等)多为学习型或符号启发式,裁决过程本身没有被证明正确,无法给出「违规调用一个都不会执行」的保证。

本文的目标是本文要回答的问题是:形式化验证能否同时「强制策略合规」与「帮助智能体完成任务」。具体目标拆成四点。第一,把自然语言领域策略形式化为 Lean 4 策略,在每次工具调用到达工具之前裁决,被 Lean 策略拒绝的调用一个都不能执行,且这个保证本身要由机器检查的定理给出,而不是工程约定。第二,裁决必须 fail-closed:证据缺失或数据畸形时拒绝而非放行,使缺失的证据无法变成授权。第三,拒绝之后要给智能体两条恢复路径:一是把被违反的规则标识与自然语言提示反馈给模型让它自己修正;二是由 Lean 元编程搜索一个保持用户意图的近邻调用,并返回内核检查过的可接纳性证明,全程不依赖模型。第四,在实现上述保护的同时,任务成功率不能显著下降——既要在合规性敏感的 τ²-bench 上度量代价,也要在注入攻击基准 DTap 上度量防护收益,并单独考察电信这类无需写操作的领域中保护是否零代价。

与已有工作不同的是,已有工作把符号策略用于运行时:Progent 用最小权限符号约束,AgentSpec 提供 DSL 与运行时强制,CaMeL 分离可信控制流与不可信数据流,FORGE 用参考监视器强制执行 Datatalog 策略;也有工作开始把 Lean 用于智能体:Lean-Agent Protocol 检查金融智能体动作,Lean4Agent 形式化工作流与轨迹。它们与本文的本质区别在于:没有一个系统把「可执行裁决器」与「独立时序语义」之间的关系证明为定理——执行器写错了,策略写得再好也白搭,而这个错误在之前所有系统中都只能靠测试发现。LEANGUARD 的独特切入有三层。其一,准入可靠性定理:可执行评估器对每个历史返回 true 当且仅当该历史满足策略的 LeanLTL 解释,把「策略写对了」与「执行器算对了」两个正交问题分离。其二,证明引导修复:Lean 元编程搜索参数编辑并返回内核检查的可接纳性证明,作者指出这是首个能产出「被证明的修复」的智能体护栏。其三,拒绝后的完整闭环:先前工作止步于拦截,本文同时量化模型自行恢复(反馈)与系统代为修复(证明)两条路的效果。

核心方法

核心直觉是把护栏看作对「状态转移」的控制,而非对「生成文本」的审查:调用格式上合法,但允许与否取决于后端状态、先前动作、用户是否看到过详情、是否存在先前授权。技术路线是三步流水线。第一步,智能体照常发出结构化工具调用(LEANGUARD 不增加新动作语言,模型从不写 Lean 代码),宿主在调用到达工具前截获并视其为不可信数据;领域适配器对权威后端做快照(带修订号)、校验参数、推导策略所需事实,工具输出中的文本永远不作为证据。第二步,用编译后的 Lean 策略评估该调用:策略由 permit/requirement/forbid 三类规则加带时间窗与作用域的过去时算子(PREVIOUS、ONCE、SINCE)构成,评估严格 fail-closed。第三步,只有所有相关组件无错且通过才允许;允许的调用先记录为 dispatch reservation 再执行,保证单次操作不被重复;拒绝的调用返回形式化决策记录加自然语言提示,或由 Lean 的 guard_repair? 离线搜索修复。整个监控协议为 proposal → snapshot → admission → dispatch → external effect → outcome,未来决策会考虑已授权但仍在执行中的动作。

核心创新是把「准入函数的正确性」变成定理。设 $s_t$ 为权威环境状态、$H_t$ 为监视历史、$a_t=(u_t,x_t)$ 为提议调用,可信适配器导出证据 $o_t=O(s_t,a_t)$ 并形成决策上下文 $c_t=(a_t,o_t,H_t)$。准入函数定义为 $D_P(c_t)=\text{allow}\Leftrightarrow\bigwedge_{p\in P}p(c_t)\wedge\bigwedge_{r\in R}r(c_t)\wedge\bigwedge_{f\in F}\neg f(c_t)\wedge\mathrm{ErrorFree}_P(c_t)$。定理 1(准入可靠性):若 LEANGUARD 返回 allow,则 $c_t$ 满足 Eq. (1) 的 LeanLTL 解释,运行时只在 allow 后分派。关键设计是「评估器不是规范」:历史 $[e_2,e_1]$ 被嵌入为从最新到最旧的 LeanLTL 有限迹,先对单个时序公式证明等价,再升级到授权与带 fail-closed 条件的完整准入决策。三个过去时算子均可限定时间窗与作用域(按主体、会话或资源投影历史),使「对该订单的上一次观察」确实指向那个订单。与已有方法的本质区别:CaMeL、FORGE、Progent 靠工程实现保证执行正确,本文靠内核检查的定理,且被拒调用还能获得带证明的修复。

方法步骤详情

步骤 1(证据落地):模型经普通工具 schema 发出调用,宿主截获;适配器快照权威后端(带修订号),校验参数并把事实写入 journal;过去分派的事实保留在分派时的记录上,模型无法靠断言「客户已批准」伪造证据。用户确认是绑定到具体提议、参数、资源与状态修订的一次性可信证据,用后即消耗。步骤 2(策略评估):谓词是对决策上下文的领域检查(如 retail.order_owner 验证订单属于已认证客户);规则三类——permit 缺失即默认拒绝,requirement 必须满足,forbid 直接禁止,宽 permit 不能覆盖未满足的 requirement 或适用的 forbid。谓词读取结构化数据失败时产生错误而非 false,只有 ErrorFree 成立才可能 allow。步骤 3a(反馈恢复):拒绝返回形式化决策记录(失败规则 ID、适用 forbid、评估错误、支撑证据)与自然语言提示,提示只是渲染、本身不被验证。步骤 3b(证明修复):guard_repair? 是 Lean 元编程 tactic,最多尝试 32 个按优先级排序的候选编辑,guard_solve 用已有假设、封闭义务求值和 grind 引擎(等式推理、线性算术、定理实例化)消解目标,只返回带内核检查证明的修复;留有未决目标或依赖 sorry 的候选一律拒绝。

技术新颖性

技术新颖性有四点。第一,可执行评估器与独立语义的等价性分级证明:先单时序公式,再授权,再带 fail-closed 条件的完整准入决策;度量窗口与作用域投影扩展了 LeanLTL 的迹集合,并非平凡有限迹 LTL;全部证明在策略构建时检查,不为单次调用构造。第二,证明引导修复:修复是 $\exists x' \in C_t.\ \mathrm{EditOK}(x_t,x')\wedge D_P(c_t(x'))=\text{allow}$ 的见证,EditOK 约束编辑保持用户意图(如 100 单位预算已花 60,提议花 70 可修复为 40);配套定理证明修复对 $D_P$ 存在当且仅当对策略的 LeanLTL 语义存在,因此带时序义务的修复目标可直接在时序逻辑中陈述。第三,扩展性设计:策略作者用 guard_rule 属性把已证明事实注册进求解器定理库,或提供自定义消解 tactic,扩展修复无需改动运行时。第四,验证目标定位:Lean-Agent Protocol 检查金融智能体动作但拒绝时只告知违反的义务,Lean4Agent 形式化工作流与轨迹;本文验证的是「提议的工具调用在已审策略、可信状态与历史下是否可接纳」这一运行时决策,并把拒绝变成可恢复的结构化信号。据作者所知,没有已有智能体护栏能产出被证明的修复。

LEANGUARD on the exchange of Figure 1.
Figure 2: LEANGUARD on the exchange of Figure 1.

实验结果

RQ1:无护栏时裁判标记 9.7% 的 τ²-bench 会话;重放发现至少 33 个违规调用(14 个状态违规、17 个时序违规、3 个禁止类)在 28 个会话中实际执行并改变状态。LEANGUARD 停下的 1,702 个调用中,授权失败最多(572,含 338 个未经确认的写操作)、无效调用 551、时序不兼容 411、策略禁止 313。RQ2:LEANGUARD 执行的策略禁止调用为 0;τ²-bench 任务成功率从 72.7%(无护栏)到 68.9%(裸拒绝,$p=0.007$)再到 70.9%(带反馈,$p=0.21$ 不显著);裁判标记率 9.7%→5.6%/6.5%($p=0.002$)。与 ToolSafe(违规率 1.6%)、Progent(2.6%)相比,LEANGUARD 是唯一达到 0.0% 的护栏。DTap 上直接注入 57.9%→5.9%(降 52.0pp)、间接 22.3%→3.8%(降 18.5pp);telecom 域良性成功率不变(75.1%→75.3%)而直接攻击 55.1%→2.4%,证明无写需求的领域防护零代价;但只读部署使整体良性成功率 53.1%→12.5%。RQ3:被拦截调用 983→719,恢复动作 34→48(占被拒动作 5.5%→9.1%,$p=0.02$),五个模型中四个任务成功率提升 2.2–5.8pp;例外 Qwen3.8-27B(75.9%→71.2%),但 43 个反转任务中 35 个其反馈臂根本没收到过拒绝,属随机分支差异。裸拒绝后 30% 是同一调用原样重试再被拒,反馈降到 22%。RQ4:离线重放复现全部 7,720 个准入决策;1,613 个拒绝逐一作为定理检查;252 个参数值类拒绝中 88 个(34.9%)被证明存在可接纳编辑,中位 2ms(最多 70ms);最常见修复是退款到订单原支付方式(64)和用卡而非旅行券支付改签费(18);智能体自己发出被修复调用时任务成功 16/22,对照仅 7/66。

Protection and cost of LEANGUARD (%).
Table 1: Protection and cost of LEANGUARD (%).
After a denial on τ²-bench, for the LEANGUARD (LG) and LEANGUARD + feedback (LG+F) arms.
Table 2: After a denial on τ²-bench, for the LEANGUARD (LG) and LEANGUARD + feedback (LG+F) arms.
Interpretation of LEANGUARD's temporal policy language in LeanLTL.
Table 3: Interpretation of LEANGUARD's temporal policy language in LeanLTL.
Size of the τ²-bench policies.
Table 4: Size of the τ²-bench policies.
What agents do without a guard, by category.
Table 7: What agents do without a guard, by category.
Calls LEANGUARD stopped, by category, from its own decision logs.
Table 8: Calls LEANGUARD stopped, by category, from its own decision logs.
Comparison with ToolSafe and Progent on τ²-bench.
Table 13: Comparison with ToolSafe and Progent on τ²-bench.
DTap results by domain, aggregated over the five models.
Table 16: DTap results by domain, aggregated over the five models.
Policy denials on τ²-bench by the kind of fix they require.
Table 24: Policy denials on τ²-bench by the kind of fix they require.
Argument-value denials on τ²-bench by failed rule.
Table 25: Argument-value denials on τ²-bench by failed rule.
Calls stopped by LEANGUARD per failure category of §3.
Figure 3: Calls stopped by LEANGUARD per failure category of §3.
DTap results by domain under the read-only deployment, aggregated over the five models.
Figure 4: DTap results by domain under the read-only deployment, aggregated over the five models.
The agent's next attempt after each policy denial on τ²-bench.
Figure 5: The agent's next attempt after each policy denial on τ²-bench.
查看结构化数据
任务指标本文基线提升
τ²-bench 策略合规(违规调用执行数) 被 Lean 策略禁止且实际执行并改变状态的调用数 0 无护栏 ≥33 个调用(分布在 28 个会话) 完全消除(按构造保证,重放确认)
τ²-bench 任务成功率 基准确定性奖励(%) 70.9(LG+F)/ 68.9(LG) 72.7(无护栏) −1.8pp(不显著 $p=0.21$);裸拒绝臂 −3.8pp(显著 $p=0.007$)
τ²-bench 裁判标记率 LLM 裁判判定执行了违反基准策略调用的会话比例(%) 6.5(LG+F)/ 5.6(LG) 9.7(无护栏) −3.2pp / −4.1pp($p=0.002$)
DTap 直接提示注入防御 直接注入攻击成功率(%,越低越好) 5.9 57.9(无护栏) −52.0pp
DTap 间接提示注入防御 间接注入攻击成功率(%,越低越好) 3.8 22.3(无护栏) −18.5pp
DTap 电信域良性任务(无写需求场景) 良性任务成功率(%) 75.3(LG+F) 75.1(无护栏);同域直接攻击 55.1→2.4 保护零代价(+0.2pp,同时攻击成功率降 52.7pp)
τ²-bench 与其他护栏的违规率对比 重放发现的有违规调用执行的会话比例(%) 0.0(LG 与 LG+F 两臂) 无护栏 2.0(28 会话)、ToolSafe 1.6(22)、Progent 2.6(36) 唯一达到 0.0% 的护栏
τ²-bench 拒绝后的证明修复 参数值类拒绝中被证明可接纳修复的比例与耗时 88/252(34.9%),中位 2ms(最多 70ms),验证中位 8ms 无(此前没有护栏能产出带证明的修复) 首个带内核检查证明的修复能力

局限与改进

作者承认的局限:保证相对于已审形式化规范与可信输入——自然语言策略只形式化「工具可强制执行的子集」,形式化由 LLM 起草、人工修正,此步错误证明捕获不到;保证假设适配器如实上报且所有关键调用经过监视器;自由对话到同意记录的转换不在验证边界内(τ²-bench 用温度 0 的模型调用模拟可信确认屏,模拟器出错会产生错误同意证据);只管工具调用,响应文本携带的伤害超范围——只按文本评判的客服与旅行攻击仍从 41.0% 降到 30.2%,医疗五个攻击类保持 21.4–37.0% 直接攻击成功率(如诊断操纵、忽略过敏史);DTap 只读部署高估保护(良性成功率 53.1%→12.5%);证明修复只在重放离线评估,运行时尚未调用;τ²-bench 有两条规则比基准更严;DTap 策略只覆盖 14 域中的 7 个;裁判是 LLM 且是受评模型之一;实验仅用 Qwen 家族、英文任务、模拟用户。我的补充观察:效果无法建模时 fail-closed 停下了 5,792 个调用(shell 命令 2,728、无价市场单 835),在通用环境会显著放大误拦;retail 域任务成功率损失最大(LG+F −7.9pp),约束式策略对多步写任务的摩擦真实存在;修复对部分规则覆盖率极低(telecom.payment_request 4/58、airline.booking 0/18),候选编辑生成器仍朴素。

独立分析的弱点

独立分析的弱点与改进方向。(1) 效果不可建模的工具一律拒绝:DTap 中 5,792 个调用因效果无法确定被停(execute_command 2,728 个、trade_stock 1,143 个),在允许 shell 的真实环境会频繁「误杀」;应为常见工具族建立效果抽象层,或让应用作者用带证明的 contract 覆盖更多工具语义。(2) 写权限部署的代价未解决:只读部署让旅行、金融、法律良性成功率降到 0.0%,医疗因患者注册被拒降到 0.3%,论文只在电信展示零代价场景;需把授权发放、双人审核、一次性确认等可信基础设施工程化并评估延迟与可用性。(3) 修复离线运行:运行时不调用 guard_repair?,把修复递给智能体的端到端收益无法度量;应在线化并测延迟预算内的成功率。(4) 修复候选生成器弱:252 个可修拒绝只修复 88 个,telecom.payment_request 仅 4/58;可加入类型驱动的参数枚举、从历史轨迹挖掘类似调用。(5) 反馈对最大模型收益不稳定(27B 降 4.7pp)且每任务只跑一次;应多种子重复,区分「反馈分支差异」与「反馈质量」。(6) 同意证据由模型模拟的可信屏生成,是验证边界外最脆弱一环;应换成确定性 UI 或硬件签名确认通道。(7) 裁判与被评最强模型同为 Qwen3.8-27B 且给自己参与的会话打分,存在自评偏差;可引入异构裁判与人工审计校准。

未来方向

未来方向。作者提出的:把拦截器从「过滤器」升级为「经验证的修正来源」,运行时在线调用 guard_repair?,把带证明的修复作为建议返回给智能体;响应文本伤害仍超出任何工具级检查。基于成果可延伸的:其一,策略自动形式化的可靠性——用 LLM 起草、Lean 检查、差分测试对齐自然语言策略与编译策略的轨迹判定,降低人工修正成本;其二,把 Lean 反馈用作强化学习信号训练智能体(相关工作已在定理证明中这样做),把「一次通过策略」内化为模型能力而非外部约束;其三,扩展到其余 7 个 DTap 域与真实生产后端,评估确认屏、授权发放、双人审核等可信基础设施的延迟与可用性;其四,工具边界护栏与输出级检查(如 CaMeL 式信息流控制)组合成纵深防御,覆盖响应文本伤害;其五,利用附录 H 的定理(修复存在性在 $D_P$ 与 LeanLTL 语义间等价)探索时序修复目标,例如「补一个前置调用」式的多步证明修复(先认证客户再执行操作);其六,多模型家族、多语言与真实用户研究,消除单一 Qwen、英文、模拟用户的推广性疑问。

复现评估

复现评估:论文正文与附录均未给出代码开源链接,这是最大不确定项。数据与模型均公开:τ²-bench 278 个任务(114 retail、50 airline、114 telecom,revision 672227c)、DTap 七域共 2,611 个评估用例(电信 434、旅行 355、客服 358、医疗 1,091、金融 95、法律 92、OS 文件系统 186)、Qwen3.5(0.8B–9B)与 Qwen3.8-27B 均可下载。算力需求中等:每任务每臂一次(seed 300、采样解码、240 步或 2 小时上限),5 模型 × 3 臂 × 278 任务,外加 DTap 数千用例(含上千个未计分会话)。Lean 侧非常轻量:单条拒绝的修复搜索中位 2ms(最多 70ms)、验证中位 8ms,最大的 416 定理重放文件编译 43–50s(主要耗在加载 Lean 与 Mathlib)。复现难度:高。策略只有 583 行 Lean(45 条规则),但可靠性定理、fail-closed 条件、修复存在性定理与 guard_repair? 元编程 tactic 都需要熟练的 Lean 4 开发能力;DTap 侧需人工审阅 199 个工具合同,确认屏模拟器等基础设施也要自建。若作者开源,复现主结果(违规调用为零、DTap 攻击成功率骤降)应当可行;复现修复实验需逐条对齐其候选编辑顺序与优先级。

相似论文推荐