面试官问:多租户 RAG 系统怎样实现细粒度权限控制?

哈喽,大家好,我是大都督周瑜。从这篇开始,我会持续更新一系列的AI全栈面试题。这一篇我们来聊这道题:多租户RAG系统,怎样实现细粒度权限控制?
先审题。这道题其实有三个重点:
第一个重点是「多租户」。大家可以想一下:假如现在不是一个RAG系统,就是一个普通的系统,在多租户的情况下,权限控制该怎么做?这是基本功。
第二个重点,是RAG系统的定位。所谓的RAG系统,本质上我们可以把它理解为一个微服务------在整个架构里,它就相当于其中的一个微服务。所以普通微服务的那套权限控制,它都需要。
第三个重点是「细粒度」。这个词其实是在考察你对RAG系统本身的理解:RAG有哪些步骤?每个步骤里如果涉及权限控制,该怎么做?回答之前,脑子里要先有这张地图。
福利:AI 全栈面试题笔记,全套免费领

当然,我这里还有很多其他的AI面试题。想要的同学,在评论区留言「ai」,就可以免费领取全套笔记。
好了,我们回到这道题目。
先看传统系统:权限系统包含哪些部分

在讲多租户之前,先看一个前提。有一种比较偷懒的方式,是在提示词里告诉大模型,让它充当权限系统的角色:用户问了敏感问题就去拒绝,响应里出现敏感字段也不要回复。这种方式相当于让大模型充当权限控制,但很明显不太好。我不是说不能用,得看场景,但真正要做权限控制,还是得有一套完善的权限系统。
一套完善的权限系统,一般包含这几部分:
- 认证:判断当前这个用户是谁------是普通用户还是会员,是员工、leader还是老板。只有先确定了用户是谁,才能判断他能不能查看想查看的数据、能不能执行想执行的动作;
- 鉴权:拿着认证好的身份,判断这次访问是否放行;
- 权限模型:主流的是RBAC,三个对象------用户、角色、权限。leader、普通员工、管理者、人事、财务,这些都是角色;一个角色可以有多个用户,也可能只有一个用户,比如管理员;不同的角色就有不同的权限。
落地到数据库,通常是五张表:用户表、角色表、权限表,加上用户-角色、角色-权限两张关联表。权限本身又分成功能权限(菜单、按钮、接口能不能用)和数据权限(能看到哪个范围的数据)。
微服务架构里,权限控制在哪几层

接下来第二个重点:在微服务架构里,权限控制在哪几个地方做。
- 第一层:API网关。网关会做一层比较粗的控制:判断当前用户是谁,这个请求是哪里来的------是黑客伪造的,还是普通用户通过APP发过来的------以及你要访问的这个服务、这个接口,到底可不可以调。能不能通过网关这一层的判断,是第一道关;
- 第二层:具体的微服务。请求通过网关之后,会进到具体的微服务。如果说是查数据,就要判断当前用户有没有查询权限;如果要修改数据,就要判断有没有修改的权限。在具体的微服务里,可以做更细致的鉴权。
题目里说的「细粒度权限控制」,指的就是类似这样------查询数据的权限、修改删除数据的权限,这种更细致的控制。
把 RAG 系统当成一个微服务

想清楚上面这两层之后,RAG系统就好理解了:它本质上就是一个微服务。所以网关那层控制它要有,服务内部的细粒度鉴权它也要有。
这里要特别强调一句:模型只要看到机密资料,泄露就已经发生,与答案是否展示无关。有一种偷懒的做法是在提示词里要求大模型保密,但Prompt不是权限系统------权限必须由程序来检查。
多租户:先隔离租户,再谈权限

最后是多租户。一套系统同时服务多个公司或组织,不同租户的数据必须严格隔离,所以权限分成两层:
- 第一层是租户隔离:A公司的用户,不能查到B公司的任何数据。数据要带上租户ID,查询的时候也要带上租户ID,一般在ORM或拦截器层面统一拼接过滤条件,要求更高的就上独立的Schema或独立的数据库;
- 第二层是租户内权限:解决租户内部谁能看什么------同一个租户内部,还要继续区分部门、项目和用户。
这两层是两件事,不能混成一个简单的「是否公开」字段。
回到面试题:RAG 的权限控制分四个阶段
铺垫完了,回到题目本身。你可以把RAG系统理解为就是一套CRUD:创建知识库、把文档切分、向量化、存进向量数据库,这相当于往数据库里新增数据;用户来提问,相当于查数据。新增数据和查数据,都需要权限控制。
所以我的答案是:把权限控制放在四个阶段------资料入库、用户检索、模型输入、模型输出。下面一个阶段一个阶段地讲。
阶段1 资料入库:内容和权限一起存

第一阶段是构建知识库。你的文章要放进向量知识库的时候,就要给资料打上权限标签:
- 这个文档属于哪个租户;
- 属于租户内部的哪个部门 、哪个项目;
- 有哪些角色可以查看,是不是只能leader查看;
- 是不是只允许指定用户查看,比如小组组长,其他员工不能看;
- 权限有没有时间范围,比如从今天开始到下周的某个点,到时间自动公开。
同时,文档被切成chunk的时候,chunk也要带上这些权限标签------因为我们真正查数据的时候,查的是chunk。
切分的时候还有个要注意的点:不要以为这篇文章是普通员工可以看的,就代表文章里所有的chunk都是普通员工可以看的。可能文章大部分内容普通员工能看,但中间有一段只有leader能看,这种情况就要按权限边界去切分,对具体的chunk做更细致的权限控制。公开的说明和机密的数据,不能放进同一个chunk里。
阶段2 用户检索:一层一层过滤掉无权的 chunk

第二阶段是用户来检索。当前这个请求、当前这个用户是什么角色、有哪些权限,就只能把对应权限的chunk找出来。
这里可以借助向量数据库的元数据字段,在向量数据库层面直接做过滤:第一步先拿租户ID,把其他租户的chunk全部过滤掉;第二步再按部门过滤,把其他部门的chunk过滤掉。这样一层一层,尽量在检索的时候,就把没有权限查看的chunk过滤掉。
那过滤完返回的这一批chunk------比如20个------是不是就一定能用呢?还不一定。还要到权限系统里再进一步过滤,因为权限系统里的规则可以设计得更细,有可能是向量数据库那些过滤条件覆盖不到的。这一点一定要答。
两个特殊情况也要注意:
- 过滤完一个chunk都不剩:不要去扩大权限重新搜,也不要让模型胡编乱造,直接回答「当前权限下没有可用信息」就可以了。权限这个东西,我宁愿你本来能看到的也看不到,也不能把我不能看到的让你看到------宁可不答,也不能放宽权限;
- 权限服务出现异常:那就是所有请求全部拒绝,不能所有都通过。
阶段3 模型输入:发送之前再校验一遍

chunk从权限服务过滤出来之后,接下来要结合用户的问题、系统提示词,发送给大模型。这里建议再做一遍校验:因为可能存在缓存、权限更新延迟之类的问题,发送之前再确认一遍这些chunk到底有没有权限、这个用户能不能看这些数据。
同时,内部TOKEN、手机号这类字段,要在输入给模型之前隐藏掉、删掉。你不能认为「我只是发给了大模型,它输出的时候不会带出来」------你把隐私数据发出去了,就代表权限控制没做好。
再强调一遍那句话:模型只要看到机密资料,泄露就已经发生,与答案是否展示无关。
阶段4 模型输出:答案也要做过滤

模型回答之后,答案这一层也要做控制。因为可能chunk本身没有问题,但模型在输出的时候,带出了手机号、TOKEN或者金额。
这里有个更隐蔽的情况:就算chunk里没有具体的金额和数字,大模型也可能产生幻觉,给用户「编」一个数字出来。用户不知道这个数字是错的,他只会觉得:你把机密的销售额告诉我了------这就成了机密泄露。
所以对大模型的输出也要做过滤,手机号、令牌、金额等等。做法上,固定格式的信息可以写正则去判断和过滤;复杂的内容比较难判断,所以这一层是补充,真正的防线还是前面几个阶段。
从向量知识库的创建,到检索,到权限服务的过滤,再到模型输入、模型输出------每一层都要做控制,这就是所谓的细粒度权限控制。
别忘了:缓存也要带权限

有些系统还会缓存用户常问问题对应的chunk或者答案。缓存也要区分租户和权限,两个点要注意:
- 权限变化,缓存要跟着更新:比如一个用户本来是开发,后来转成了人事------人还是同一个人,但变成人事之后就不能再看开发的资料了。如果缓存没来得及更新,那肯定就不对;
- 缓存Key要设计好:你的leader和你问了同样的问题,leader的答案被缓存了,你再问同样的问题,肯定不能命中这份缓存。
所以缓存Key里至少要带上租户、权限这些维度,权限变化后旧缓存必须失效。
上线之前:权限测试两个方向都要测

做完这一套权限控制,上线之前要测试,而且两个方向都要测:该看到的能看到,不该看到的看不到。只测拒绝,可能把权限规则写得过严。至少要覆盖这5种情况:
- 两个租户问同样的问题,结果必须分开;
- 同一个租户的不同角色,看到的资料符合各自的权限;
- 用户退出项目后,新请求读不到项目的资料;
- 文档从公开改成机密后,旧缓存不能再返回内容;
- 权限服务超时后,系统拒绝受限制的资料。
测试的时候,要把用户身份、候选Chunk、权限判断、模型收到的Chunk和最终答案这条链路记录下来,出了问题才能定位是哪个环节错了。
总结:四个阶段,一条主线

最后总结一下。面试官问:多租户RAG系统怎样实现细粒度权限控制?就把权限控制放在四个阶段:
- 资料入库:内容和权限一起存,chunk带上权限标签,按权限边界切分;
- 用户检索:先隔离租户,再做权限过滤,无权的直接丢弃,宁可不答也不放宽权限;
- 模型输入:发送前对每个chunk再校验一遍,敏感字段提前清洗;
- 模型输出:答案过滤无权字段和受限结论。
加上缓存要带权限、异常要拒绝、上线前双向测试------这么答,这道题就能拿高分了。
最后
最后感谢大家的观看,希望能得到大家的点赞、收藏、关注,谢谢大家。
作者:IT周瑜(大都督周瑜)| 近二十年 IT 从业经验,做过架构师、技术专家、金牌讲师 | 零一教育创始人,《AI原生超级全栈开发工程师训练营》主讲人 | 公众号:「IT周瑜」