这篇学完你能回答什么
- 企业知识库里不同部门的权限隔离怎么做?为什么不能靠 prompt 让模型「不要透露」?
- 权限过滤放在检索前和检索后,差别有多大?
- 什么时候该转人工?转人工率高到什么程度说明方案有问题?
从一个真实故障讲起
一家两千人公司的内部知识库助手,上线两个月,风评很好。直到有一天,一个刚入职三个月的运营同事随口问了一句「我们公司调薪一般是什么节奏」,助手回了一段相当详细的答案,里面有职级带宽的区间。
那份文档是 HR 的,密级是「仅 HR 与总监以上」。
排查发现两个问题叠在一起。第一,权限过滤做在了生成之后——检索是全库检索,取回 top-10,然后在 prompt 里写了一句「以下文档中标记为受限的内容,不要向无权限用户透露」。第二,那次的 top-10 里有 7 篇是 HR 文档,模型在拼答案时把其中的数字揉进了一段看起来无害的概述里,输出中没有出现任何「受限」字样,后置的正则过滤也就没拦住。
修法很直接:把权限过滤前移到向量检索的元数据过滤里,检索阶段就只在这个人有权看的集合内召回。上线后又发现了第二个问题——运营同事问 HR 相关的问题,助手开始频繁地答「没有找到相关内容」,而其中有些内容他其实是有权看的:因为过滤后候选集变小,top-k 里塞进了大量弱相关文档,重排也救不回来。最后是把召回数从 10 提到 40、过滤后再重排到 8 才稳住。
这两个问题合起来就是这一篇要讲的第一条硬约束:权限不是一个可以挂在末端的过滤器,它是一条必须贯穿整条链路的不变量,而且它会反过来影响你的检索参数。
运营同事随口一问
「我们公司调薪一般是什么节奏」
全库检索 top-10
其中 7 篇是 HR 文档
prompt 里叮嘱一句断点
「标记为受限的内容不要透露」
数字被揉进概述
「仅 HR 与总监以上」的职级带宽
后置正则没拦住
输出里根本没出现「受限」两个字
核心概念:先打比方,再给定义
比方:门禁不能装在出口
一栋楼把门禁装在大门口,和装在每个人离开时的出口处,安全性完全不同。装在出口,意味着人已经进去过、看过、记住了;你只能拦住他把东西带出去,拦不住他知道。
模型就是那个「已经看过」的人。只要受限内容进了上下文,你就已经失去了控制——因为项目的第一条冻结口径就是:模型无法可靠区分「指令」与「数据」,真正的防线在执行层与权限层,不在提示词里。
定义
- 前置过滤(pre-filtering)——在检索发生之前,把候选集限定在当前身份可见的范围内。代价是召回候选变少、检索参数要重调。
- 后置过滤(post-filtering)——先全量检索,再从结果里剔除无权限的。代价是受限内容已经进过上下文,且 top-k 会被高相关但无权限的文档占满,导致「有权限的内容反而召不回」。
- 分级自治(graduated autonomy)——按操作的不可逆程度决定自动执行、先确认、还是只给建议。这是人机协同的骨架,不是「不确定就问人」这么随意的东西。
- 转人工(escalation)——把会话连同上下文移交给人。注意它有两个独立的问题:什么时候转(触发条件)和转得干不干净(交接质量)。
没权限的人根本进不来
代价是能走的门变少了,楼里的动线得重新排一遍
检索发生之前就把候选集限定在可见范围
代价是召回候选变少、检索参数要重调
只拦得住他把东西带出去
拦不住他已经进去过、看过、记住了
先全量检索,再从结果里剔除无权限的
受限内容已经进过上下文;top-k 被高相关但无权限的文档占满
原理拆解
- 查询、汇总自动执行,事后抽样
- 草稿、打标记自动执行 + 通知
- 工单状态、库存先确认,展示将要做什么
- 付款、发信、删数据必须人工签字 + 二次确认
主轴之上再叠三个转人工的触发信号:置信度低(检索没命中、答案与证据不一致)、用户情绪或表述升级(重复提问、明确表达不满)、命中黑名单主题(法律、投诉、医疗、资金)。它们是触发条件,不是分级依据。
交接质量比触发时机更容易被忽略。合格的交接要带三样过去:用户的原始诉求(不是模型的复述)、已经尝试过什么、模型判断的不确定点。缺了这三样,用户得从头再说一遍,转人工反而变成负体验。
一、权限的四个落点,缺一个就漏
入库时 ── 检索时 ── 组装时 ── 输出时 打标签 前置过滤 二次校验 引用校验 │ │ │ │ │ │ │ └ 每条引用都要回查一次权限,防「引用了看不到的文档」 │ │ └ 拼 prompt 前再校验一次,防缓存和并发带来的漂移 │ └ 元数据过滤 / 分区路由,**必须在向量检索之前** └ 文档、分块都要带密级与归属,且分块继承文档权限
四个落点里,检索时的前置过滤是主防线,其余三个是纵深。只做主防线会漏并发和缓存场景,只做纵深等于没做。
二、三种隔离级别的取舍
| 级别 | 做法 | 解决什么 | 代价是什么 | 什么时候不该用 |
|---|---|---|---|---|
| 物理隔离 | 每租户 / 每密级一个独立索引或库 | 隔离最彻底,误配的爆炸半径最小 | 索引数量爆炸、跨域检索做不了、资源利用率低 | 租户多且小、需要跨部门检索时 |
| 逻辑隔离 | 单索引 + 元数据前置过滤 | 成本低、跨域检索容易 | 过滤条件写错就是全量泄露;过滤后候选变少要重调参数 | 强合规、审计要求物理边界时 |
| 混合 | 高密级物理隔离 + 其余逻辑隔离 | 把爆炸半径按密级分层 | 两套机制都要维护 | 团队小、维护不动两套时 |
多数企业场景的正确答案是混合,但答题时必须说清「哪一部分走物理、判据是什么」,否则等于没选。
三、权限是会变的——一致性才是真难点
这是分水岭最深的一层。权限不是静态的:人会调岗,文档会改密级,项目组会解散。三个必须处理的点:
- 索引里的权限标签是快照。文档改密级后,索引里的标签、已经切好的分块、以及缓存里的检索结果都要失效。很多系统栽在缓存上。
- 前缀缓存与语义缓存要按身份分桶。同一个问题,不同权限的人应该拿到不同答案;如果缓存键里没有身份维度,缓存本身就是泄露通道。这是语义缓存「正确性责任转移到你」这条口径在权限场景的具体形态。
- 权限变更要能追溯。审计要问的是「他在那个时间点有没有权限」,所以日志要记当时的判定依据,不能只记结果。
四、人机协同:按不可逆程度分级,不是按置信度
常见的错误设计是「模型不确定就转人工」。置信度只是一个输入,真正的主轴是操作的不可逆程度:
只读查询 → 自动执行,事后抽样 可逆写入(草稿、标记)→ 自动执行 + 通知 难逆写入(工单状态、库存)→ 先确认,展示将要做什么 不可逆(付款、发信、删数据)→ 必须人工签字,且要有二次确认
在这条主轴之上,再叠三个转人工的触发信号:置信度低(检索没命中、答案与证据不一致)、用户情绪或表述升级(重复提问、明确表达不满)、命中黑名单主题(法律、投诉、医疗、资金)。
转人工的交接质量比触发时机更容易被忽略。合格的交接要带三样东西过去:用户的原始诉求(不是模型的复述)、已经尝试过什么、以及模型判断的不确定点。缺了这三样,用户要从头再说一遍,转人工反而变成负体验。
五、转人工率是一个被低估的零成本信号
它不需要标注、不需要 judge,实时可得,而且方向明确:
- 转人工率突然升高 → 通常是检索侧或上游数据出了问题;
- 转人工率长期偏高且稳定 → 说明覆盖面不够,该扩知识库或扩流程,不是该换模型;
- 转人工率过低 → 反而是危险信号,说明兜底门槛设得太高,模型在硬答。
最后一条最容易被漏。评估一个 toB 助手,只看「答对率」不看「该转没转的比例」,是在奖励它硬答。
工程实践(截至 2026-08)
参数经验值
| 项 | 经验值 |
|---|---|
| 前置过滤后的召回数 | 过滤会显著缩小候选集,召回数要比无过滤时放大 3–5 倍再重排(例如 10 → 40,重排回 8) |
| 缓存分桶 | 缓存键必须含身份或权限组维度;跨身份共享缓存等于开了泄露通道 |
| 引用校验 | 每条引用回查权限,命中不可见文档时整条答案降级为「无法回答」,而不是删掉那条引用 |
| 转人工率 | 稳态一般落在个位数到十几个百分点;长期低于 2% 要怀疑是不是在硬答 |
| 不可逆操作 | 一律人工签字,且确认页要展示「将要做什么」的自然语言摘要而不是原始参数 |
避坑清单
- 绝不用 prompt 做权限。「不要透露受限内容」这类写法在第一条冻结口径下就是无效的。
- 过滤必须前置,并且要重调召回参数——很多团队做对了前置、忘了调参,结果是「安全了但不好用」,然后被业务压回后置。
- 别忘了缓存。权限做得再好,一个不分桶的语义缓存就能全漏。
- 引用要回查。答案里给出用户看不到的文档链接,是最容易被安全评审抓到的低级错误。
- 分级自治按不可逆程度设计,置信度只是触发信号之一。
- 转人工要带上下文,否则用户体验比没有 AI 更差。
- 监控「该转没转」,不要只监控答对率。
| 落点 | 做什么 | 主防线还是纵深 |
|---|---|---|
| 入库时 · 打标签 | 文档、分块都要带密级与归属 | 纵深 —— 分块继承文档权限,不是只给文档打标 |
| 检索时 · 前置过滤主防线 | 元数据过滤 / 分区路由 | 必须在向量检索之前;放到之后就成了后置过滤 |
| 组装时 · 二次校验 | 拼 prompt 之前再校验一次 | 纵深 —— 防缓存和并发带来的权限漂移 |
| 输出时 · 引用校验 | 每条引用都回查一次权限 | 纵深 —— 防「引用了看不到的文档」,安全评审最爱抓这条 |
- 隔离级别怎么选
- 多数企业是混合:高密级走物理隔离、其余逻辑隔离;答题必须说清哪部分走物理、判据是什么
- 前置过滤后的召回数
- 过滤会显著缩小候选集,召回数要比无过滤时放大 3–5 倍再重排(10 → 40,重排回 8)
- 缓存分桶
- 缓存键必须含身份或权限组维度;跨身份共享缓存等于开了一条泄露通道
- 引用校验
- 命中不可见文档时整条答案降级为「无法回答」,而不是把那条引用删掉了事
- 转人工率
- 稳态一般落在个位数到十几个百分点;长期低于 2% 要怀疑是不是在硬答
- 不可逆操作
- 一律人工签字,确认页展示「将要做什么」的自然语言摘要,而不是原始参数
面试视角
- 先掀掉前提被问「prompt 怎么写才不泄露」,第一反应是说这个前提错了
- 权限讲三段四个落点 → 三种隔离级别 → 一致性,缺一段就露怯
- 把一致性讲透调岗、改密级、索引与缓存失效 —— 多数人只讲到元数据过滤
- 人机协同讲四件不可逆主轴 + 三个触发信号 + 交接三要素 + 转人工率三种读法
- 主动交出转人工率把「该转没转的比例」摆上来,而不是只报一个答对率
- 「在 prompt 里说明权限规则,让它不要透露」
- 「加个元数据过滤就行」,不提候选集会因此变小
- 只讲检索时过滤,说不出另外三个落点,也不提缓存
- 「权限配好就完事了」,没有调岗和改密级这一层
- 「模型不确定就转人工」,转人工只讲触发不讲交接
- 知道模型不可靠区分指令与数据,防线在检索层与执行层
- 知道前置过滤缩小候选集,召回要放大 3–5 倍再重排
- 讲得出入库打标、组装二次校验、引用回查;缓存键含身份维度
- 讲得出调岗、改密级、索引与缓存失效的一致性问题
- 主轴是不可逆程度;交接带三要素,且知道转人工率过低更危险
Q8-02、Q8-03、Q3-19。面试官会怎么问
toB 场景题里,权限和转人工是必然会被追到的两点,而且往往以「陷阱式」提问出现:「你在 prompt 里怎么写才能保证它不泄露?」——正确反应不是回答怎么写,而是指出这个问题的前提就是错的。
答题结构建议
权限部分按「四个落点 + 三种隔离级别 + 一致性」三段讲,其中一致性那段是拉开差距的地方——大多数人只讲到「元数据过滤」。人机协同部分按「不可逆程度主轴 + 三个触发信号 + 交接三要素 + 转人工率的三种读法」讲。
分水岭信号
| 只读过 | 真做过 |
|---|---|
| 「在 prompt 里说明权限规则」 | 知道模型不可靠区分指令与数据,防线在检索与执行层 |
| 「加个元数据过滤就行」 | 知道前置过滤会缩小候选集,召回数要放大 3–5 倍再重排 |
| 只讲检索时过滤 | 讲得出入库打标、组装二次校验、引用回查四个落点 |
| 不提缓存 | 知道缓存键必须含身份维度,否则缓存就是泄露通道 |
| 「权限配好就完事了」 | 讲得出调岗、改密级、索引与缓存失效的一致性问题 |
| 「模型不确定就转人工」 | 主轴是不可逆程度,置信度只是触发信号之一 |
| 转人工只讲触发 | 讲得出交接三要素,知道交接差会让体验比没 AI 更糟 |
| 只看答对率 | 把转人工率当零成本信号,并且知道过低是危险信号 |
小结与延伸
继续深入
本篇归属第 8 章「场景设计题」,去做这一章的题。