向量检索很强,但全库乱搜会把过期制度与他国产品说明一并召回。元数据过滤是在相似度计算前先按字段收窄候选集。

常见过滤模式

  1. 时间窗:只检索近 N 个月,或显式允许历史版
  2. 产品线/租户:多产品知识库必备
  3. 权限标签:用户不可见文档永不进候选
  4. 类型:手册 / FAQ / 工单分开
  5. 语言与地区:避免串语言答案

设计步骤

  1. 入库强制写元数据,缺字段拒收或进隔离区
  2. 查询侧抽取过滤意图或表单选择
  3. 先 filter 再 top-k;空结果要有放宽顺序
  4. 回答里展示引用元数据便于抽查

查询改写提示词

从用户问题提取检索过滤字段(不确定则 null):
product / doc_type / time_range / region
只输出 JSON,不要回答问题。
用户问题:…

常见坑

  • 过滤过严导致零命中:准备放宽顺序
  • 元数据脏比调 embedding 更能毁系统
  • 权限过滤必须在服务端强制,不能只靠提示词

与分块、重排的关系

元数据过滤解决的是「搜哪儿」;分块解决「切多细」;重排解决「前几名是否真相关」。三者不要互相替代。很多「检索不准」其实是过滤条件缺失,而不是 embedding 不够新。

权限场景特别提醒

若文档带保密级别,过滤必须在服务端强制执行。把「请只使用我有权看的文档」写进提示词,不能当作安全控制。审计时要能证明某次回答的候选集未越权。

落地检查

  • 入库校验:缺 product 或 ACL 标签则拒绝
  • 查询侧:无法解析过滤时,是拒绝回答还是全库降级?要产品决策
  • 监控:过滤后零命中比例、人工点踩理由

观测指标建议

关注过滤后零命中率、放宽后命中率、以及用户点踩中「过期内容」占比。若过期内容仍高,优先查时间元数据是否写入成功,而不是先换大模型。元数据治理是 RAG 的脏活,却决定上限。

小结

元数据过滤是检索系统的座椅安全带:平时无感,出事时救命。投入在入库校验与权限模型上的时间,往往比换更大嵌入模型更划算。把它写进设计评审清单,避免上线后才补。

多租户场景下,自动化测试应包含「用户 A 的查询不得命中租户 B 文档」的硬断言。

补充实践

对政策类文档,除了时间窗,还可加「效力状态」字段:现行/废止/征求意见。废止文档默认不进候选,除非用户明确要历史。

相关阅读