Naive 的漏检与噪声在准确率敏感场景不可接受。根因是单查询、单路、无精排。本方法用改写、多路召回和重排拉高可达性与排序。代价是链路变长,需用阶段指标分别归因。它不是「再换一个更大的嵌入模型」的同义词。
本文属于 RAG 工程框架中的「2 索引与召回」环节,聚焦「Advanced RAG」方法。
定位
| 维度 | 内容 |
|---|---|
| 角色 | 召回路径的可插拔流水线 |
| 输入 → 输出 | query → 改写后的多路 hits → 精排后的 Top-n |
| 默认组合 | LlamaIndex / Haystack:改写 + Hybrid + reranker |
| 何时不用 | POC、流量极低且 Naive 已够;不要一上来就上 Agent |
核心机制
$$
T=\mathrm{Rerank}\bigl(\bigcup_i \mathrm{Retrieve}(q’_i)\bigr),\quad {q’_i}=\mathrm{Rewrite}(q)
$$
只在 $\Delta\mathrm{Recall}$ 或 $\Delta\mathrm{nDCG}$ 覆盖额外时延时保留该跳。
实现路径与心智:把 Naive 的单跳拆成可插拔段:改写 $q\to{q’}$ → 多路取并集 → 精排 → 可选压缩 → 生成。底层心智:每一跳都必须用冻结指标证明「增益 > 时延/费用」,否则只是把链路变长。归因时一次只动一段。
优缺点
- 优点:漏检和噪声可分开打。
- 缺点:调参面大;不冻结指标就无法归因。
契约与走通样例
输入
1 | {"query": "WGS 文库怎么建"} |
中间量
改写得 ["whole-genome sequencing library prep", "WGS 文库构建"]。单路 Recall@5=$0.40$;并集后 $0.72$;精排后 nDCG@5 从 $0.51$ 到 $0.68$。时延 $2.8\times$ Naive,仍低于门禁。
输出
1 | [{"rank": 1, "doc_id": "P-WGS-03-C2", "score": 0.91, "channel": "dense+rerank"}] |
社区实现
LlamaIndex / Haystack 流水线。风险:把切分/检索/生成缠在一个 RAG 类里,冻结评测做不到。
工程落地
最小可运行示例
复制为 .py 后直接运行(仅标准库)。生产流水线对应 LlamaIndex / Haystack:改写器 + 多路 retriever + Cross-encoder。
1 | """改写 → 多路并集 → 按原问权重精排。每次只开一段才能归因。""" |
参数
| 参数 | 起点 | 影响 |
|---|---|---|
| 改写条数 | 2~4 | 过多主题漂移 |
pool_k |
50 | 精排池宽度 |
top_n |
8 | 进生成的条数 |
失效—信号—螺丝
- 一次改三跳:分数涨了不知道谁的功。螺丝:一次只开一段。
- 改写漂移:Recall 降。螺丝:冻结评测,砍改写条数。
- 精排池不含金标准:nDCG 不动。螺丝:先抬召回。
规模(100 篇生物学 PDF)
建库与 Naive 同量级;GPU 16–24 GB(多模型);磁盘 3–8 GB。单次查询时延常为 Naive 的 2–6×。