首页/AI/RAG 与向量库速查/元数据过滤加速召回
Embedding 与检索50 条

元数据过滤加速召回

把可枚举的筛选条件(产品线、版本、语言、时间)写入元数据并建索引,可把向量检索限制在子集内:既减少无关候选,也缓解多版本文档混检造成的答非所问。

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

元数据过滤是什么

元数据过滤把可枚举的筛选条件(产品线、版本、语言、密级、生效日期)随着片段一起写进向量库的 payload 或标量字段,检索时先按条件缩小范围再算距离。它解决两类问题:多版本文档混检导致答非所问,以及无关领域文档挤占候选位。要让过滤真正加速,高频过滤字段必须建索引,否则过滤只能退化成逐条扫描,延迟不降反升。

基本信息

承载位置Qdrant 的 payload、Milvus 的标量字段、pgvector 的普通列
过滤索引高频字段建 payload 索引或标量索引
过滤下推支持在向量检索前先做条件筛选可减少扫描量
字段设计短、可枚举、基数可控,长文本不要放进来
组合方式等值、范围(日期)、集合包含(in)

典型使用场景

  • 多版本并存的技术文档:按 version 过滤,只检索当前生效版本
  • 多租户隔离:按 tenant 过滤,防止跨租户内容互相召回
  • 权限控制:按密级与部门过滤,避免越权内容进入上下文
  • 时间敏感问答:按生效日期过滤,排除已废止条款
  • 提高精度:按语言或产品线过滤,减少跨领域噪声候选

写入带元数据的片段

写入带元数据的片段
store.upsert([{
    'id': 'doc-101#chunk-3', 'vector': vec,
    'payload': {'product': 'router-A', 'version': 'v2.3',
                'lang': 'zh', 'updated': '2026-08-01', 'tenant': 't-42'}}])

查询时过滤

查询时过滤
hits = store.search(q_vec, top_k=10,
                    filter={'product': 'router-A', 'version': 'v2.3'})
# 过滤字段必须与写入时的大小写、格式完全一致,否则筛出空集

字段设计建议

字段类型注意事项
product / version短字符串与源系统取值域对齐,避免同义写法
tenant短字符串或整型必须过滤,不能依赖应用层事后剔除
updated日期范围过滤,注意时区与格式统一
密级枚举取值域收窄,别名会造成越权
能被过滤的内容就等于能被枚举:密级、租户这类字段的取值域要严格控制,字段值写错会直接造成越权检索,比性能问题严重得多。

易错点

  • 元数据字段设计过细,查询组合爆炸导致过滤条件难以维护
  • 把长文本塞进元数据做过滤,索引膨胀且写入变慢
  • 高频过滤字段没建索引,过滤退化成逐条扫描,延迟明显上涨
  • 写入与查询的字段取值大小写、格式不一致,过滤筛出空集而误判为“库是空的”
  • 把权限过滤放在应用层事后剔除,越权内容已经进入模型上下文,审计无法通过

数据来源与参考

  • Qdrant 官方文档(Payload 与过滤索引)
  • Weaviate 官方文档(Metadata filters)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌