Sapien:面向自主 AI 智能体的有状态策略引擎
Sapien: A Stateful Policy Engine for Autonomous AI Agents
Sapien 用带状态的上下文策略拦截被劫持智能体的工具调用:AgentDojo 上挡住 93–95% 攻击,Toolathlon 上挡住 62–85%。
对手可劫持智能体 LLM(提示注入、记忆投毒或改权重),迫使其提出任意工具调用。
- 通用智能体的合法工具调用取决于用户任务与已执行步骤,静态允许列表要么放过越权调用,要么打断正当任务。上下文策略若无状态,仍无法按运行时数据约束参数。
- Sapien 在执行前仅根据用户提示词和工具文档生成策略,用扩展正则描述允许的调用序列,并加入变量谓词、延迟展开的 defer 洞和范围受限的语义检查;运行时编译为带变量绑定的 NFA 逐调用强制执行。
- 四模型上效用接近无策略智能体。分析性安全评测假定智能体已被完全劫持:Sapien 在 AgentDojo 挡住 93.2–95.2% 攻击,在 Toolathlon 全套(Gemini 3.8 Flash)挡住 64.6%,20 任务子集上为 62.5–85.0%,长程任务上约为工具允许列表的两倍。
- 作者指出策略生成器仍会写错谓词或过紧约束,语义攻击占未挡住实例的大部分,且不保证活性、不防侧信道。评测为分析性假设而非实测提示注入成功率,Toolathlon 除 Flash 外只用 20 个任务。
- 威胁模型
- 对手可劫持智能体 LLM(提示注入、记忆投毒或改权重),迫使其提出任意工具调用。策略生成器 LLM 假定未受攻击且输入无恶意数据;用户会话、工具文档、harness 与 Sapien 插桩不可绕过。提供安全性而非活性。
- 模型
- Gemini 3.8 FlashGemini 3.1 ProClaude Sonnet 5Claude Opus 5
- 基准
- AgentDojoToolathlon
- 指标
- Task Pass Rateattack block ratelatencytoken overhead
Sapien 是一个为自主 AI 智能体执行有状态上下文策略的策略引擎,用扩展了状态谓词的正则表达式规定允许的工具调用序列,并支持延迟策略生成与作用域语义检查。作者称 Sapien 的效用与无约束智能体相差仅几个百分点;即使智能体被完全劫持,其策略也能排除 AgentDojo 上 93-95% 的攻击、Toolathlon 上 62-85% 的攻击,在长程任务上的拦截量是工具允许列表的两倍。
深度解读
这篇论文试图解决什么问题?
通用智能体需要按任务和历史约束工具调用,静态策略做不到。
通用智能体的合法动作取决于当前任务和已观察到的数据,静态或无状态策略无法同时保住效用并拦住越权工具调用。
- 场景:作者称智能体靠 LLM 规划并调用外部工具完成长程任务;随着轨迹变长,更容易被提示注入劫持,或自行偏离目标、误解工具输出。文中举例包括清空收件箱、删除生产数据库、攻击外部基础设施和执行攻击者控制的命令。作者认为这种不可靠性是把智能体部署到生产环境的主要障碍。
- 现有不足:经典引用监视器使用事先固定的静态策略。对通用智能体,同一工具(如 send_money)在“退款”任务中合法、在“总结收件箱”中是越权。允许列表若放行该工具则留下盗窃空间,若禁止则打断正当退款。作者称仅约束单次调用、或在每步把工具输出交回 LLM 重写规则,都不适合随请求变化的通用智能体。
- 核心观察:作者认为策略能多紧地包住“合适轨迹”,受策略语言表达力限制(Figure 1)。无状态策略只能过度近似;要拦住最坏结果,下一步是否允许必须依赖已执行的动作和已观察到的数据。
- 本文提出:Sapien,一种有状态策略引擎。它在执行前把用户任务提示词和工具文档译成任务级策略,用扩展正则描述允许的工具调用序列,并在运行时对每次工具调用强制执行。
- 威胁模型:
- 目标与能力:对手可劫持智能体 LLM——经工具输出中的提示注入,或直接记忆投毒、修改权重——从而迫使它提出任意工具调用。
- 知识与隔离:策略生成器 LLM 假定训练正常且未被攻破,只要输入不含恶意数据就会遵循 Sapien 的指令。作者不假定生成器能抵抗提示注入,因此生成阶段只看用户任务提示词和工具文档。
- 环境假设:用户会话未被攻破,任务提示词来自用户;工具行为与文档一致;harness 与 Sapien 插桩不可绕过,并中介每一次提议的工具调用。
- 边界:Sapien 提供安全性(阻止未授权工具调用)而不提供活性;被说服停工或拒做任务时不介入。被攻破的智能体仍可能经时序或已允许调用的顺序泄漏信息。策略只规定哪些调用被允许,不规定何时发生、在允许路径中走哪一条。
有哪些相关研究?
作者把 Sapien 放在上下文智能体安全与运行时策略执行之间。
作者按经典系统防护、上下文策略和既有智能体策略语言来定位 Sapien。
引用监视器与静态策略
- Anderson(1972)、Saltzer 与 Schroeder(1975)——用引用监视器按显式策略检查程序动作。后续包括系统调用过滤与路径隔离。
- 作者的区分:这类策略来自开发时已知的固定用途。作者认为通用智能体事先固定的目的只有“做用户所求”,过宽,无法得到有意义的静态策略。
上下文智能体安全
- Tsai 与 Bagdasarian(2025,Conseca)——为每个请求从用户提示词即时合成任务特定策略,并由引用监视器在工具调用上执行。AllowList 基线即按这一风格、从任务提示词生成工具名允许列表。
- 作者的区分:作者采用该框架,但认为紧约束长程智能体需要有状态策略语言;Conseca 式粗粒度列表对整段任务允许或拒绝某个工具,不看参数和执行状态。
跨调用依赖的策略系统
- 既有系统(文中点名包括 Progent,以及 §8 讨论的 CaMeL、AgentSpec 等依赖工具调用关系的系统)——表达工具调用之间的依赖,但作者称其策略是事先(人工或离线 LLM)从固定领域规则得到的静态策略,适合单一用途智能体。
- Progent——用 LLM 生成任务特定策略,但语言只约束单次工具调用;要跨步骤适应,它在每次调用后把工具输出交回 LLM 重写规则。作者认为这与“生成阶段隔离不可信内容”不同。
- 用 LLM 整体审查智能体行为的裁判——作者对比 Sapien 的语义谓词:检查窄且局部,裁判只收到回答该是/否问题所需的输入,而不是完整执行轨迹。
基线与基准
- 基线方法:NoPolicy(不设策略)与 AllowList(按 Conseca 风格、单次 LLM 调用生成的每任务工具名允许列表,无 Sapien 的自校正轮)。
- 基准/数据集:AgentDojo(97 个短任务、四个套件)与 Toolathlon(108 个长程任务)。
作者把本文的区别放在:策略语言和自动机执行引擎面向每次用户请求都可能改变合法动作的通用智能体,并称当今 LLM 可以从自然语言合成细粒度策略,而不必由人编写或审计策略。
论文如何解决这个问题?
执行前生成有状态策略,运行时用带绑定的自动机逐调用检查。
Sapien 分两阶段:执行前由生成器 LLM 只根据任务提示词和工具文档合成一条任务策略;运行时执行器拦截每一次工具调用,不允许则把拒绝原因交回智能体自行改正,而不是升级给用户。
问题设定与完整性
- 允许条件:扩展轨迹(历史调用再接上候选调用)必须是策略所承认序列的合法前缀。
- 策略完整性:作者把“生成的策略反映用户意图”称为非正式不变量。对抗者控制的策略等同于没有策略。隔离只用于生成阶段;执行阶段仍可用智能体观察到的数据做固定策略检查,作者称这不改变判定规则本身。
- 非目标:不审查任务提示词是否有害或是否准确表达用户想法;提示含糊时会生成较宽的策略。高风险操作的人工确认可放在 Sapien 之后。
策略语言
Figure 3 的语法在正则表达式上扩展四类原语。经典算子包括顺序(·)、选择(+)、重复(*、+);另有 shuffle(∥),允许独立子任务以任意交错执行,同时保持各自内部顺序。
- 绑定与谓词:调用模式可把参数和返回值绑到变量(@x),参数可以是字面量或 PREDICATE(p)。p 是随策略给出的 Python 函数,只在运行时对具体参数求值。迭代下的绑定按执行顺序累积记录列表。
- defer:defer(g) 在策略里留一个洞。g 无参数,返回一段策略生成指令。运行时智能体必须调用 resolve,Sapien 在已绑定变量上求值 g,再让生成器产出子策略并拼进洞中。作者认为,用户把子任务委托给外部来源时,按该来源展开比在获取之后放行任意工具更贴近用户意图;来源若被篡改,子策略会错,与任务提示词被篡改同类。
- 语义谓词:无法用代码判定的自然语言性质,经运行时助手 verify_with_ai 向 LLM 提一个范围受限的是/否问题,输入仅为作答所需的具体值。作者称该谓词只能收窄策略:即使裁判被骗返回 True,周围的确定性约束仍然执行。
自动机执行
- 编译:按 Thompson 构造把策略 AST 译成单入口、单出口的 NFA。shuffle 取两个操作数状态集的笛卡尔积。defer 洞编译成一条 resolve 转移。
- 配置:执行器维护活跃配置 (q, ρ),即自动机状态 q 加上该路径上的变量赋值 ρ。can_advance(a, p) 只检查、不改状态;若某个配置在 ε 转移后能走工具 a 且参数约束在 ρ 下成立则允许。advance(r) 在调用返回后步进匹配的配置、扩展绑定并丢弃不匹配者。
- 接口:init(u) 在用户请求到达时生成并安装策略;拒绝时返回哪一个参数未通过哪一个谓词及其源码。策略表达式、谓词定义和生成理由会附加到智能体上下文。
原型实现
- 集成:Python 库,接入 Google ADK,以及 AgentDojo 与 Toolathlon 的评测 harness。模型调用经 Gemini Enterprise Agent Platform。同一模型既执行智能体也生成策略。
- 生成:固定系统提示词定义语言并给出示例,要求优先用确定性谓词,只有代码无法检查的性质才用 verify_with_ai。每个任务两次 LLM 调用:先起草理由和候选策略,再按清单自校正(如语法、必要的只读工具是否放行)并给出最终策略和 Python 块。延迟子策略用指令串替换用户提示词,并把父策略作为附加上下文。
- 求值与展开:谓词以自由变量引用绑定;执行器在自定义全局字典中 exec 一次 Python 块,按当前 ρ 填入记录后调用再清空。原型不用 §5.2 的按配置展开,而做 AST 级替换、重编译并重放已记录轨迹。作者称该简化覆盖评测中的全部任务,并在运行时要求每个洞最多解析一次,且各配置在该洞上得到相同指令串。
- Toolathlon 额外约束:所有智能体事先拒绝 local_python_execute;并要求 Sapien 为 terminal_run_command 指定命令谓词。
论文做了哪些实验?
效用接近无策略;完全劫持下 AgentDojo 拦住约 93–95% 攻击。
实验设置
- 模型:Gemini 3.8 Flash、Gemini 3.1 Pro、Claude Sonnet 5、Claude Opus 5。每次运行中,智能体执行与策略生成(Sapien 或 AllowList)使用同一模型。
- 基准:AgentDojo 共 97 个短任务(多数在五轮以内),分布在 workspace、Slack、travel、banking 四个套件,每套件 11–28 个工具;四个模型都跑全部 97 个任务、949 个攻击实例。Toolathlon 共 108 个长程任务(数十轮),含本地文件/shell 和 32 个应用、经 MCP 暴露 600 个以上工具;Gemini 3.8 Flash 跑全部 108 个任务、212 个攻击实例,其余三模型因成本只跑随机 20 个任务、40 个攻击实例。
- 基线:NoPolicy;AllowList,按 Conseca 风格单次 LLM 调用生成,无自校正。
- 效用:良性环境中完成任务的比例,用各基准自带完成标准。AgentDojo 把最终环境状态或工具调用轨迹与每任务规格比较;Toolathlon 用每任务验证脚本对照工作区,并查询被修改的外部服务。
- 分析性安全:假定攻击者已经劫持智能体,只问策略是否承认任何能达成攻击目标的工具调用序列。仅两类 LLM 调用被假定忠实:(i) 初始策略生成;(ii) 在未被攻击者数据污染的输入上做的 defer 解析。其余调用视为已被攻破:智能体可提出任意工具调用,每次 verify_with_ai 都通过,在被污染指令上解析的 defer 洞允许全部工具调用。攻击成功由三项自动检查加人工裁定:必要工具检查、轨迹回放(AgentDojo 有地面真值攻击轨迹)、以及由 Gemini 3.8 Flash 担任的对抗搜索。
- 攻击实例:AgentDojo 把套件内每个用户任务与每个 injection task 配对,得 949 个实例;作者保留用户任务从不读取攻击者数据的实例,因为假定智能体已被攻破。Toolathlon 无现成攻击目标,作者为每个用户任务编写 1–2 个针对该任务自身工具和数据的目标,得 212 个实例。论文未报告效用或安全实验的重复次数。
主结果
效用与拦截率(拦截率 = 分析性评测中未达成攻击目标的实例比例):
表格较宽,可左右滑动
设置 NoPolicy AllowList Sapien AgentDojo 效用,Gemini 3.8 Flash(Figure 5,97 任务) 95.9% 94.8% 93.8% AgentDojo 效用,Claude Opus 5 94.8% 92.8% 93.8% AgentDojo 效用,Claude Sonnet 5 85.6% 88.7% 88.7% AgentDojo 效用,Gemini 3.1 Pro 96.9% 91.8% 94.8% AgentDojo 拦截率,四模型(Figure 7,949 实例) 0% 82.7–86.8% 93.2–95.2% Toolathlon 全套拦截率,仅 Gemini 3.8 Flash(212 实例) 0% 32.4% 64.6% Toolathlon 20 任务子集拦截率,四模型(40 实例) 0% 22.5–35.0% 62.5–85.0% - 效用:作者称 AgentDojo 上 Sapien 比 NoPolicy 少完成 1–5 个任务(共 97),AllowList 少完成 0–2 个。Toolathlon 全套上,Gemini 3.8 Flash 的 Sapien 任务成功率落在 NoPolicy 的 4% 以内。20 任务子集上,四模型合计 Sapien 成功 43/80 次任务运行,NoPolicy 为 45;Sapien 在任一模型上至多多失败 2 个任务,与 Gemini 3.1 Pro 持平,在 Claude Sonnet 上超过 NoPolicy,在 Gemini 3.8 Flash 与 Claude Opus 5 上分别多失败 1 个和 2 个任务。作者称 AllowList 在各模型上差于 Sapien 和 NoPolicy,仅在 Opus 5 上持平。
- 安全:作者称 NoPolicy 挡住 0%。AgentDojo 上 Sapien 为 93.2–95.2%,AllowList 为 82.7–86.8%。Toolathlon 上攻击目标使用用户任务所需的工具,AllowList 往往放行;全套 Flash 上 Sapien 64.6% 对 AllowList 32.4%,子集上 62.5–85.0% 对 22.5–35.0%。摘要写 AgentDojo 93–95%、Toolathlon 62–85%,并称在长程任务上为工具允许列表的两倍。
- 未挡住的攻击:作者分为三类,其中语义攻击占 AgentDojo 未阻止实例的 82.1%、Toolathlon 的 84%。论文正文在此处开始定义语义攻击(区分良性与恶意是语义问题);其余类别在所给文本中未完整列出,不补写。
效用失败原因
- 测了什么:作者讨论 Sapien 策略导致任务失败的情形。
- 结果:生成器看不到运行时环境,会对数据或流程做错误假设,例如谓词期望的格式或取值与库中实际字符串不一致;verify_with_ai 可能按提示词字面拒绝环境里类型不同的更新;也可能漏掉所需的只读工具而把流程限制得过紧。
- 作者的解读:作者认为 Sapien 效用可以高于 AllowList,原因有二。AllowList 必须事先对敏感工具做全有或全无的决定,提示词未明确要求时往往不放行;Sapien 可用参数谓词和 defer 在收紧用法的同时放行该工具。其次,分阶段策略给智能体隐含的步骤引导。文中一例:AgentDojo 的邮件 TODO 任务上,AllowList 拒绝 send_email 导致失败,Sapien 用 defer,解析后的子策略只允许发给发件人。Claude Sonnet 上 Sapien 高于 NoPolicy 的那次,发生在 NoPolicy 达到最大轮数的任务上,作者称策略帮助智能体留在能完成任务的轨迹上。
其他消融与分析
所给正文在 §6.3 开头提到效率(延迟与开销),并称 Toolathlon 上 Sapien 的平均推理次数低于某对照(与分阶段策略的引导一致),但具体延迟、token 和推理次数未出现在可读表格中,不填数字。论文未报告统计显著性检验。
有什么可以进一步探索的点?
策略仍会过紧或漏掉语义攻击;分析性评测假定模型已被完全劫持。
作者指出的局限与后续方向
所给正文没有单独的 Limitations、Future Work 小节原文。下列仅保留作者在系统假设与非目标中明确划出的做不到的事:
- 不保证活性:提示注入若只让智能体停工或拒绝任务,不会产生未授权工具调用,Sapien 不介入(§3.1)。
- 不防侧信道:被攻破的智能体仍可能通过时序,或在允许调用之间的顺序泄漏信息;策略不规定调用何时发生、在允许选项中走哪条路径(§3.1)。
- 不审查用户意图本身:不判断提示词是否有害、是否说错对象,也不从提示词推断高风险操作是否需要人工确认;后者可另放确认策略(§3.3)。
- 语义空隙:作者认为一般不存在只承认合适轨迹的策略,因为合适性可能依赖难以精确描述的自然语言语义;语义谓词只是尽力处理(§2.3、§4.4),且裁判仍可能被提示注入欺骗。
- 生成器会写错:策略可能因未见运行时数据而用错格式、过字面的语义检查或过紧流程,从而妨碍完成任务(§6.1)。
实验覆盖范围
- 被测模型为 Gemini 3.8 Flash、Gemini 3.1 Pro、Claude Sonnet 5、Claude Opus 5,共 4 个;策略生成与智能体执行使用同一模型(§6)。
- AgentDojo 为全部 97 个任务、949 个攻击实例、四个模型;Toolathlon 全套 108 个任务、212 个攻击实例仅 Gemini 3.8 Flash,其余三模型为随机 20 个任务、40 个攻击实例(§6)。
- 安全数字来自分析性方法:假定智能体已被劫持,verify_with_ai 一律通过,被污染数据上的 defer 放行全部工具;忠实的只有初始策略生成,以及在未污染输入上的 defer 解析(§6)。
- 基线为 NoPolicy 与单次调用、无自校正的 AllowList;效用用各基准自带完成标准(§6、§6.1)。
- 原型限制:评测中的 defer 展开是 AST 替换并重放轨迹,要求每个洞最多解析一次且各配置指令串相同(§5.3)。论文未报告重复次数,也未报告效率一节中的具体延迟数字(正文提及 §6.3,可读文本无对应表)。
总结一下论文的主要内容
Sapien 用有状态上下文策略约束工具序列,在近似保住效用的同时拦住多数被劫持轨迹。
Sapien 是面向通用 AI 智能体的有状态策略引擎:执行前把用户提示词译成任务策略,运行时只放行该策略承认的工具调用序列。
- 问题:合法调用随任务和已观察数据变化。静态允许列表要么放过 send_money 一类工具的任意参数,要么禁止正当用途。作者认为紧约束需要状态:下一步取决于已执行动作和返回值。
- 方法:策略是带 shuffle、变量绑定、Python 谓词、defer 洞和范围受限 verify_with_ai 的扩展正则。生成器只看提示词和工具文档,经起草与自校正两轮调用产出策略。执行器把策略编译成 NFA,以(状态,变量赋值)配置跟踪进度,拒绝时返回谓词级反馈。defer 在取到外部子任务后再生成子策略。
- 效用:AgentDojo 上四模型的任务通过率,Sapien 为 93.8%、93.8%、88.7%、94.8%(Figure 5),比 NoPolicy 少完成 1–5 个任务(共 97)。Toolathlon 20 任务×四模型,Sapien 成功 43/80 次,NoPolicy 为 45;全套 Flash 的成功率落在 NoPolicy 的 4% 以内。
- 安全:在“智能体已被完全劫持”的分析性设定下,NoPolicy 拦截 0%。Sapien 在 AgentDojo 的 949 个实例上拦截 93.2–95.2%(AllowList 82.7–86.8%);Toolathlon 全套 212 个实例、Gemini 3.8 Flash 上拦截 64.6%(AllowList 32.4%),20 任务子集 40 个实例上为 62.5–85.0%(AllowList 22.5–35.0%)。未拦住的实例里,语义攻击占 AgentDojo 的 82.1%、Toolathlon 的 84%。
- 作者的结论:作者认为当今 LLM 可以从自然语言合成细粒度策略,在多样任务上提供防护,而无需人工编写或审计策略;状态性对拦住实际任务中的最坏结果是必要的。同时,Sapien 不提供活性,也不阻止侧信道,且策略生成器仍可能因不了解运行时数据而写错约束。