Prompt 会话分配一致性:Bundle 粘性、紧急撤销与旧 Worker Fencing
发布系统选出 Prompt 版本后,请求链仍可能混用 bundle 或继续执行已撤销版本。本文用会话 assignment、单次 permit 和撤销水位封住运行时竞态。
本文要点
- 主题聚焦:AI、大模型、DevOps
- 适合人群:独立开发者、全栈工程师、AI 应用开发者
- 核心价值:快速理解背景、实践路径、常见误区和工程建议
Prompt 版本管理与 CI 已覆盖 Git、离线评测、影子流量、灰度比例和快速回滚。本篇不再回答“候选是否优于基线”,而从发布系统已经选出一个批准 digest 后开始,只解决运行时三个问题:同一会话是否粘在同一 bundle,旧 worker 能否重放 assignment,以及紧急撤销能否赶在下一次模型或工具 dispatch 前生效。Prompt 工程系统 继续负责模板内容。
Assignment 只能引用闭合 bundle
bundle 把 system 片段、few-shot、工具说明、输出 schema、安全规则和 renderer 一起内容寻址。registry 校验所有引用、模型兼容区间与策略后生成 digest;版本名仅供人读,任何 partial 或 renderer 改动都产生新 digest。assignment 不能指向 latest 或可变目录。
{
"assignmentId": "pa-01K2...",
"sessionId": "s-918",
"bundleDigest": "sha256:5a9d...",
"rolloutGeneration": 44,
"policyEpoch": 18,
"revocationEpoch": 7,
"operationFence": 12,
"issuedAt": "2026-07-19T11:20:00Z",
"expiresAt": "2026-07-19T11:35:00Z",
"state": "ACTIVE"
}
resolver 可依据 OpenFeature 式 context 选择 digest,但结果必须落成服务端 assignment;稳定主体来自认证上下文。状态只有 ACTIVE/DRAINING/REVOKED/EXPIRED。普通权重变化只影响新 assignment,已有会话在 lease 内保持 bundle、renderer、toolset 和 schema 一致。
异步任务创建时持久化 OperationAttempt,绑定 (assignmentId, bundleDigest, rolloutGeneration, observedFence, operationId, payloadDigest);worker 只带不可伪造的 attempt ID。gate 从记录读取 tuple,旧 worker 不能重读当前 assignment 后吸收新 fence。重分配、取消或撤销单调推进 fence/cancel generation。trace 内容仍按 Prompt trace 脱敏 处理。
Dispatch 必须取得单次 operation permit
模型和工具先从与撤销共用的线性一致 gate 取得 OperationPermit,原子验证 assignment ACTIVE、lease、bundle、epoch、observed fence 与 cancel generation,并将 attempt PLANNED -> PERMITTED。permit 绑定 operation ID、digest、epoch、fence 与有效期,不能转移或刷新。
dispatch 前,gate 在同一事务核对 tuple,预登记 provider/effect attempt 与幂等键,再 CAS 一次性 permit PERMITTED -> DISPATCHING;该 CAS 是撤销竞争的线性点,成功后才做外部 I/O。遗留 DISPATCHING 转 UNKNOWN_RECONCILING,TTL 不能证明未调用,已消费 permit 不能重放。短期 capability lease 管工具权限,这里的 permit 还绑定 bundle 与会话代际。
紧急撤销不是普通回滚
质量下降时停止新分配或选择旧 digest,已有会话排空。安全事件则在同一 gate 内 CAS 推进 revocation epoch、标记 bundle、停止签发并关闭未消费 permit。若 DISPATCHING 已先提交,操作视为已接受,响应隔离,未释放 tool call 不得执行,UNKNOWN 副作用进入对账。
受影响会话创建新 assignment,指向经过当前模型、工具和策略兼容检查的安全 bundle;不能把旧 assignment 的 ID 改写成另一 digest。渲染缓存、长度缓存和前缀缓存键都包含 bundle digest、policy 与 revocation epoch;撤销先让旧键不可接受,物理清理可以异步。Prompt Caching 负责性能,本协议只规定旧缓存不能绕过撤销。
registry 分区时,进程只能在签名状态 lease 的短暂有效期内服务已经存在的低风险 assignment,并停止新 assignment。状态 lease 到期或高风险 operation 一律 fail closed;不能无限使用 last-known bundle,因为本节点可能漏掉 REVOKED。恢复后先同步当前 revocation epoch,再开放 permit。
精确插入竞态做验收
测试把撤销插在 assignment 读取与 permit 获取之间,以及 PERMITTED -> DISPATCHING CAS 前后,断言撤销与发送接受点只能一方先提交。再注入旧 attempt replay、崩溃于 CAS 后外部响应前、assignment 过期、bundle 同名替换、双控制面推进 epoch、registry 分区、旧缓存和响应丢失。必须满足:REVOKED bundle 新 permit 为零、无 DISPATCHING attempt 的外部调用为零、已消费 permit 重放为零、混合 bundle 会话为零。
运行指标只衡量这条职责:assignment 解析失败、未知/过期 digest、旧 fence 拒绝、permit 获取与关闭、撤销后 dispatch、混合 bundle 会话、in-flight 收敛时间和 UNKNOWN effect。任务质量、成本和灰度胜负仍回到旧文的发布评测,不在这里重复一套指标。
上线先 shadow 创建 assignment 和 permit 但不控制请求,核对旧 worker 与缓存差异;再从无工具会话启用,最后覆盖异步工具链。回滚实现时不能删除 revocation epoch 或 permit gate,只能让 resolver 选择上一兼容 digest。安全控制保持单调,才不会为了恢复旧 Prompt 而重新放行已撤销 worker。
延伸阅读
Related