设计企业内部知识库助手:不同部门的权限隔离怎么做?

Q8-02场景设计 · 企业知识库与权限隔离高频场景设计五步结构权限隔离前置过滤缓存分桶多租户

谁在问:toB 场景必问;有安全评审经验的面试官会用「陷阱式提问」开场

口语化问法

  • 公司两千人,各部门文档权限不一样,这个助手怎么保证不越权?
  • 你在 prompt 里怎么写,才能让它不把 HR 的东西讲给普通员工?
  • 多租户的 RAG,隔离你打算做在哪一层?

考察意图

第二种问法是陷阱:它假设权限可以靠提示词实现。正确反应不是回答「怎么写」,而是指出前提错了——模型无法可靠区分「指令」与「数据」,真防线在检索层与执行层。这一问几乎能一刀切开做过和没做过的人。

除此之外还考三件事:

  1. 你知不知道前置过滤会改变检索的统计特性。只说「加元数据过滤」的人,上线后会遇到「安全了但不好用」,然后被业务压回后置。
  2. 你有没有考虑权限的动态性。调岗、改密级、项目组解散——静态配好不等于长期正确。
  3. 你会不会想到缓存。这是泄露的高发通道,也是最容易被漏掉的一环。

参考答案

图 2 · 60 分与 90 分差在哪:代价、演进、怎么验证

60

60 分答案(及格线)

给每篇文档打上部门和密级标签,用户登录后拿到他的权限组,检索时在向量库里做元数据过滤,只召回他有权限的文档。生成时再校验一遍,引用也只给有权限的。另外做好审计日志,谁问了什么、返回了哪些文档都记下来。

这是正确答案的骨架,及格没问题。缺的是三样:过滤前置之后召回质量的变化没提、权限变更的一致性没提、缓存完全没提——而这三样正是上线后真正会出事的地方。

90

90 分答案(有生产经验的回答)

① 先问四个问题:权限模型是什么形态——部门树、项目组、还是矩阵式(一个人属于多个组)?密级是几档、有没有「同级不可见」这种横向隔离?合规要求到什么程度——是内控还是有外部审计?现在文档在哪、权限是谁在维护——如果权限本身在多个系统里各有一份且不一致,那才是这个项目真正的难点

② 基线:单索引 + 元数据前置过滤 + 重排 + 引用回查。这套东西能覆盖绝大多数内控级需求,成本低、跨部门检索也做得了。先摆基线,是因为很多团队一上来就要「每个部门一个库」,而那个方案的维护成本往往超出预期。

③ 加挂,每样说代价

  • 前置过滤而非后置解决什么:受限内容根本不进上下文。为什么必须前置:一旦进了上下文就失去了控制——提示词挡不住,而且后置过滤面对的是模型揉合过的自然语言,正则根本抓不到。代价:候选集变小,检索的统计特性变了——过滤后 top-k 会被弱相关文档填满。配套动作:召回数要比无过滤时放大三到五倍再重排(比如 10 提到 40、重排回 8)。这一条是分水岭:做对了前置却忘了调参,结果就是「安全但不好用」。
  • 分层隔离而不是一刀切。少数高密级内容(薪酬、并购、法务)走物理隔离——独立索引,误配的爆炸半径最小;其余走逻辑隔离代价:两套机制都要维护。什么时候不该用物理隔离:租户多且小、或者业务上需要跨部门检索时,物理隔离会让索引数量爆炸且跨域检索做不了。
  • 四个落点的纵深:入库时打标(分块继承文档权限)→ 检索时前置过滤 → 组装 prompt 前二次校验(防并发与缓存漂移)→ 输出时每条引用回查权限。引用回查命中不可见文档时,整条答案降级为「无法回答」,而不是悄悄删掉那条引用——因为答案的内容可能已经来自那篇文档了。
  • 权限的动态一致性(这层最容易被漏)。人会调岗、文档会改密级。要处理三件事:索引里的权限标签是快照,改密级后标签、分块、以及缓存都要失效;权限判定要实时查权限系统而不是把权限烤进索引;审计要记「当时的判定依据」,因为审计问的是「他在那个时间点有没有权限」。
  • 缓存必须按身份分桶。同一个问题,不同权限的人应该拿到不同答案。如果缓存键里没有身份或权限组维度,缓存本身就是一条泄露通道——而且它绕过了你所有的过滤逻辑。这是「语义缓存的正确性责任转移到你」这条口径在权限场景的具体形态。

④ 评测:这个场景的评测要分成两套。功能侧照常:真实问题集、三条线、零成本信号。安全侧要单独建一个越权测试集——用低权限身份去问高权限内容,断言必须是负向断言(不出现某类信息),而不是「答得好不好」。这个集合要覆盖:直接问、绕着问、引用诱导、以及多轮里先问无关问题再回指。安全侧的判定标准是零容忍,任何一条命中都是阻断发布的。

⑤ 演进:出现「跨部门协作场景需要临时授权」时,才引入基于任务的动态授权;出现「同一个人在不同项目里权限不同」时,才从部门树升级到属性访问控制。退路:如果权限系统本身的数据质量撑不住细粒度,退回到「粗粒度过滤 + 敏感内容全部走人工」,宁可少答。

追问链

图 1 · 五层追问树:面试官会往哪儿挖
场景独有的约束是「越权一次就是合规事故」:五层全在压防线摆在哪一层

  1. 在 prompt 里写清楚权限规则,让它自己判断,行不行?

    期望不行,要说机制不只给结论:① 模型无法可靠区分「指令」与「数据」,检索回来的文档本身可能带影响行为的文字;② 即使它「愿意」遵守,受限内容已经进了上下文,越狱、多轮回指、摘要请求都可能带出来;③ 这类防护不可审计。正确位置是检索层前置过滤与执行层引用回查
    信号说出「进了上下文就已经失控」→ 理解本质;只说「模型不可靠、可能被绕过」→ 经验之谈但不够硬
  2. 前置过滤后召回质量下降,业务抱怨「问什么都说没有」,怎么办?

    期望① 先确认这是统计特性变化不是 bug —— 过滤缩小候选集,同样召回数拿到的相关文档更少;② 对策是放大召回再重排(3–5 倍),不是放宽权限;③ 查是不是分块继承权限出错误滤了有权限的块;④ 产品兜底:告诉用户「有但你不能看」,比让他以为没有更好,前提是提示本身不泄露内容
    信号答「放宽一点权限」→ 直接不及格;提得出「放大召回再重排」并考虑「存在但不可见」的表达 → 真上线过
  3. 人调岗了、文档改密级了,怎么保证立刻生效?

    期望三层:① 权限判定实时查权限系统,索引里只存归属标签,别把权限烤进索引;② 改密级触发级联失效 —— 文档标签、所有分块、所有相关缓存条目;③ 审计日志记当时的判定依据,事后追责问的是那个时间点的状态。加分:人事系统同步周期才是真正的暴露窗口,要有「离职调岗立即冻结」旁路
    信号提得到人事系统同步延迟这个真实暴露窗口 → 处理过真实事故
  4. 缓存怎么处理?会不会成为泄露通道?

    期望会,且最隐蔽:① 缓存键必须含身份或权限组维度,否则第一个有权限的人问过,后面无权限的直接命中;② 精确与前缀缓存分桶就安全,语义缓存的正确性责任完全转移到你 —— 相似问题可能跨权限组命中,调高阈值只降命中率不提准确率;③ 保守做法:涉密内容一律不进语义缓存
    信号分得清「精确/前缀分桶就够」和「语义缓存责任在你」→ 口径准确;完全没想到缓存 → 只做过单租户
  5. 安全评审要求「每个部门一个独立库」,你算过账觉得不值,怎么谈?

    期望先承认他们真正要的是什么 —— 不是「独立库」这个实现,是爆炸半径可控与可审计;把需求和实现分开是谈判第一步 → ② 给等价保障:过滤条件写死在检索层不由调用方传入、有越权测试集且零容忍、审计链路完整 → ③ 摆成本:物理隔离代价是索引爆炸、跨部门检索做不了、每次组织调整都要迁数据 → ④ 折中:高密级物理隔离 + 其余逻辑隔离,判据是后果是否不可挽回
    信号硬顶「成本太高不划算」→ 缺协作;直接照做 → 缺主张;把需求与实现分开、给等价保障和折中判据 → 能和安全团队共事
第二种问法本身就是陷阱 —— 它假设权限可以靠提示词实现。正确反应不是回答「怎么写」,而是指出前提错了;这一问几乎能一刀切开做过和没做过的人。第 2 层的召回劣化则是只读过方案的人从没想过的连带代价。

评分要点

  1. 明确指出权限不能靠 prompt,并说清「进了上下文就失控」的机制
  2. 过滤前置,且知道要配套放大召回再重排
  3. 说得出四个落点(入库打标 / 检索过滤 / 组装校验 / 引用回查)
  4. 引用回查命中不可见文档时整条答案降级,而非删引用
  5. 处理权限动态性:实时判定、级联失效、审计记当时依据
  6. 缓存分桶,且区分精确/前缀缓存与语义缓存的责任差异
  7. 安全侧有独立的越权测试集,用负向断言、零容忍
  8. 面对物理隔离要求能拆「需求 vs 实现」,给等价保障与折中判据

常见错误

「在 system prompt 里说明权限规则」不理解模型无法区分指令与数据,安全评审一票否决
先检索再过滤(后置过滤)受限内容已进上下文,且 top-k 被占满
做了前置过滤但不调召回参数上线后「安全但不好用」,被业务压回后置
完全不提缓存只做过单租户,最隐蔽的泄露通道没堵
「权限配置好就行了」忽略调岗、改密级、同步延迟的动态一致性
评测只有功能侧,没有越权测试集安全需求无法证明,不可发布
引用里出现用户不可见的文档链接最容易被安全评审当场抓到的低级错误
面对物理隔离要求只会说「成本太高」没有把需求与实现分开,谈不动

关联学习