🍋🍋AI学习🍋🍋
🔥系列专栏: 👑哲学语录: 用力所能及,改变世界。
💖如果觉得博主的文章还不错的话,请点赞👍+收藏⭐️+留言📝支持一下博主哦🤞
一、重排序(Re-ranking)详解
1. 为什么需要重排序?
初检阶段(如向量相似度检索)通常采用高效但粗糙的匹配方式:
- 向量嵌入模型(如
text-embedding-ada-002)虽然能捕捉语义,但对细粒度语义匹配、逻辑一致性、上下文依赖等能力有限。 - 可能召回大量“表面相关但实质无关”的文档。
🌰 举例:
用户问:“Transformer 模型中 LayerNorm 的作用是什么?”
初检可能召回一篇讲“Transformer 架构综述”的文章(包含 LayerNorm 字眼),但真正解释其作用的段落可能在另一篇更专业的论文中。
重排序的目标就是把后者排到前面。
2. 重排序的核心思想
对初检返回的 top-K(如 K=50)候选文档,使用一个更强、更精细的模型重新计算 query 与每个文档的相关性分数,再按新分数排序,取 top-N(如 N=3~5)送入 LLM。
✅ 本质:粗排(fast but noisy) + 精排(slow but accurate)
3. 重排序的实现方式
(1)基于交叉编码器的重排序(Cross-Encoder Reranker)
这是目前最主流、效果最好的方式。
- 原理:将 query 和 document拼接成一个序列,输入一个预训练语言模型(如 BERT、RoBERTa),输出一个相关性分数。
1[CLS] query: What is LayerNorm? [SEP] passage: In Transformer, LayerNorm is applied after residual... [SEP] - 模型输出
[CLS]token 的 logits,经 sigmoid 得到 0~1 的相关性分数。 - 优点:能建模 query 与 document 的深度交互(token-level attention),远优于双塔模型(Bi-encoder)的独立编码。
对比:
- Bi-encoder(初检用):query 和 doc 分别编码 → 计算余弦相似度(快,可索引)
- Cross-encoder(重排用):联合编码 → 精确打分(慢,不可索引)
(2)常用重排序模型
| 模型 | 特点 | 适用场景 |
|---|---|---|
| BGE-Reranker(智源) | 开源、支持中英文、轻量高效 | 中文 RAG 首选 |
| Cohere Rerank | 商业 API,效果极佳,支持长文本 | 企业级应用(付费) |
| ColBERTv2 | 延迟交互(late interaction),比 cross-encoder 快 | 平衡速度与精度 |
| LLM-based Rerank | 用 GPT-4 / Claude 直接判断相关性(Zero-shot) | 小规模、高价值场景 |
💡 推荐:BGE-Reranker-v2-m3(多语言、小模型、效果好)
4. 重排序的关键关注点
| 关注点 | 说明 |
|---|---|
| Top-K 选择 | 初检召回太多 → 重排慢;太少 → 可能漏掉好结果。通常 K=30~100 |
| 计算开销 | Cross-encoder 无法预计算,需实时推理。可考虑缓存或异步处理 |
| 长文本处理 | 超过模型最大长度(如 512)时需截断或滑动窗口 |
| 领域适配 | 通用 reranker 在专业领域(如医疗、法律)效果下降,建议微调 |
| 多语言支持 | 确保 reranker 支持你的语言(BGE 系列支持中文) |
| 评分归一化 | 不同 query 的分数分布不同,避免直接比较绝对值 |
二、多跳检索(Multi-hop Retrieval)详解
1. 什么是多跳检索?
- 单跳检索:一次 query → 一次检索 → 得到答案(适用于简单事实问答)。
- 多跳检索:需要多次检索 + 推理才能回答的问题。
🌰 经典例子(HotpotQA 数据集):
“Who is the founder of the company that created TensorFlow?”
需要两跳:
- TensorFlow 是谁开发的?→ Google
- Google 的创始人是谁?→ Larry Page & Sergey Brin
最终得到答案。
2. 多跳检索的挑战
- 信息分散:答案分布在多个文档中。
- 推理链构建:如何从第一跳结果推导出第二跳 query?
- 错误传播:第一跳检索错误 → 后续全错。
- 循环/冗余:重复检索相同内容。
3. 实现策略
(1)迭代式检索(Iterative Retrieval)
- 步骤:
- 用原始 query 检索第一批文档。
- 用 LLM 分析这些文档,生成新的 sub-query(用于下一跳)。
- 用新 query 再次检索。
- 重复直到满足停止条件(如找到答案、达到最大跳数)。
📌 关键:Query 生成质量决定成败。
(2)基于图的检索(Graph-based Retrieval)
- 将知识库构建成实体关系图(如 Wikidata)。
- 从问题中提取实体,进行图遍历(如 2-hop neighbors)。
- 适合结构化知识,但构建成本高。
(3)FLARE(Forward-Looking Active Retrieval)
- 在 LLM 生成过程中动态判断是否需要检索。
- 当模型预测的下一个 token 置信度低时,触发检索。
- 实现“按需检索”,减少冗余。
(4)Self-Ask / Chain-of-Thought + Retrieval
- 让 LLM 先生成推理链(CoT),再对每个子问题单独检索。
4. 多跳检索的关键关注点
| 关注点 | 说明 |
|---|---|
| 跳数控制 | 通常 2~3 跳足够,更多跳易引入噪声 |
| 查询改写质量 | 使用强 LLM(如 GPT-4)生成 sub-query 效果更好 |
| 去重机制 | 避免重复检索相同文档(可用 embedding 或 hash 去重) |
| 融合策略 | 如何合并多跳结果?可拼接、加权、或让 LLM 综合 |
| 评估难度 | 需要多跳 QA 数据集(如 HotpotQA、2WikiMultihop) |
| 延迟 vs 精度 | 多跳增加响应时间,需权衡用户体验 |