多租户向量库模式是什么
多租户向量检索的隔离方案大致三档:每个租户一个独立集合或索引,隔离最强但集合数量随租户线性增长,批量运维与备份窗口会失控;共享集合加租户过滤字段是主流做法,隔离依赖过滤条件必须被强制注入;共享集合加分区键(Milvus 的 partition key 等)由引擎按租户自动路由,在隔离与运维之间取中。选择依据是租户数量、合规要求与团队运维能力,而不是单纯的技术偏好。
基本信息
| 隔离三档 | 独立集合、共享集合加过滤、共享集合加分区键 |
|---|---|
| 主流选择 | 共享集合加租户过滤字段 |
| 必需能力 | 租户字段必须建索引 |
| 隔离保证 | 过滤条件在服务端强制注入,不依赖调用方 |
| 容量差异 | 租户数据量差异大时需要限流与配额 |
| 合规场景 | 数据驻留要求高时考虑独立实例 |
典型使用场景
- SaaS 产品为每个客户隔离知识库,互不可见
- 大客户或受监管行业要求物理隔离,单独集合甚至独立实例
- 租户数上千时独立集合不可行,改用分区键自动路由
- 混合检索中先按租户过滤再用向量近邻,避免跨租户召回
- 租户数据量悬殊时按租户设置配额,防止单租户拖垮全局
共享集合加过滤
共享集合加过滤
client.create_payload_index("kb", field_name="tenant",
field_schema=models.PayloadSchemaType.KEYWORD) # 过滤字段建索引
res = client.query_points(
"kb", query=q_vec,
query_filter=models.Filter(must=[models.FieldCondition(
key="tenant", match=models.MatchValue(value=tenant_id))]), # 服务端注入租户
limit=10)隔离模式对照
| 模式 | 隔离强度 | 运维复杂度 | 适用 |
|---|---|---|---|
| 独立集合或索引 | 高 | 高 | 大客户、合规要求高 |
| 共享集合加过滤字段 | 中 | 低 | 常规 SaaS 多租户 |
| 共享集合加分区键 | 中高 | 中 | 租户多且查询天然按租户 |
| 独立实例或集群 | 最高 | 最高 | 数据驻留与合规硬性要求 |
租户过滤必须由服务端强制注入:如果过滤条件由调用方拼装、可以被绕过,隔离等于不存在,越权检索是数据泄露级别的事故。
过滤字段要建索引(Qdrant 的 payload index、Milvus 的标量索引等),否则过滤退化为全量扫描,延迟随数据量增长。