Skip to content

查询改写与重排

🎯 学习目标

  • 用 Query Rewrite 弥合口语与文档用语差距
  • 设计多索引 Retrieval Routing 策略
  • 理解 Rerank 模型在 pipeline 中的位置与成本
  • 建立召回失败 vs 排序失败的诊断方法

引言

「文档里明明有,却检索不到」有时是 recall 问题,有时是 Top-K 里排太后。Query Rewrite 与 Routing 拉 recall;Rerank 拉 precision。本节讲清三者在 pipeline 中的顺序与代价。

章节正文

第 1 步:Query Rewrite(查询改写)

python
REWRITE_PROMPT = """将用户问题改写为适合搜索引擎的简洁查询,保留实体与版本号。
用户问题:{question}
改写:"""

rewritten = llm.generate(REWRITE_PROMPT.format(question=user_question))
query_vec = embed_texts([rewritten])[0]

改写可扩展缩写、补全产品全称、去除礼貌用语。避免改写改变用户意图——可加一步 LLM 自检「改写是否等价」。

第 2 步:Retrieval Routing(检索路由)

多知识域时,先分类再选索引:

python
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) 联合打分,准但慢。

python
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 顺序建议

text
Question → [Rewrite] → [Route] → Vector/Hybrid 召回 (K=30)
       → [Rerank] → Top 5 → [Compression] → LLM

每加一环测延迟与 hit@K。小流量可先 Rewrite + Rerank,Routing 在域清晰后再加。

第 5 步:失败诊断表

症状可能环节
golden 文档不在 Top-30chunk / embedding / routing 错
在 Top-30 但不在 Top-5缺 rerank 或 rerank 模型弱
Top-5 对但 LLM 答错Prompt / 模型能力
改写后意图漂移Rewrite prompt 或加等价校验

记录每步中间结果(rewrite 文本、route、Top-10 id)便于离线 replay。

动手练习

  1. 实现 Rewrite prompt,对 10 个口语问题生成检索 query,人工评是否保真。
  2. 建 faq / policy 两个 mock 索引,实现 rule-based router 并测错 route 率。
  3. 对 30 条候选调用 rerank(可用开源 bge-reranker),对比 rerank 前后 hit@5。
  4. 画完整 pipeline 时序图,标注每步 optional 与典型 K 值。
  5. 选一个失败 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,避免「全家桶上线却不知哪环坏了」。