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 只演示筛选关系,不包含认证、向量搜索、权限同步或数据库级行权限。
连续追问与解答
沿着问题的前提和约束继续向下读。先理解参考解答,再尝试收起答案,用自己的话解释因果和取舍。
第 1 层用户刚被移出部门群,旧答案缓存如何处理?
撤权让原来合法的派生物变成当前不可读内容。
参考解答
先在权威权限层撤销组成员关系并改变权限版本;缓存读取前重取有效授权,旧摘要对应的缓存键不再可用。再按文档依赖主动失效旧回答、引用和派生摘要。短 TTL 只缩短风险窗口,不能替代撤权校验;若没有依赖关系,保守失效该主体或作用域缓存。
沿着这个回答继续深入
第 2 层缓存已失效,但旧 Checkpoint 里仍有财务摘要,恢复后怎么办?
父问修复缓存后,仍存在持久化上下文这一独立副本。
参考解答
恢复时不直接把历史摘要当作可用上下文。根据其来源引用重查当前权限,删除无权内容并重新组装模型输入;引用不全的旧摘要保守视为不可确认。还要防止旧 Worker 将旧摘要写回新缓存,写入时校验当前权限版本。
沿着这个回答继续深入
第 3 层授权检查通过后立刻发生撤权,请求还能保证没有发送吗?
恢复重新鉴权仍有检查到使用的竞态,必须区分本地禁止后续读取与远端已发生事实。
参考解答
一次检查与网络发送不是天然原子操作。可通过短授权租约、发送网关的版本检查和串行化提交缩小窗口,并明确撤权生效的检查点。已经进入远端的请求无法靠删缓存撤回;要求更强保证时,需要网关与撤销服务共同定义并执行提交边界。
第 1 层为什么把无权内容交给模型再隐藏输出不够?
从最终答案回溯数据进入计算的真正边界。
参考解答
模型已经接收无权正文时,输出隐藏只能减少展示风险,不能撤回处理、日志或外部服务留存,也不能保证模型不换一种方式泄露。应在读取和发送前做授权,最终验证作为补充。相关但无权的证据不能用于生成一个看似公开的摘要。
第 1 层分块的权限应独立维护还是继承文档权限?
把授权规则落实到切块和上下文扩展。
参考解答
默认分块继承来源文档权限并保存可追踪的 ACL 版本;存在段落级权限时,可以更严格,但不能无依据放宽。独立维护 ACL 会增加同步遗漏风险,最好由来源规则确定性派生。父块和相邻块扩展按各自实际权限检查,不能因一个子块有权就整篇展开。
举一反三:条件变了,怎样推导?
先找出改变的条件,再判断原方案中哪些前提仍成立。下面的案例是教学推演,便于将原理迁移到新问题。
摘要面向多个部门发布
改变的条件:原文仅财务可见,但希望摘要共享
延伸问题:删掉数字后可以把摘要直接变成公开知识吗?
推导与参考解答
不能仅靠文字删减推断授权。摘要仍可能泄露项目存在、预算走势或隐含业务信息。需要一个独立、可审计的发布或脱敏流程,明确批准共享的输出及受众;否则继续继承原文权限。摘要生成和公开发布是两个不同动作。
保持不变的原理:派生内容不会因变短或改写而自动获得更宽权限。
授权服务短暂不可用
改变的条件:从权限明确变成权限未知
延伸问题:为了可用性能否使用昨天缓存的组列表?
推导与参考解答
对敏感知识采取拒绝或限定为明确公开内容。若业务允许带时效的授权快照,需事先规定最大陈旧时间、风险范围和撤权例外,不能临时把未知解释为允许。监测故障并向用户说明当前无法确认访问范围。
保持不变的原理:授权依据失效时,相关性和历史成功都不能补足当前允许读取的证据。
易错点
- 让模型自己生成 tenant_id 或授权组
- 只过滤最终答案,重排和上下文已含私有资料
- 仅用问题文本做跨用户共享缓存键
参考资料
依据公开技术资料设计;参考资料支持技术机制,场景与评分标准为本站设计,不代表某公司面试原题。 新增问答与迁移案例用于原理讲解,来源核查与案例运行验证分别记录。
检查自己理解到哪一步
读完后可以对照这些标准解释原理、边界和取舍。掌握程度由你自评;需要进一步验证时,再完成下方小任务。
- 基础达标
- 检索与读取均基于可信用户身份。
- 中高级信号
- 权限覆盖召回、重排、引用、历史上下文和缓存。
- 资深信号
- 能处理撤销传播延迟、派生数据和旧 Checkpoint 恢复。
巩固练习 按需完成 · 建议 15 分钟
设计权限撤销后对向量索引、缓存与已保存摘要的处理。
展开验收要求与检查点
- 撤销后不可读旧正文
- 缓存不会跨范围返回
- 引用也重新检查授权
重点检查
- 授权身份不能取自模型生成的检索参数
- 分块、重排、缓存、引用都覆盖权限
- 理解检索前后过滤对召回与安全边界的不同影响