Ch43: 挑战深读⑤——检索栈:Rerank、向量失真与三路延迟
Part 10 · 合并 challenges #5 + #6 + #9 · Ch25 RRF/Rerank · Ch24 三路检索
结论先行:WeKnora 检索栈的三层张力同时存在——#5 通用 Cross-Encoder 在垂直术语上失准,靠 0.6 模型 + 0.3 RRF + 0.1 来源 兜底;#6 768 维向量丢精确值/否定/专名,BM25 路不可省;#9 并行后延迟 ≈ max(三路) + RRF + Rerank,瓶颈常在 Rerank HTTP 或图谱遍历。大师用 grep 定位 + smoke-10 消融 一次验证三题,而非分三个 PR 盲调参。
一、日常类比:三道安检与一张压缩照片
机场安检有三条通道:关键词(认工牌号)、向量(认「长得像」)、图谱(认熟人关系网)——并行开放,总等待时间取决于 最慢那条(#9)。过关后还有 精检员 Rerank(#5),专看「能不能拼出答案」而非「话题像不像」。向量路像把行李 X 光压成一张小图(#6)——「10 个向量库」和「8 个」在图上几乎一样,只有工牌扫描(BM25)能分清。
二、复合 Rerank 三信号(#5)
| 信号 | 默认权重 | 作用 | 何时调高 |
|---|---|---|---|
| Rerank 模型 | 0.6 | Cross-Encoder 语义精排 | 通用 FAQ、术语少 |
| RRF 基础分 | 0.3 | 多路召回共识 | 错误码/SKU/法规条号密集 |
| 来源可信度 | 0.1 | 文档权威、时效元数据 | 多版本 doc 并存 Ch31 |
失败形态:Query 含 E1042,Rerank 把「错误处理哲学」排过「E1042 对照表」——模型学的是通用语义,不是 答案可构造性。临时 调高 0.3+0.1 往往比换 7B reranker 更稳。
三、向量失真三类(#6)
| 类型 | 例子 | 向量表现 | BM25/关键词 |
|---|---|---|---|
| 数值混淆 | 8 库 vs 10 库 | 距离难区分 | 精确 token 命中 |
| 否定丢失 | 不支持 X vs 支持 X | 方向接近 | 否定词共现 |
| 大块稀释 | 5000 字含一行 k=60 | 关键事实被平均 | 小块 + 混合 Ch27 |
HyDE/查询改写 不能替代 BM25:假想文档措辞可能与库内不一致,反而偏离 error code 的精确匹配。
四、三路延迟分解(#9)
T_total ≈ T_parallel + T_rrf + T_rerank + T_generate
T_parallel = max(T_bm25, T_vector, T_graph) # 并行非相加
| 分路 | 典型量级 | 瓶颈场景 |
|---|---|---|
| BM25 | 50–100ms | rarely |
| 向量 ANN | 20–50ms | 超大库 rebuild |
| 图谱 | 200ms–1s+ | 2–3 hop、冷启动大图 |
| Rerank | 100–300ms | top-N 线性于 N |
可接受降级:图谱 500ms 超时 → 仅 BM25+向量进 RRF;Rerank 失败 → 回退 RRF 序;KB 文档数 < N → graph_weight=0(链 Ch42)。
五、grep 起手
rg -n "0\\.6|Rerank|Composite|source_credibility" internal/ --glob "*rerank*"
rg -n "BM25|bm25|keyword" internal/ --glob "*retriev*"
rg -n "WaitGroup|errgroup|parallel" internal/ --glob "*retriev*"
建议贡献:分路 histogram retrieval_latency_seconds{path="bm25|vector|graph"} + Rerank 耗时。
六、平台对照(检索栈)
| 项目 | 路数 | 复合 Rerank | 精确匹配补充 |
|---|---|---|---|
| WeKnora | 3 | ★ 三信号 | BM25 ★ |
| Dify | 2+ | 工作流可选 | BM25 |
| RAGFlow | 2 | 单 rerank | DeepDoc 结构 |
| FastGPT | 2 | 部分 | $text 弱 |
| AnythingLLM | 1 | 常无 | 纯向量盲区大 |
七、实验:smoke-10 检索栈消融
基线:benchmark/smoke-10.jsonl 全量 10 条,记录 RAGAS 四维 + P95 延迟 + 分路耗时。
| 变体 | 验证挑战 | 预期 |
|---|---|---|
| A 默认三路 + 复合 Rerank | 基线 | — |
| B 关 Rerank(仅 RRF) | #5 | 术语题 MRR↓,延迟↓ |
| C 关图谱(双路) | #9 | 多跳 Recall↓,P95↓ |
| D 仅向量 | #6 | zh-003 精确值 miss |
| E 调高 source 权重 | #5+#6 | 版本冲突题↑ |
PR 模板:Markdown 表列 A–E 的 faithfulness、context_recall、P95、rerank_ms;附 2 条失败 query 人工 ✓/✗(是否含可构造答案 chunk)。
Issue 锚点:检索回调空结果 → case-1633;缓存 TTL 影响二次检索 → case-1761。
八、贡献方向
- Admin 暴露三信号权重 + 「快速模式:双路无图谱」
- 领域 reranker adapter(BGE-reranker-v2-m3)+ LoRA smoke(几百对即可)
fact=true关键事实句旁路索引(缓解 #6)- 换 embedding 双写索引 → 原子切换 runbook
- Grafana 面板 doc:分路 + Rerank 联合看板
章末自检
- 复述复合 Rerank 三信号及默认权重,并举一例 #5 失败、复合救场
- 解释「三路并行不是三路相加」与 Rerank 为何常是 P99 瓶颈
- 说清精确 error code 为何必须保留 BM25(#6)
- 设计 smoke-10 上至少 2 个消融变体并预测哪条指标会变