AFAgent Field Notes会员账号
知识目录选择核心方向与细分内容
Q18高级实现约 15 分钟

RAG 中授权与派生数据的一致性

企业 RAG 的权限应该在哪一层过滤?怎样避免缓存和引用泄露?

把授权贯穿召回、重排、上下文、缓存和来源访问,而非只过滤最终答案。

RAG权限租户隔离ACL缓存

知识内容核对 2026-10-03 · 原题来源核对 2026-10-02

本题目录

READ · UNDERSTAND · TRANSFER

阅读理解,按需巩固

我的笔记与复习 ↗

先沿着原理、问答和迁移案例阅读。需要检查理解时,再切换巩固练习或展开个人记录。

作答与个人记录

每次修改后的提交会保留为独立历史。掌握程度由你对照标准自评。

核心知识 · RAG 中授权与派生数据的一致性

先理解核心原理

先备概念:服务端身份认证、ACL 与缓存键、数据派生关系

授权决定数据能否进入计算,相关性只决定已授权数据的顺序。所有由正文派生的摘要、缓存和引用,都必须受当前权限约束。

过滤条件不是身份认证

将 tenant_id 加进查询还不够:如果这个值来自模型参数或可任意修改的前端,攻击者仍能换成另一个租户。可信服务端先认证主体、计算有效权限,再构造不可由模型放宽的检索范围。Azure 的字符串安全过滤模式说明的是筛选机制;不要把它说成自动完成身份认证,服务提供的其他 ACL 能力也需按具体配置验证。

数据可见性沿派生关系传播

文档分块、重排文本、模型上下文、回答缓存、历史摘要、日志都是新的数据副本。限制最后展示一句话,不能撤销前面已交给模型或第三方重排器的正文。引用 URL 也是数据读取入口,应重新鉴权;只隐藏标题而保留公开下载链接,仍然越权。

安全边界与召回边界分开处理

检索引擎可在不同阶段过滤候选。后过滤可能因候选先被截断而漏掉有权证据,这属于召回问题,解决方法是在同一授权范围内调整搜索策略。不能以“先检索全部再交给模型判断”补回结果。父块扩展、邻块拼接也要重新验证,尤其当文档存在段落级更窄权限时。

撤权使静态授权失效

缓存应绑定租户、有效权限摘要、知识版本及策略版本,恢复旧任务时还要重查当前授权。给来源和派生物保存依赖关系,才能在撤权后失效。教学设计中的严格策略是:权限服务异常时拒绝敏感读取,而不是沿用无限期旧授权。实际系统应明确授权检查点和传播时延,不能承诺撤回已经发到远端的内容。

回到问题:怎样回答?

权限必须在可信服务端确定,并在召回进入上下文前执行。每个文档和分块带租户及授权元数据,搜索请求使用当前身份生成的过滤条件;模型不能决定自己可以看哪些资料。重排、回答缓存、日志和引用跳转同样要遵守权限。缓存键至少包含租户、有效权限范围及知识版本,权限变化后失效。最终文本过滤只能补充防护,不能把无权资料先交给模型再要求它不要说。

实现与取舍

从入库建立可执行权限信息

文档入库时保存 tenant_id、document_id、source_version、授权主体和 ACL 版本。分块继承文档权限,不能分块后丢失归属。来源删除或权限变更要传播到索引,传播期间采用失效或拒绝策略。应用从认证会话及服务端权限服务取得用户有效组,不接受客户端任意传入的 group_ids。Azure 的安全过滤模式按字符串元数据筛选结果,它本身不完成身份认证;身份校验和过滤条件构造仍由可信应用承担。

检索前置与候选之后的边界

在安全允许的候选范围内检索,避免无权正文进入重排器和模型。检索引擎可能支持不同过滤模式:向量后过滤会先取候选再删不符合条件的结果,权限选择很窄且 k 很小时可能漏掉本来有权的证据。需要根据引擎验证召回,而不是为了补结果就取消权限过滤。若使用独立重排服务,只发送已授权内容;最终回答检查用于防止错误引用,不能代替上游授权。

缓存与引用同样会越界

同一问题在不同部门可能有不同答案,不能只用 question_hash 共享缓存。缓存键包含租户、权限范围摘要、知识与策略版本,并设置权限撤销后的失效路径。文章引用链接由后端重新鉴权,禁止暴露可直接访问私有对象的长效公共 URL。检索日志、评测样本和模型轨迹也可能泄露正文,要独立限制访问。权限未知或服务异常时拒绝敏感检索;空结果应说明可访问资料中证据不足,不能推断秘密文档不存在。

用明确反例验收隔离

下面 SQL 定义最小文档与 ACL 表,查询通过可信身份参数筛选同租户授权文档;它没有实现真实认证或全文搜索。生产验收至少包含跨租户同名问题、权限撤销后缓存命中、私有引用 URL 访问、分块权限缺失、管理员与普通用户切换等情形。断言无权正文从未送入模型,也未出现在引用、日志或缓存中。必要时为不同租户拆索引或服务,但物理隔离不能免除应用鉴权。

代码示例

同租户、授权文档候选查询(SQLite)

可在新建 SQLite 数据库执行完整脚本。固定身份仅方便复现;真实应用不得信任模型或前端提供的身份条件。

CREATE TABLE documents (
  id INTEGER PRIMARY KEY,
  tenant_id TEXT NOT NULL,
  title TEXT NOT NULL,
  content TEXT NOT NULL
);
CREATE TABLE document_acl (
  document_id INTEGER NOT NULL REFERENCES documents(id),
  principal_id TEXT NOT NULL,
  PRIMARY KEY(document_id, principal_id)
);
INSERT INTO documents VALUES
  (1, 'tenant-a', '研发规范', '只供研发组读取'),
  (2, 'tenant-a', '财务预算', '只供财务组读取'),
  (3, 'tenant-b', '外部租户', '不属于当前租户');
INSERT INTO document_acl VALUES
  (1, 'group-dev'), (2, 'group-finance'), (3, 'group-dev');

-- 演示中固定可信身份;生产应用使用绑定参数和服务端有效主体集合。
WITH trusted_identity(tenant_id, principal_id) AS (
  VALUES ('tenant-a', 'group-dev')
)
SELECT d.id, d.title
FROM documents d
WHERE EXISTS (
  SELECT 1 FROM trusted_identity i
  JOIN document_acl a ON a.principal_id = i.principal_id
  WHERE a.document_id = d.id AND i.tenant_id = d.tenant_id
)
ORDER BY d.id;

预期输出

1 | 研发规范

工程推演

场景
假设工程场景:财务和研发都询问“本月预算”,网站为相同问句复用答案缓存。
设计决策
服务端生成身份过滤;缓存绑定权限摘要;引用读取重新校验;权限变更触发缓存失效。
验证目标
预期行为:研发无法获得财务文档或其摘要,撤权后旧答案不再被复用。
适用边界
SQL 只演示筛选关系,不包含认证、向量搜索、权限同步或数据库级行权限。

连续追问与解答

沿着问题的前提和约束继续向下读。先理解参考解答,再尝试收起答案,用自己的话解释因果和取舍。

举一反三:条件变了,怎样推导?

先找出改变的条件,再判断原方案中哪些前提仍成立。下面的案例是教学推演,便于将原理迁移到新问题。

摘要面向多个部门发布

改变的条件:原文仅财务可见,但希望摘要共享

延伸问题:删掉数字后可以把摘要直接变成公开知识吗?

推导与参考解答

不能仅靠文字删减推断授权。摘要仍可能泄露项目存在、预算走势或隐含业务信息。需要一个独立、可审计的发布或脱敏流程,明确批准共享的输出及受众;否则继续继承原文权限。摘要生成和公开发布是两个不同动作。

保持不变的原理:派生内容不会因变短或改写而自动获得更宽权限。

授权服务短暂不可用

改变的条件:从权限明确变成权限未知

延伸问题:为了可用性能否使用昨天缓存的组列表?

推导与参考解答

对敏感知识采取拒绝或限定为明确公开内容。若业务允许带时效的授权快照,需事先规定最大陈旧时间、风险范围和撤权例外,不能临时把未知解释为允许。监测故障并向用户说明当前无法确认访问范围。

保持不变的原理:授权依据失效时,相关性和历史成功都不能补足当前允许读取的证据。

易错点

  • 让模型自己生成 tenant_id 或授权组
  • 只过滤最终答案,重排和上下文已含私有资料
  • 仅用问题文本做跨用户共享缓存键

参考资料

依据公开技术资料设计;参考资料支持技术机制,场景与评分标准为本站设计,不代表某公司面试原题。 新增问答与迁移案例用于原理讲解,来源核查与案例运行验证分别记录。

检查自己理解到哪一步

读完后可以对照这些标准解释原理、边界和取舍。掌握程度由你自评;需要进一步验证时,再完成下方小任务。

基础达标
检索与读取均基于可信用户身份。
中高级信号
权限覆盖召回、重排、引用、历史上下文和缓存。
资深信号
能处理撤销传播延迟、派生数据和旧 Checkpoint 恢复。

查看独立示例的校验记录

巩固练习 按需完成 · 建议 15 分钟

设计权限撤销后对向量索引、缓存与已保存摘要的处理。

展开验收要求与检查点
  • 撤销后不可读旧正文
  • 缓存不会跨范围返回
  • 引用也重新检查授权

重点检查

  • 授权身份不能取自模型生成的检索参数
  • 分块、重排、缓存、引用都覆盖权限
  • 理解检索前后过滤对召回与安全边界的不同影响