#AI#RAG#DevOps

RAG 撤权传播契约:让旧 ACL、缓存与在途回答同时失效

成员移除后只更新身份库并不代表知识已经不可见。本文用授权纪元、决策凭据、失效水位和负向探针约束 RAG 撤权传播窗口。

本文要点

  • 主题聚焦:AI、RAG、DevOps
  • 适合人群:独立开发者、全栈工程师、AI 应用开发者
  • 核心价值:快速理解背景、实践路径、常见误区和工程建议
作者 @admin·发布于 2026年2月16日·更新于 2026年7月20日

RAG 已经在查询前做 ACL 过滤,并不代表“撤权”已经可靠。管理员在 10:00 移除成员后,授权副本、向量过滤元数据、query cache、已组装上下文和引用页可能仍各自保留旧结论。最终用户看到的是身份库显示无权,旧请求却继续流出内容。RAG 检索权限控制 定义了过滤位置,本篇只解决权限从允许变为拒绝时,旧决策多久、在哪些边界失效。

把撤权窗口写成服务契约

先给每个租户维护单调递增的 aclEpoch,资源再有自己的 policyRevision。授权系统每次改变用户、群组、资源关系或策略代码时提交事件:

json
{
  "spec": "auth.change.v1",
  "tenant": "t_42",
  "aclEpoch": 1842,
  "resource": "doc_9",
  "policyRevision": 73,
  "effectiveAt": "2026-07-18T02:00:00Z",
  "eventId": "evt_01J..."
}

事件 ID 幂等,epoch 不回退;乱序消费者只接受更大的水位。团队应承诺一个可观测目标,例如高风险撤权从事务提交到所有在线读取面拒绝的 P99 不超过 5 秒,而不是笼统声称“权限实时同步”。索引只保存租户、资源和稳定 policy 引用,不能把几万名成员复制到每个 chunk 后等待全量重嵌入。

决策凭据绑定一次检索

查询网关从可信会话取得 subject 与 tenant,向授权服务请求短期 decisionToken。凭据至少绑定 subject、tenant、允许的 policy 集合、aclEpoch、策略 digest、请求用途、签发和到期时间;它可以是签名对象,也可以是服务端不可猜测句柄,但不能由浏览器补写字段。向量召回使用允许集合做前置过滤,上下文组装前再确认本地撤销水位没有超过 token epoch。

这不是要求每个 chunk 都远程鉴权一次。网关可以按决策摘要缓存允许集合,但 key 必须包含 subject、tenant、purpose、policy digest 和 epoch。与 MCP 多租户隔离 相同,缺少任何影响授权的维度都可能串租;与普通性能缓存不同,权限缓存的最大年龄必须小于撤权 SLO。

同时截断缓存、在途生成与引用

撤权事件先推进网关的 deny waterline,再异步清理结果 cache、embedding cache 中的私有映射和历史答案 cache。但节点自报“已应用 1842”不能证明它仍新鲜:请求准入时必须取得线性一致 tenant fence 的短租约,或读取权威 head offset,并证明本地 lastAppliedOffset 已追到该 fence。租约过期、无法联系 fence、offset 落后或 consumer readiness 超过 SLO 时,节点立即摘流并拒绝受保护查询。这样失效消息丢失也不会让一个孤立节点无限沿用旧允许结果。RFC 9111 的缓存指令可用于 HTTP 层,但不能代替这份业务新鲜度证明。

长生成在检索后仍可能输出几十秒。客户端丢弃未确认片段只改善 UX,不是保密边界。高风险响应由服务端按语义段缓冲;每段释放前重新取得当前 tenant fence,确认授权租约未过期、本地 offset 已追平,并对引用资源复核权限,任一不符就丢弃缓冲并终止为 REVOKED_DURING_RUN。已经释放的字节不能收回,因此低风险直流也要明确暴露窗口。引用展开和下载始终重新鉴权。短期能力租约 的期限与撤销纪元可以复用,但 RAG 还要覆盖检索结果和答案缓存。

用事件水位复算传播结果

每个组件上报 appliedAclEpoch{tenant, component} 和处理时间,但租户 ID 不能直接成为无限指标标签,可写入可查询审计表后按风险分桶聚合。验收器在撤权事务返回 eventId 后反复执行同一 query、旧 cache key、旧 decision token、在途 stream 和旧引用 URL,直到全部拒绝,并记录 max(rejectedAt)-effectiveAt。每天抽样比较授权关系快照与索引 policy 引用,避免事件链稳定运行却一直漏掉某类资源。

故障注入至少包括:丢失失效消息、tenant fence 不可达、租约到期、consumer offset 卡住、只读副本延迟、cache 节点隔离和生成中途撤权。断言不新鲜节点 readiness 失败,高风险缓冲不会释放,撤权后未经授权 chunk 数为零;不能回退到全局召回“保可用”。撤权 trace 只记录资源 ID、原因码和摘要,敏感证据留存遵循 Prompt 与 Trace 遥测治理。

发布和回滚都不降低水位

先让新授权链路 shadow 计算,比较旧、新允许集合;确认新策略不会意外放宽后,对内部租户启用强制 epoch,再分批扩大。发布门禁包含所有负向身份矩阵和传播 P99,而不只是正常用户召回率。若新策略误拒绝,可以恢复上一版策略实现和索引 reader;已经提交的 aclEpoch 绝不回退,旧 token 仍无效,新 reader 必须用当前水位重新签发决策。

若授权服务不可达,受保护集合默认拒绝或仅返回明确公开语料,不能沿用无限期旧允许结果。索引事件异常的补偿与对账仍按 RAG 增量索引一致性 处理。可计时的撤权完成条件应是所有读取面证明旧决策已失效,而不是某个管理页面显示“成员已移除”。

延伸阅读

Related

相关推荐