Speculative Tool Execution:预测分支的副作用隔离与晋级
提前执行模型可能选择的工具可以降低延迟,却也可能在用户决定前发信、占库存或污染缓存。本文把预测票据、隔离执行、可验证 dry-run 和原子晋级组成严格的 speculative 边界。
本文要点
- 主题聚焦:AI Agent、MCP、DevOps
- 适合人群:独立开发者、全栈工程师、AI 应用开发者
- 核心价值:快速理解背景、实践路径、常见误区和工程建议
模型还在比较两个方案时,运行时可以提前查库存或编译两个候选补丁;如果直接提前“创建订单”或“发送消息”,被放弃的分支已经改变外部世界。更麻烦的是某工具声称 dryRun=true,内部却触发 webhook、分配自增 ID 或写共享缓存。低延迟收益不能靠事后删除记录来证明无副作用。
并行工具调用的因果屏障决定多个已计划分支何时共同提交,本篇讨论计划尚未最终选择时能否预执行候选。Agent 人工审批门给高风险动作授权;speculation 不能把审批后的执行变成审批前已经发生。
先按真实效果分类
发布 speculationPolicy.v1,按准确 tool descriptor digest 将操作分为 PURE_READ、ISOLATED_COMPUTE、DRY_RUN_VERIFIED、BOUNDED_HOLD 和 FORBIDDEN。HTTP 语义中的 safe method 表示请求的既定语义是只读,不保证实现没有附带效果。分类证据必须来自网关拦截、测试和下游合同,不能只信工具名、模型描述或 MCP annotation。
普通候选获得 speculationTicket.v1,绑定 run/plan revision、branch、主体、工具与策略 digest、输入摘要、base resource versions、隔离域、预算、expiresAt 和单调 generation。该票据只允许访问快照数据、临时命名空间、受控网络 sink 或正式 dry-run endpoint,不含 canonical write verb。生产凭证即使“代码保证不用”,也不得注入 speculative worker。
schema: speculationTicket.v1
ticket: sp-81
planRevision: 12
tool: deploy.preview@6
mode: DRY_RUN_VERIFIED
baseVersions: {manifest: 441, policy: 92}
sandbox: preview-ns-81
generation: 7
expiresAt: 2026-07-19T15:04:00Z
Kubernetes server-side dry-run 不持久化请求,但 admission webhook 只有声明 sideEffects: None 或 NoneOnDryRun 等约束时才能参与;这不是任意工具都能套用的无副作用证明。平台应对每个 dry-run adapter 验证数据库、消息、邮件、支付、对象存储、DNS 与 webhook 的 egress 均未出现 canonical 写入。做不到完整拦截时,该工具就是 FORBIDDEN。编程 Agent 沙箱权限提供进程、文件和网络边界,Agent 短期能力租约限制票据被转移到别的工具或资源。
预测结果只能晋级,不能直接生效
候选状态为 ISSUED -> RUNNING -> PREPARED -> VALIDATED -> PROMOTABLE,未选中进入 DISCARDED,超时进入 EXPIRED,只有最终选择者可到 PROMOTED。结果写独立 speculative store,缓存键包含 ticket generation,默认不供普通请求读取。读取结果也有副作用风险:若它把权限敏感数据塞进共享 cache,放弃分支仍会造成泄漏;因此内容先经过Agent 工具输出防线,再记录来源和 freshness。
唯一接受点是 promoteSpeculation 事务:匹配当前 plan revision、唯一 chosen branch、ticket generation、主体、策略与 base resource versions,重新执行授权和必要的轻量校验,然后写 promotion receipt 与 canonical outbox。未选 branch、旧 generation 或 base 变化一律不能晋级。对于纯计算,晋级的是结果摘要;对于真正写操作,晋级的只是经过验证的 effect intent,由正常执行器随后实施,而不是把 sandbox 写集复制到生产。
BOUNDED_HOLD 不复用普通票据,而签发更窄的 holdTicket.v1,凭证只能写专用 hold namespace,不能创建订单、扣减 canonical 库存或发送通知。hold ledger 记录稳定 hold ID、额度、TTL、chosen plan revision、release/expire receipt 和晋级状态;它明确算临时资源占用,不得伪装成零副作用。下游若不能自动过期、按 ID 查询并幂等 release,就归入 FORBIDDEN。晋级事务只把已选 hold 交给正常执行器兑换为 canonical effect;未选 hold 必须释放并对账。MCP 超时、重试与幂等负责兑换结果的不确定性。
主动寻找偷偷发生的写入
故障套件给 dry-run 工具植入 webhook、共享 cache 写、对象上传和 DNS egress;同时注入两个候选同时晋级、选择变更、ticket 到期后 worker 恢复、sandbox 逃逸、base version 漂移、hold release ACK 丢失、TTL 失效与输出带间接指令。canary 资源、hold ledger 和网络 sink 用于证明违规路径,不能只检查主业务表。
发布门要求未选分支在 hold namespace 外的 canonical 写入为 0、未知 egress 为 0、过期 generation 晋级为 0,hold ledger 满足 issued = promoted + released + expired + outstanding 且过期后 outstanding 为 0,所有 promotion 绑定最终 decision receipt,一万组交错与 reference state 一致,且 p95 至少降低 15%。上线先 shadow,再开放 PURE_READ,最后对单个 dry-run 或 bounded hold 工具启用 1%。发现一次越界效果立即提升 policy generation、撤销票据并关闭 alias;hold 按 receipt 释放,已晋级效果沿正常账本补偿,不能把删除 sandbox 当成生产回滚。
Related