知识库权限为什么一定要进检索层?一次讲清文档权限、分段权限与结果过滤边界

大家好,我是一名有 4 年工作经验的 Java 后端开发。
企业知识库项目一旦上线,最危险的问题之一往往不是“答错了”,而是“答了不该答的内容”。
这篇文章我想系统聊一聊,知识库权限到底应该怎么做,为什么它一定不能只放在前端或者回答后处理。

🦅个人主页
🐼


一、为什么知识库权限是核心问题

因为企业内部文档天然有很多权限边界:

  • 部门文档
  • 项目文档
  • 制度文档
  • 敏感技术资料

如果权限做得不对,最容易出现:

  • 用户虽然没权限看文档全文
  • 但模型已经基于该文档回答了问题

这比普通列表越权更隐蔽,也更危险。


二、为什么不能只做前端权限

因为前端权限控制解决的是:

  • 页面上看不看得到

但知识库问答真正的风险在于:

  • 检索层是不是已经把不该看的文档召回出来

一旦召回出来,后面即使前端不展示原文,模型也可能已经在生成答案时泄漏了内容。

所以更合理的原则是:

权限必须前置到检索层,而不是后置到展示层。


三、推荐的权限控制层次

我更建议至少做三层:

3.1 文档级权限

谁能访问这份文档。

3.2 分段级权限

同一文档的不同片段权限可能也不同。

3.3 检索结果过滤

召回前或召回后都必须基于当前用户权限做约束。

这样回答链路才会更安全。


四、最关键的几个设计点

4.1 权限元数据要跟索引一起走

不要等检索出来再临时查一遍,很容易出错。

4.2 用户权限上下文要稳定

例如:

  • 角色
  • 部门
  • 项目组
  • 租户

4.3 回答拼接前还要再过一层过滤

多一层保险很有必要。

4.4 引用来源展示也必须受权限约束

否则即使答案裁掉了,来源标题也可能泄漏信息。


五、最容易踩的坑

5.1 只有前端菜单权限,没有检索权限

这是最常见的大坑。

5.2 检索前不过滤,只在回答后裁剪

已经太晚了。

5.3 文档权限和索引元数据脱节

后面很难统一治理。

5.4 权限变更后索引没同步更新

很容易遗留老问题。


实战案例:放到真实项目里会怎么跑

比如人事制度文档只允许 HR 看,采购流程文档只允许采购团队看,如果权限只是前端隐藏,模型仍然可能把不该看的内容召回出来。

  1. 检索前先拿到当前用户的数据范围。
  2. 召回候选集就按文档 ACL 做过滤。
  3. chunk 级别有单独权限时也要继续下沉。
  4. 最终答案只基于过滤后的上下文生成。

Java 代码示例

@Service
@RequiredArgsConstructor
public class KnowledgePermissionFilterService {
    private final PermissionService permissionService;

    public List<Chunk> filter(Long userId, List<Chunk> chunks) {
        Set<Long> allowedDocIds = permissionService.queryAllowedDocIds(userId);
        return chunks.stream()
            .filter(chunk -> allowedDocIds.contains(chunk.getDocId()))
            .toList();
    }
}

SQL 示例

CREATE TABLE kb_doc_acl (
    doc_id BIGINT NOT NULL,
    subject_type VARCHAR(16) NOT NULL,
    subject_code VARCHAR(64) NOT NULL,
    permission_code VARCHAR(32) NOT NULL,
    PRIMARY KEY (doc_id, subject_type, subject_code)
);

SELECT doc_id
FROM kb_doc_acl
WHERE subject_type = 'DEPT'
  AND subject_code = 'HR'
  AND permission_code = 'READ';

六、面试中怎么回答

如果面试官问你:

企业知识库权限一般怎么设计?为什么一定要进检索层?

你可以这样回答:

第一,知识库权限和普通后台权限最大的不同在于,它不是只控制“看不看页面”,而是要控制“模型能不能拿到这段知识”。所以如果权限不进入检索层,而只是放在前端或回答后裁剪,风险仍然很高。

第二,我通常会把权限至少拆成文档级权限和检索结果权限,并把权限元数据和索引一起存储,这样召回和生成阶段都能稳定判断当前用户有没有权看到这段内容。

第三,真正落地时我还会在回答组装前再做一次结果过滤,保证模型最终拿到的上下文也在用户权限范围内,这样比只做单层过滤更稳。


七、总结

知识库权限真正难的,不是“谁能打开文档”,而是如何保证:

  • 谁能检索到
  • 谁能引用到
  • 谁能被模型基于其回答

如果只记一句结论,我觉得可以记住这句:

企业知识库权限最关键的一条原则,就是“权限必须进入检索层,而不是只停留在展示层”。


八、结尾

如果你觉得这篇文章对你有帮助,欢迎点赞、收藏、关注。
后面这个知识库平台系列我会继续往下写检索策略和重排能力。

更多推荐