首页/AI/RAG 与向量库速查/多租户与权限过滤

多租户与权限过滤

企业知识库要让检索条件同时带权限标签(租户/部门/密级),在向量检索阶段就过滤,避免召回无权内容;标签要在入库时写入且随权限变更刷新。

RAG 与向量库速查AI更新于 2026-10-13

多租户与权限过滤

企业知识库要让检索条件同时带上权限标签(租户、部门、密级),在向量检索阶段就把无权内容排除,而不是先召回再在应用层过滤。标签要在入库时写入,并随权限变更同步刷新,否则过滤结果会滞后于真实权限,形成越权或漏看的风险。

基本信息

过滤维度租户、部门、密级、项目组
写入时机入库时随切片元数据一起写入
过滤位置检索语句内,由服务端强制拼接
刷新要求权限变更后要同步更新索引里的标签

Qdrant 带权限过滤检索

Qdrant 带权限过滤检索
from qdrant_client import models
flt = models.Filter(must=[
    models.FieldCondition(key="tenant_id", match=models.MatchValue(value="t-001")),
    models.FieldCondition(key="acl", match=models.MatchAny(any=["public", "dept-hr"])),
])
hits = client.query_points(collection_name="docs", query=qv,
                           query_filter=flt, limit=5).points

pgvector 权限过滤

pgvector 权限过滤
SELECT id, content
FROM documents
WHERE tenant_id = 't-001' AND acl_tag = ANY(ARRAY['public','dept-hr'])
ORDER BY embedding <=> '[...]'
LIMIT 5;

使用要点

  • 过滤条件由服务端拼装:不接受客户端直接传入租户或标签
  • 标签建模尽量扁平:多值标签可匹配,层级权限在应用层展开后写入
  • 权限变更走增量更新:转岗、调级后重算相关切片的标签
  • 为过滤字段建索引:否则带条件的检索在数据量上升后明显变慢
  • 对最差分布压测:最小租户与最冷标签最能暴露问题

权限模型与实现

模型实现方式注意
单一租户每租户独立集合隔离彻底,跨租户统计困难
标签过滤共享集合加标签字段必须强制服务端拼接条件
层级权限展开为多值标签后写入变更需重算受影响切片
混合模式共享加独家集合实现复杂,需明确边界

常见问题

  • 过滤条件漏拼:检索到无权内容,属于严重安全缺陷
  • 权限变更不同步:员工转岗后仍能检索到原部门资料
  • 标签字段没有索引:带过滤检索在小租户上明显变慢
  • 把密级与租户混在一个字段里,条件组合变得难以维护
权限变更(例如员工转岗)后索引里的标签要同步刷新,否则过滤结果滞后于真实权限,形成越权或漏看的风险。

易错点

  • 权限过滤放在生成之后:模型已经看过无权内容,过滤等于没做
  • 过滤字段没有标量索引,带过滤的检索性能明显劣化
  • 权限条件由客户端传入,存在被篡改的风险
  • 标签更新没有回溯机制,历史切片长期保留旧权限

数据来源与参考

  • Qdrant 官方文档(Filtering)
  • pgvector README(查询示例)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌