查询改写与重排
🎯 学习目标
- 用 Query Rewrite 弥合口语与文档用语差距
- 设计多索引 Retrieval Routing 策略
- 理解 Rerank 模型在 pipeline 中的位置与成本
- 建立召回失败 vs 排序失败的诊断方法
引言
「文档里明明有,却检索不到」有时是 recall 问题,有时是 Top-K 里排太后。Query Rewrite 与 Routing 拉 recall;Rerank 拉 precision。本节讲清三者在 pipeline 中的顺序与代价。
章节正文
第 1 步:Query Rewrite(查询改写)
REWRITE_PROMPT = """将用户问题改写为适合搜索引擎的简洁查询,保留实体与版本号。
用户问题:{question}
改写:"""
rewritten = llm.generate(REWRITE_PROMPT.format(question=user_question))
query_vec = embed_texts([rewritten])[0]改写可扩展缩写、补全产品全称、去除礼貌用语。避免改写改变用户意图——可加一步 LLM 自检「改写是否等价」。
第 2 步:Retrieval Routing(检索路由)
多知识域时,先分类再选索引:
route = classifier(user_question) # 规则或小模型:faq | policy | api_doc
index = {"faq": faq_store, "policy": policy_store, "api_doc": api_store}[route]
hits = index.search(query_vec, top_k=20)路由错误会导致「正确的库根本没搜」。要用 golden set 监控各 route 的准确率,并设 fallback「搜全部索引 + merge」。
第 3 步:Rerank(重排序)
向量检索是 bi-encoder,快但粗;Cross-encoder Rerank 对 (query, chunk) 联合打分,准但慢。
candidates = vector_search(query, top_k=30)
pairs = [(question, c.page_content) for c in candidates]
scores = rerank_model.predict(pairs)
top = sorted(zip(scores, candidates), reverse=True)[:5]常用:Cohere Rerank、bge-reranker。典型配置:召回 20–50,rerank 到 5。
第 4 步:Pipeline 顺序建议
Question → [Rewrite] → [Route] → Vector/Hybrid 召回 (K=30)
→ [Rerank] → Top 5 → [Compression] → LLM每加一环测延迟与 hit@K。小流量可先 Rewrite + Rerank,Routing 在域清晰后再加。
第 5 步:失败诊断表
| 症状 | 可能环节 |
|---|---|
| golden 文档不在 Top-30 | chunk / embedding / routing 错 |
| 在 Top-30 但不在 Top-5 | 缺 rerank 或 rerank 模型弱 |
| Top-5 对但 LLM 答错 | Prompt / 模型能力 |
| 改写后意图漂移 | Rewrite prompt 或加等价校验 |
记录每步中间结果(rewrite 文本、route、Top-10 id)便于离线 replay。
动手练习
- 实现 Rewrite prompt,对 10 个口语问题生成检索 query,人工评是否保真。
- 建 faq / policy 两个 mock 索引,实现 rule-based router 并测错 route 率。
- 对 30 条候选调用 rerank(可用开源 bge-reranker),对比 rerank 前后 hit@5。
- 画完整 pipeline 时序图,标注每步 optional 与典型 K 值。
- 选一个失败 case,逐步 replay 判断是 recall 还是 precision 问题。
常见问题
Q:Rewrite 和 MultiQuery 都要用吗?
通常二选一或组合轻量使用。Rewrite 得一条好 query;MultiQuery 得多条 recall。都开会增加 LLM 调用成本,按漏召回类型选择。
Q:Rerank 延迟太高怎么办?
减小候选 K、用更小 rerank 模型、GPU batch、或对高频 query 缓存 rerank 结果。夜间 batch eval 选最优 K。
Q:路由能否完全交给 LLM?
可以作 zero-shot 分类,但生产建议规则 + 小模型 + LLM fallback,并记录 route 分布与纠错反馈。
本节小结
Rewrite 对齐用语,Routing 选对库,Rerank 精排 Top。Pipeline 宜渐进加环,每步可观测、可 replay,避免「全家桶上线却不知哪环坏了」。