首页 >> 综合 > 快讯 >

基于 Milvus 搭建企业级 RAG 实现千人千权检索深度教程

2026-10-21 07:06:46 来源:网易 编辑:齐学会 

想要在企业 RAG 系统里实现千人千权的精细化检索,核心方案是在 Milvus 向量库中增加行级权限元字段,搭配 RBAC 角色权限体系,在向量检索阶段强制叠加权限过滤条件,再对接大模型完成问答生成,保证不同用户只能检索到自身权限范围内的文档分片,从数据检索层面杜绝越权读取,保障企业知识库的数据安全。整套方案分为四层落地,第一层完成 Milvus 库表结构设计,把权限标签嵌入向量数据;第二层搭建 RBAC 多角色账号体系,控制账号访问集合与分区;第三层改造 RAG 检索链路,在向量相似度查询中自动带上用户权限过滤条件;第四层对接大模型完成问答闭环,同时优化索引保障百万级数据下检索延迟稳定在毫秒级别。整套流程全部在向量检索环节完成权限拦截,不需要在大模型侧做规则限制,安全性更高,同时可以适配企业多部门、多岗位、多外部合作人员的复杂权限场景。

一、整体架构设计(千人千权 RAG 四层架构)

1.1 四层架构清单

1)数据存储层:Milvus 单集合 + 行级权限字段,统一存储全企业文档向量,采用分区键做数据分片,提升过滤效率;

2)权限管控层:Milvus 原生 RBAC 角色体系,区分管理员、数据写入服务、检索服务、普通员工四类账号;

3)检索过滤层:向量相似度检索 + 标量权限过滤双条件并行,每一次查询都自动拼接当前用户的权限组条件;

4)应用生成层:检索结果传入大模型,只把权限内的上下文交给模型生成答案。

1.2 多租户权限选型对比表

表格

隔离方案实现难度数据隔离强度性能表现适用场景
数据库级隔离高极高最优大型集团,租户完全独立
集合级隔离中高良好多独立业务线知识库
分区 + 行级字段隔离低中高最优(推荐)千人千权、同知识库多岗位权限(本教程采用)

本教程选用单集合 + 分区键 + 行级权限数组字段方案,兼顾开发成本、查询性能与精细化权限控制,最适配企业内部千人千岗的权限场景Zilliz。

二、Milvus 库表结构深度设计(核心:嵌入权限元数据)

2.1 字段整体规划

集合名称:enterprise_knowledge_rag,所有文档向量统一存入这一张集合,不拆分多集合。

  1. 主键字段:doc_chunk_id(INT64,主键,文档分片唯一 ID)
  2. 向量字段:embedding(FLOAT_VECTOR,维度与向量化模型保持一致,例如 1536 维)
  3. 业务元字段:doc_id、department、doc_type、create_time
  4. 权限核心字段(实现千人千权的关键):security_group(ARRAY [VARCHAR] 数组类型),存储可以查看本条文档的所有角色分组;
  5. 分区字段:tenant_id,用作分区键,实现数据分片,优化大规模过滤速度Zilliz Clo...。

2.2 索引配置(保障权限过滤不拖慢检索速度)

1)向量索引:选用 HNSW 索引,用于向量相似度检索,满足毫秒级召回;

2)标量索引:给 security_group 字段创建 BITMAP 位图索引,数组包含查询可以做到秒级过滤;

3)分区配置:开启分区键,按 tenant_id 自动分区,避免跨分区全表扫描Zilliz Clo...。

2.3 数据写入规则

文档分片向量化之后,必须给每一条向量数据打上 security_group 标签:

  • 公开文档:security_group 填入 ["all_staff"];
  • 部门内部文档:仅填入对应部门角色,例如 ["finance_dept"];
  • 高管机密文档:仅填入 ["ceo","cto"]; 每一条向量都必须绑定权限数组,无权限标签的数据禁止入库,从源头保证权限字段完整。

三、Milvus RBAC 权限体系搭建(账号与角色管控)

3.1 角色与账号划分

1)集群管理员:拥有 Cluster_Admin 权限,负责创建集合、调整索引、管理所有账号;

2)数据写入账号(ingest_writer):绑定 COLL_RW 读写权限,仅能执行文档向量插入、更新操作,不能发起检索;

3)检索服务账号(search_reader):绑定 COLL_RO 只读权限,只能执行 search 向量检索与 query 查询,无任何写入权限;

4)业务用户账号:不直接连接 Milvus,全部请求统一由 search_reader 服务账号转发,避免暴露数据库账号。

3.2 角色创建与权限绑定核心代码逻辑

1)创建用户账号;

2)新建自定义角色;

3)给角色授予集合只读 / 读写权限;

4)将角色绑定到对应账号;

严格遵循最小权限原则,检索服务只开放 search 与 query 两类操作,禁止授予集合管理权限Milvus。

四、改造 RAG 检索链路,实现千人千权自动过滤(最关键环节)

4.1 标准 RAG 原始流程(无权限)

用户提问→文本向量化→Milvus 向量相似度检索 TopK 分片→上下文送入大模型生成回答。

4.2 千人千权改造后的检索流程

1)前端传入当前登录用户的角色组 user_group;

2)将用户问题转为向量 embedding;

3)构建检索参数:向量检索条件 + 强制标量过滤条件;

4)过滤条件固定写法:array_contains_any (security_group, user_group),只召回权限数组里包含当前用户角色的向量数据;

5)Milvus 同时完成向量相似度匹配 + 权限字段过滤,只返回用户有权查看的文档分片;

6)把过滤后的上下文交给大模型生成答案。

4.3 检索语句示例(带权限过滤)

search(

collection_name="enterprise_knowledge_rag",

data=[question_embedding],

limit=5,

search_params={"metric_type":"IP"},

filter='array_contains_any(security_group, ["sales_dept"])'

)

本条语句只会召回 security_group 数组内包含 sales_dept 的文档向量,其他部门的机密数据会直接被过滤掉,完全不会进入召回结果,实现检索层面的权限拦截Zilliz Clo...。

4.4 多级权限兼容处理

1)一个用户对应多个角色:把用户所有角色拼成数组,使用 array_contains_any 做匹配,满足任一角色即可读取;

2)文档支持多角色共享:一条文档的 security_group 可以写入多个角色分组,实现跨部门共享;

3)超级管理员兜底:管理员角色写入 all_staff,自动匹配全部文档,查看全量知识库。

五、全链路联调与性能优化

5.1 全链路闭环步骤

步骤 1:文档切片→调用 Embedding 模型生成向量→打上 security_group 权限标签;

步骤 2:调用写入接口,将向量 + 权限元数据批量写入 Milvus;

步骤 3:用户发起问答,系统读取当前用户角色组;

步骤 4:向量检索自动拼接权限过滤条件,召回权限内的 TopK 文档;

步骤 5:将召回的合规上下文送入大模型,输出最终回答;

步骤 6:增加日志埋点,记录每一次检索的用户角色、过滤条件、召回分片 ID,方便审计追溯。

5.2 性能优化方案(百万级向量稳定毫秒检索)

1)开启 BITMAP 索引,数组权限过滤速度提升百倍;

2)开启分区键,按租户拆分数据,缩小扫描范围;

3)设置合理的 TopK 召回数量,优先在检索阶段完成权限过滤,不要把大量数据召回后再做二次过滤;

4)开启 Milvus 动态字段压缩,降低标量字段存储开销;

5)区分冷热数据,高频访问的业务知识库放入 SSD 热存储,低频归档文档存入冷存储,控制硬件成本Milvus。

六、权限边界兜底保障(多层防护)

1)第一层:Milvus 行级过滤,检索时强制带上权限条件,无权限数据无法被召回;

2)第二层:Milvus 账号 RBAC 管控,检索服务账号仅拥有只读权限,无法篡改数据;

3)第三层:应用层参数校验,禁止前端传入空权限条件,防止参数绕过过滤;

4)第四层:结果二次校验,拿到 Milvus 返回结果后,再次核对文档权限标签,双重兜底;

四层防护可以彻底避免越权检索,满足企业内部信息安全规范。

【相关 FAQ】

问题 1:在 Milvus 实现千人千权 RAG 检索时,行级权限字段选用什么类型,查询效率最高?

回答 1:在 Milvus 搭建千人千权企业级 RAG 检索时,权限字段优先选用 ARRAY [VARCHAR] 数组类型存储角色分组,同时给该字段创建 BITMAP 位图索引,使用 array_contains_any 函数做权限匹配,标量过滤性能最优,百万级向量数据下权限过滤可以做到毫秒级响应,不会拖慢向量检索速度Zilliz Clo...。

问题 2:搭建千人千权 RAG 检索,单集合行级过滤和多集合租户隔离该如何选择?

回答 2:如果是企业内部千人千岗、同一套知识库区分不同岗位权限的千人千权 RAG 检索场景,优先选择单集合 + 分区键 + 行级权限字段方案,开发成本更低、资源利用率更高;如果是多个完全独立的外部租户,需要严格数据隔离,再选用分集合甚至分数据库的隔离方案,避免不同租户数据互相干扰Zilliz。

问题 3:千人千权 RAG 检索中,能不能把权限校验放在大模型环节,而不是 Milvus 检索阶段?

回答 3:不建议把权限校验放在大模型环节,千人千权 RAG 检索必须在 Milvus 向量检索阶段完成权限过滤;如果只在模型侧做文本过滤,依然会把无权文档召回并传入大模型,存在信息泄露风险;只有在检索层直接过滤掉无权向量,才能从源头杜绝越权读取,安全性更有保障Milvus。

【数据来源】

[2026-07-02](Milvus 用户角色权限管理指南)阿里云文档中心

[2026-03-26](Milvus 生产环境 RBAC 权限配置)Milvus 官方博客

[2026-01-15](Milvus 2.6 版本索引优化能力)Zilliz Cloud 技术博客

[2024-12-06](企业 RAG 行级权限管控方案)Zilliz Cloud 技术专栏

[2024-12-04](多租户 RAG 系统架构最佳实践)Zilliz 官方技术文档

免责声明:本文仅为技术方案教程,所有权限配置、数据隔离策略需要结合企业自身等保规范与内部信息安全制度落地;Milvus 集群部署、账号权限分配请严格遵循最小权限原则;本文提供的代码示例仅用于技术调试,生产环境上线前需要完成完整的安全渗透测试。

 
最新文章
站长推荐