【速通RAG实战:检索】7.RAG混合检索与重排序技术
在 RAG(检索增强生成)系统中,检索环节起着承上启下的关键作用,它需要精准地从知识库中找出与用户查询相关的信息,为后续的生成环节提供有力支撑。混合检索与重排序技术是提升检索效果的重要手段。
1.为什么需要混合检索与重排序?
2023 年,Microsoft Azure AI 发布了《Azure 认知搜索:通过混合检索和排序能力超越向量搜索》一文。这篇文章对在 LLM RAG 应用中引入混合检索和重排序技术进行了全面的实验数据评估,并量化了这些技术组合在提升文档召回率和准确性方面的显著效果。
实验结果表明,在多个数据集和多种检索任务中,混合检索与重排序的组合均取得了最佳表现
2. 混合检索的概念及意义
在 RAG 应用场景下,单一的检索方法往往存在局限性。例如,仅依靠向量检索,可能会因向量表示的不完美或语义理解的偏差,导致遗漏一些相关信息;而仅用传统的关键词检索(如基于 BM25 等算法),又难以捕捉文本深层次的语义关系。
混合检索就是将不同类型的检索方法结合起来,综合利用它们各自的优势,从而提高检索的全面性和精准性。
3. 混合检索(Hybrid Search)的核心作用
- 目标:结合向量检索(语义匹配)与关键词检索(精确匹配)的优势,提升召回率与准确性。
- 适用场景:
- 向量检索:语义模糊、上下文敏感的长文本查询(如“订单配送问题”)。
- 关键词检索:精确匹配短词(如订单ID、人名、品牌名)或低频关键术语。
4. 常见的混合检索组合方式
1.向量检索 + 关键词检索
- 向量检索原理及特点:基于文本经过 Embedding 处理后的向量表示,通过计算查询向量与知识库中向量的相似度(如余弦相似度、欧几里得距离等)来查找相关文本块。它能很好地捕捉文本的语义信息,对于语义相近但用词不同的表达有较好的检索效果。
- 关键词检索原理及特点:通常基于文本中的词汇出现频率、分布等特征,利用算法(如 BM25)计算文本与查询关键词的相关性。它对于明确的关键词匹配非常有效,尤其在处理一些特定术语、专业名词时能快速定位相关文档。
- 组合方式及优势:可以先通过向量检索找出一批语义相近的候选文本块,再利用关键词检索在这些候选文本块中进一步筛选,去除那些虽然语义相近但实际上并不包含关键信息的部分。
- 例如,用户查询“人工智能在医疗领域的应用案例”,向量检索可能会找出所有涉及人工智能和医疗相关语义的文本块,然后关键词检索会进一步筛选出其中明确提到“应用案例”的部分。
2.向量检索 + 语义检索(基于知识图谱等)
- 语义检索原理及特点
- 借助知识图谱等语义表示工具,利用实体、关系等语义知识来进行检索。比如,在医学知识图谱中,如果知道“疾病”与“治疗药物”之间的关系,当查询某种疾病的治疗药物时,可以基于图谱的语义结构准确查找。
- 组合方式及优势
- 向量检索负责从大规模文本数据中找到与查询在语义上宽泛相关的内容,而语义检索则基于已有的知识结构对这些内容进行深度挖掘和精准匹配,使得检索结果更贴合用户的语义需求。
- 例如,在一个包含企业知识图谱和大量文档的知识库中,向量检索找到与“产品研发项目”相关的文档后,语义检索可以根据知识图谱中关于产品、研发部门、负责人等关系进一步细化检索结果。
- 向量检索负责从大规模文本数据中找到与查询在语义上宽泛相关的内容,而语义检索则基于已有的知识结构对这些内容进行深度挖掘和精准匹配,使得检索结果更贴合用户的语义需求。
3.多向量检索模型结合
有时候会使用不同的向量 Embedding 模型来生成文本向量,然后在检索时综合运用这些不同模型产生的向量信息。
比如,同时使用通用的 Sentence Transformers 模型生成的向量和针对特定领域(如法律领域)训练的专业向量模型生成的向量进行检索,不同模型从不同角度捕捉文本语义,结合后能提高检索的准确性和全面性。
5. 混合检索实现流程
- 多路召回:并行执行向量检索(如Chroma)和关键词检索(如BM25)。
- 结果融合:合并两路结果,常用方法包括简单拼接或递归折减融合(RRF)。
- 重排序:对融合结果进行精细排序,提升相关性。
6. 关键词检索(BM25)实战代码
-
依赖安装:
pip install jieba rank_bm25
-
核心代码:
from rank_bm25 import BM25Okapi import jieba# 中文分词与BM25初始化 all_docs = collection.get()["documents"] tokenized_corpus = [list(jieba.cut(doc)) for doc in all_docs] bm25 = BM25Okapi(tokenized_corpus)# 查询分词与检索 tokenized_query = list(jieba.cut(query)) bm25_scores = bm25.get_scores(tokenized_query) top_indices = sorted(range(len(bm25_scores)), key=lambda i: bm25_scores[i], reverse=True)[:top_k] bm25_results = [all_docs[i] for i in top_indices]
7. 重排序的概念及必要性
经过初步检索得到的结果往往只是基于某种相似度或相关性度量筛选出来的,可能存在部分结果虽然在初始度量标准下看似相关,但实际在整体语义、上下文逻辑等方面并不十分契合用户查询。
重排序技术就是对这些初步检索结果进行再次评估和调整顺序,使得更符合用户需求的结果排在前面,进一步提升检索质量。
8. 常见的重排序方法
1.基于语言模型的重排序
- 原理:利用强大的语言模型(如 GPT 系列、LLaMA 系列等)对初步检索得到的文本块以及用户查询进行综合分析,通过语言模型对它们之间的语义连贯性、逻辑合理性等进行打分,然后根据打分情况重新调整顺序。
- 优势:能够充分利用语言模型强大的语义理解能力,从更宏观的角度评估文本与查询的匹配度。例如,对于一个复杂的查询,语言模型可以判断检索结果中的文本是否能完整、合理地回应查询的各个要点。
2.基于规则的重排序
- 原理:依据一些预先设定的规则来对检索结果进行调整。比如,根据文本块的来源可靠性(如来自权威机构的文档权重更高)、文本的更新时间(较新的文档更优先)、文本中关键信息的密度(包含更多查询关键词的文本更靠前)等规则来重新排列顺序。
- 优势:规则明确、易于理解和控制,在一些特定领域或有明确要求的场景下能快速实现有效的重排序。例如,在企业内部知识库中,按照部门规定,来自高层决策文件的内容在检索结果中通常会被优先考虑。
3.基于深度学习的其他重排序模型(如 Ranking SVM、ListNet 等)
- 原理:这些模型通常会将检索结果文本块和用户查询作为输入,通过训练好的模型来预测它们之间的相对顺序关系,进而对结果进行重排序。它们基于大量的数据进行训练,学习到文本之间的复杂关系特征。
- 优势:对于大规模数据和复杂的文本关系有较好的处理能力,能挖掘出一些基于简单规则难以发现的潜在顺序关系,提高检索结果的精准度。
9. 重排序技术(Reranking)
- 作用:对初始检索结果重新排序,优化生成模型的上下文质量。
- 模型选型:开源模型(如BGE的
bge-reranker-v2-m3
)或商用模型(如Cohere)。 - 优势:捕捉细粒度语义交互,解决向量检索的全局相似性偏差。
10. 重排序实战代码
-
依赖安装:
pip install FlagEmbedding
-
核心代码:
from FlagEmbedding import FlagRerankerdef reranking(query, chunks, top_k=3):reranker = FlagReranker('BAAI/bge-reranker-v2-m3', use_fp16=True)pairs = [[query, chunk] for chunk in chunks]scores = reranker.compute_score(pairs, normalize=True)sorted_indices = sorted(range(len(scores)), key=lambda i: scores[i], reverse=True)return [chunks[i] for i in sorted_indices[:top_k]]
11. 混合检索与重排序整合
-
代码示例:
# 混合检索:向量 + BM25 vector_results = vector_search(query, top_k) bm25_results = bm25_search(query, top_k) combined_results = vector_results + bm25_results# 重排序 reranked_results = reranking(query, combined_results, top_k)
12. 性能与效率权衡
- 优化方向:
- 分阶段处理:粗排(快速召回)→ 精排(重排序)。
- 模型轻量化:选择参数量小的重排序模型(如
bge-reranker-v2-m3
)。 - 缓存机制:对高频查询结果缓存,减少重复计算。
13.总结与选型建议
- 混合检索:适用于需要兼顾语义与精确匹配的场景(如电商搜索、客服问答)。
- 重排序:高精度需求场景必选,但需平衡计算资源消耗。
通过混合检索与重排序技术,RAG系统在召回率与准确性上实现显著提升,最终优化生成结果的质量。