为什么需要混合检索
只用向量检索时,错误码、型号、缩写和精确短语可能被语义相似内容淹没;只用 BM25 时,同义表达和自然语言问题又容易漏召回。混合检索把两种优势结合,但前提是合并和重排过程可解释。
检索管线
用户问题
→ 权限、租户、时间过滤
→ 查询改写与关键词提取
→ BM25 召回 + 向量召回
→ 分数归一化与去重
→ rerank
→ 片段预算与引用
→ 生成或拒答权限过滤必须发生在召回前或检索引擎内部,不能先取回敏感内容再指望生成阶段“不要说”。
BM25 适合什么
BM25 对词项匹配敏感,适合:
- 错误码与 API 名称。
- 产品型号、文件名和编号。
- 法规条款、版本号和精确术语。
- 用户明确使用的关键词组合。
它的弱点是无法自然理解同义词和上下位概念,因此需要查询扩展或向量召回补充。
向量检索适合什么
向量检索适合概念解释、自然语言问题和表达差异较大的内容。它的风险是“语义相似但事实不适用”,例如旧版本文档、不同租户政策或相近但不同的产品。
因此向量结果必须带元数据:来源、版本、时间、权限和文档类型。
合并与重排
简单拼接两个结果列表会让分数失去意义。可以使用 Reciprocal Rank Fusion 等排名融合方法,再用轻量 reranker 或业务规则重排。
final_score =
rank_fusion(bm25_rank, vector_rank)
+ freshness_bonus
+ official_source_bonus
- duplicate_penalty这里的权重是 CCAF101 自研练习示例,不是官方推荐参数。真实系统应通过离线评测和线上行为数据调整。
可追溯答案
每个结论应能回到具体片段。答案生成前检查证据是否覆盖问题;证据冲突时展示差异或请求澄清;没有足够证据时明确返回“无法确认”。
反模式
- 在召回后才做权限过滤。
- 不保存文档版本与更新时间。
- 用一个统一阈值处理所有查询类型。
- 只评估答案文风,不评估引用是否支持结论。
- 证据不足时继续补全看似合理的答案。
验收清单
- 精确词和语义问题都有测试样本。
- 权限过滤早于内容暴露。
- 两路分数可比较且合并方法固定。
- 重复片段被合并。
- 答案包含可定位引用。
- 证据不足时触发拒答或澄清。