支持私有化部署
AI知识库

53AI知识库

学习大模型的前沿技术与行业应用场景


RAG检索策略深度解析:从BM25到Embedding、Reranker,如何为LLM选对“导航系统”?

发布日期:2025-07-01 19:24:09 浏览次数: 1534
作者:拾光学迹

微信搜一搜,关注“拾光学迹”

推荐语

探索RAG检索策略的进化之路,从经典BM25到现代Embedding技术,助你为LLM打造精准导航系统。

核心内容:
1. RAG技术如何通过检索模块增强LLM的准确性与可靠性
2. 经典BM25算法的工作原理与适用场景解析
3. 现代Embedding与Reranker技术的优势与组合策略

杨芳贤
53AI创始人/腾讯云(TVP)最具价值专家

 

大家好!今天我们来聊聊一个热门技术——RAG(检索增强生成)中至关重要的“检索”环节。如果你正在探索如何让你的大型语言模型(LLM)更智能、回答更靠谱,那这篇文章你可千万别错过。

我们会一起深入了解几种主流的检索策略:从经典的BM25,到现代的各类Embedding技术(稀疏、密集、多向量),再到提升最终效果的Reranker。目标是帮你理解它们的工作原理和适用场景,为你构建高效RAG系统提供清晰的指引。

正文:

一、RAG与检索:为什么它是LLM的“神队友”?🤔

想象一下,大型语言模型(LLM)就像一个知识渊博但有时会“脑补”过度的学霸。RAG(Retrieval Augmented Generation)技术,就是给这位学霸配备了一个超级智能的“图书馆检索员”和“事实核查员”。

  • • RAG的工作流程可以简化为:当用户提出问题时,系统首先驱动“检索员”去庞大的知识库(比如你的业务文档、专业数据库等)中找到最相关的几段信息,然后把这些信息连同原始问题一起交给LLM这位“学霸”,让它基于这些靠谱的材料来组织和生成答案。
  • • 检索的重要性:显而易见,如果“检索员”找来的资料驴唇不对马嘴,那么即便是最顶尖的LLM也难以给出准确、有深度的回答——正所谓“Garbage In, Garbage Out”。因此,一个高效且精准的检索模块是RAG系统成功的基石。

下图清晰地展示了RAG的基本工作流程:

友情提示: 接下来的内容会涉及一些技术概念,我会尽量用通俗易懂的方式来解释,希望能帮助大家轻松理解。

二、经典永流传:BM25——关键词匹配的“老兵” 💪

BM25(Best Matching 25)是一种久经考验的排序算法,广泛应用于传统搜索引擎中。它基于“词袋模型”,核心思想是通过关键词匹配程度来衡量文档与查询的相关性。

  • • 核心原理概览
  • • 词频 (Term Frequency, TF):一个词在文档中出现的次数越多,通常意味着这篇文档与该词相关性越高。但BM25会进行“饱和度”处理,避免某些超高频词过度影响结果。可以想象成,一篇文章提到“苹果”10次,比提到1次更相关,但提到100次和提到50次,在“苹果”这个主题上的相关性增加可能就没那么显著了。
  • • 逆文档频率 (Inverse Document Frequency, IDF):如果一个词在整个文档集合中都很罕见(只在少数文档中出现),那么它对于区分文档主题就更重要,IDF值就高。比如“量子纠缠”这个词远比“的”、“是”这类词更能锁定专业文档。
  • • 文档长度归一化:用于平衡长短文档的得分,避免长文档仅仅因为内容多而获得不公平的高分。
  • • 工作方式举例:当用户搜索“深度学习入门教程”时,BM25会倾向于找出那些更频繁出现“深度学习”、“入门”、“教程”这些词,且这些词相对不那么常见的文档。

其核心打分逻辑可以用以下公式框架来表示:

Score(Q, D) = Σ [ IDF(q_i) * ( (k1 + 1) * tf(q_i, D) ) / ( k1 * ( (1 ``- b) + b * (|D| / avgdl) ) + tf(q_i, D) ) ]

这里:

  • • Q 代表用户的查询(Query),由一系列查询词 q_i 组成。
  • • D 代表被评分的文档(Document)。
  • • IDF(q_i) 是查询词 q_i 的逆文档频率,衡量词的稀有度或重要性。
  • • tf(q_i, D) 是查询词 q_i 在文档 D 中出现的频率。
  • • |D| 是文档 D 的长度,而 avgdl 是整个文档集合的平均长度,它们用于文档长度归一化。
  • • k1 和 b 是BM25算法的两个可调参数,通常 k1 取值在1.2到2.0之间,b 通常为0.75。k1 控制词频饱和度(即词频增加对得分的边际效应),b 控制文档长度对得分的影响程度。
  • BM25算法原理示意图

这个公式虽然看起来有些复杂,但它精妙地平衡了词频、词的稀有度以及文档长度这几个核心因素,是BM25算法效果出色的关键。

  • • 优点
  • • 高效性:算法相对简单,计算速度快,易于实现和部署。
  • • 无需深度学习训练:其核心算法基于统计,不需要大规模标注数据进行神经网络模型训练(参数调优除外)。
  • • 可解释性强:得分基于明确的词频和文档频率,容易理解为何某个文档被认为相关。
  • • 精确匹配效果好:对于关键词明确的查询,BM25往往能提供非常好的结果。
  • • 局限性
  • • 语义鸿沟:严重依赖字面匹配。例如,用户搜索“AI最佳实践”,它可能难以找到包含“人工智能优秀范例”的文档,因为它不理解“AI”与“人工智能”、“最佳实践”与“优秀范例”之间的语义相似性。就像一个只会按字查字典的助手,不懂同义词替换。
  • • 忽略语序:作为词袋模型,它不考虑词语的顺序和句子结构。对它而言,“北京到上海的机票”和“上海到北京的机票”可能看起来差不多。

BM25、全文搜索与倒排索引:它们是如何协同工作的?

这三者是构建搜索系统的关键组件:

  • • 全文搜索 (Full-Text Search):这是我们希望达成的目标——在大量文本中找到包含特定信息的文档。
  • • 倒排索引 (Inverted Index):这是实现高效全文搜索的数据结构基础。它像一本书末尾的详细“关键词索引”,记录了每个词出现在哪些文档中以及相关位置信息。当用户查询时,系统可以通过倒排索引快速定位到包含查询词的候选文档。
  • • BM25:在通过倒排索引找到候选文档后,BM25算法登场,为每个文档计算一个相关性得分,然后按分排序,将最相关的结果呈现给用户。

把它们比作在图书馆找特定主题的书籍:

  1. 1. 你告诉图书管理员你要找关于“天体物理学”的书(用户查询)。
  2. 2. 管理员查阅一个总卡片索引(倒排索引),迅速告诉你哪些书架(文档ID)上有包含“天体物理学”这个词的书。
  3. 3. 你走到这些书架,快速翻阅这些书(BM25评分过程),根据目录、摘要和提及“天体物理学”的频繁程度及重要性,判断哪几本最符合你的需求,并把它们按相关性高低排好。

为了更清晰地理解它们之间的协作,可以参考下图:

三、Embedding家族:让机器理解文本的“言外之意” 💡

为了克服BM25等传统方法在语义理解上的不足,基于Embedding(嵌入)的检索策略应运而生。其核心思想是将文本(无论是词语、句子还是整个文档)映射到一个低维、稠密的向量空间中,使得语义相近的文本在向量空间中的距离也相近。

想象一下,每段文字都被翻译成了一串独特的“数字密码”(向量)。语义相似的文字,它们的“数字密码”在某个多维空间里就会靠得很近。这个概念可以用下图来形象理解:

1. 稀疏嵌入 (Sparse Embedding):关键词与语义的初步融合

  • • 特点:生成的向量维度通常很高(与词汇表大小相关),但大部分元素为零,非零元素表示对应词语的权重。可以看作是BM25等基于词频方法的延伸和智能化,试图在关键词匹配的基础上增加一些语义理解。

下图直观地对比了稀疏嵌入和密集嵌入的主要视觉特征:

  • • 代表模型:SPLADE (SParse Lexical AnD Expansion model)
  • • 工作机制:SPLADE利用Transformer模型(如BERT)为查询和文档中的词语分配置信度权重。它不仅考虑文本中实际出现的词,还能通过模型的学习能力,“扩展”出与原文内容语义相关但未直接出现的词,并赋予它们相应的权重。好比一个聪明的助手,你提到“猫”,它不仅关注“猫”本身,还会联想到“喵”、“铲屎官”等相关概念。

这个过程大致可以用以下伪代码思路来理解:

function get_splade_vector(text, bert_model, vocabulary): 
// 1. 将输入文本分词并通过BERT获取上下文相关的词元嵌入 
tokens = bert_model.tokenize(text) 
contextual_token_embeddings = bert_model.get_contextualized_embeddings(tokens) // 通常是BERT最后一层的输出 
// 2. 初始化一个与词汇表等长的零向量,用于存储每个词的最终权重 
vocab_scores = initialize_vector_with_zeros(size=len(vocabulary)) 
// 3. 对每个文本中的词元,估算其对词汇表中所有词的贡献 
for each token_embedding in contextual_token_embeddings: 
for each word_index inrange(len(vocabulary)): 
// 实际SPLADE模型中,这一步会通过一个小型神经网络(如MLP)和与词汇表词嵌入的点积来计算贡献值 
// 这里简化表示其核心思想:基于当前token的上下文信息,判断它能激活词汇表中哪些词 
contribution_score = calculate_semantic_contribution(token_embedding, vocabulary_word_embedding[word_index]) 
// 使用ReLU等激活函数确保权重非负,并累加到对应词汇的得分上 
vocab_scores[word_index] += relu(contribution_score) 
// 4. (可选)对累加后的分数进行对数饱和等处理,形成最终的稀疏向量 
final_sparse_vector = apply_log_saturation(vocab_scores) 
return final_sparse_vector // 这个向量中大部分值为0,非零值代表了重要词及其权重 

上述伪代码描绘了SPLADE的核心思想:它不是简单地统计词频,而是利用深度学习模型的能力,为整个词汇表中的词(包括那些在原文本中未直接出现的、但语义相关的词)智能地赋予权重,从而实现“语义扩展”并生成一个信息量更丰富的稀疏向量。

  • • 训练方式:通常采用对比学习(让模型学习区分相关和不相关的文档对)和正则化方法(鼓励模型生成稀疏的向量,即尽量减少非零元素的数量,以提高效率和可解释性)。
  • • 优势:相比传统稀疏方法,SPLADE能更好地捕捉词汇间的细微联系,实现一定程度的语义扩展,同时保留了稀疏向量的匹配效率和一定的可解释性。
  • • 挑战:虽然有所改进,但其语义理解的深度和广度仍可能不及下面要介绍的密集嵌入。

2. 密集嵌入 (Dense Embedding):深度理解语义的“主力军” 🚀

  • • 特点:将文本映射到相对低维(通常几百到几千维)的向量空间,向量中的每个维度都参与编码文本的整体语义信息,几乎没有零值。这些维度不像稀疏嵌入那样直接对应具体词汇,而是共同表达了文本的抽象语义特征。
  • • 核心优势:能够捕捉深层次的语义相似性。即使查询和文档使用了完全不同的词语,只要它们在含义上相近,密集嵌入模型也能识别出来。
  • • 常见代表模型
  • • Sentence-BERT (SBERT):专门用于生成句子级别语义向量的模型。它通过对BERT等预训练模型进行特殊设计(例如,使用孪生网络结构同时处理两个句子)和微调,使得模型可以直接输出高质量的句子嵌入,非常适合用于计算句子间的语义相似度。
  • • 应用方式:输入一个句子,SBERT输出一个固定大小的向量。比较两个句子的语义相似度,就可以通过计算它们对应向量的余弦相似度等指标来实现。

SBERT这种双塔(Siamese Network)架构的工作方式可以用下图简化表示:

其中,余弦相似度(Cosine Similarity)是一种常用的衡量向量间方向一致性的方法,其计算公式如下:

CosineSimilarity(A, B) = (A · B) / (||A|| * ||B||)

这里:

  • • A 和 B 分别是两个文本(如句子或文档)的密集向量表示。
  • • A · B 表示向量A和向量B的点积。
  • • ||A|| 和 ||B|| 分别表示向量A和向量B的L2范数(即向量的长度)。

余弦相似度的取值范围在-1到1之间,值越接近1,表示两个向量(及其代表的文本语义)越相似。

  • • jina-embeddings-v3:一款功能强大的多语言、多任务文本嵌入模型。
  • • 突出特性:支持超过100种语言;能够处理长达8192个token的长文本序列(得益于如RoPE旋转位置编码等技术,让模型能“记住”更长的上下文);通过LoRA Adapters支持针对不同下游任务(如检索、分类、聚类)优化嵌入表示,就像给模型换上不同功能的“插件”;支持Matryoshka Embeddings(套娃嵌入),允许用户根据需求截断嵌入维度以平衡性能和资源消耗,比如你只需要一个大致方向,就可以用短一点的向量省点力气。
  • • 优势:强大的语义表征能力,尤其适合需要理解复杂语义和上下文的场景。
  • • 潜在不足:对于某些关键词匹配要求极高的场景,其精确度有时可能不如BM25或稀疏嵌入直接。有时可能会因为过于关注“大意”而忽略一些关键词的硬性要求。

3. 多向量嵌入 (Multi-vector Embeddings):捕捉长文档中的“微光” ✨

  • • 解决痛点:对于包含多个主题或很多细节的长文档,将其压缩成单一的密集向量有时会“平均掉”或丢失局部的重要信息。如果用户的查询恰好与长文档中的某一小片段高度相关,单向量表示可能无法有效捕捉这种细粒度的匹配。这就像试图用一句话总结一部长篇小说,很多精彩细节必然会丢失。
  • • 代表模型:ColBERT (Contextualized Late Interaction over BERT)
  • • 核心思想:“延迟交互” (Late Interaction) 与 “细粒度相似度建模”
  • • 工作流程:ColBERT不将查询和文档立即压缩成单一向量。而是先独立地为查询和文档中的每个词元(token)都生成一个上下文相关的向量(形成一个向量序列)。在检索时,它计算查询中每个词元向量与文档中所有词元向量的相似度,然后通过一种MaxSim操作(对每个查询词元,取其与文档所有词元的最大相似度,再将这些最大相似度累加)来得到最终的相关性得分。
  • • 效果:这种方式允许模型在更细的粒度上进行匹配,更好地捕捉查询与文档局部片段之间的精确关联。就像用放大镜仔细比对两篇文章中的每个段落甚至每个句子,而不是只看它们的整体摘要。

其核心的MaxSim(Maximum Similarity)聚合得分的计算逻辑可以用以下伪代码来表示:

function calculate_colbert_score(query_token_embeddings, document_token_embeddings): 
total_max_similarity_score = 0 
// 对查询中的每一个词元嵌入 
for q_embedding in query_token_embeddings: 
max_similarity_for_this_q_token = 0 
// 遍历文档中的每一个词元嵌入,找到与当前查询词元最相似的那个 
for d_embedding in document_token_embeddings: 
similarity = calculate_cosine_similarity(q_embedding, d_embedding) // 通常用余弦相似度 
if similarity > max_similarity_for_this_q_token: 
max_similarity_for_this_q_token = similarity 
// 将这个最大相似度值累加到总分中 
total_max_similarity_score += max_similarity_for_this_q_token 
return total_max_similarity_score 

简单来说,就是查询中的每个“词块”都在文档的所有“词块”中寻找自己的“最佳拍档”(最相似的那个),然后把这些“最佳拍档”的相似度得分加起来,作为查询和文档的最终相关性分数。

ColBERT的这种细粒度交互和MaxSim聚合过程可以用下图示意:

  • • 优势:对于长文档检索和需要精确定位信息片段的场景非常有效。
  • • 资源考量:相比单向量方法,存储和计算开销通常更大。

4. bge-m3:追求全面的“多面手” 🦾

  • • 模型特点:由BAAI(北京智源人工智能研究院)开发,是一个集多语言性、多粒度性、多功能性于一体的文本嵌入模型。
  • • 核心能力:能够同时支持并输出稀疏检索(类似BM25的词权重)、稠密检索(高质量的语义向量)和多向量检索(类似ColBERT的细粒度匹配)所需的不同类型的嵌入。它通过一种“自知识蒸馏”(Self-Knowledge Distillation, SKD)框架进行训练,使得不同检索方式的优势能够相互促进,像一个博采众长的学生,从不同老师那里学到最好的方法。
  • • 价值:为开发者提供了在一个模型中尝试和组合多种先进检索策略的便利性,非常适合需要灵活应对不同检索需求的复杂RAG场景。

四、混合检索 (Hybrid Retrieval):集各家之长,效果更上一层楼 📈

既然不同的检索策略各有千秋(例如,BM25擅长关键词精确匹配,Embedding擅长语义理解),那么将它们结合起来,是不是能达到“1+1>2”的效果呢?答案是肯定的,这就是混合检索的核心思想。

  • • 常见做法:同时使用BM25(或其他稀疏检索方法)和一种或多种Embedding检索方法,然后将它们各自的检索结果进行融合排序。

下图展示了一个典型的混合检索流程BGE-M3的效果:

  • • 融合策略举例
  • • RRF (Reciprocal Rank Fusion, 倒数排序融合):一种简单但鲁棒的融合方法。它不关心不同检索系统输出的原始得分,只关心每个文档在各自结果列表中的排名。一个文档 doc 的RRF得分计算如下:
Score_RRF(doc) = Σ_{s ∈ Systems} (1 / (k + rank_s(doc)))

其中:

  • • Systems 是所有参与融合的检索系统的集合。
  • • rank_s(doc) 是文档 doc 在检索系统 s 给出的结果列表中的排名(例如,第一名是1,第二名是2)。
  • • k 是一个小常数(例如,常设置为60),用于平滑得分,避免排名靠后的文档得分过小或排名第一的文档得分占比过高。

这种方法的好处是不需要对不同系统的得分进行归一化,直接利用排名信息进行融合。

  • • 加权融合 (Weighted Fusion):为不同检索系统的得分分配不同的权重(例如,BM25得分权重0.3,Embedding得分权重0.7),然后加权求和得到最终得分。权重的设定可以基于经验,也可以通过实验调优,甚至用机器学习方法来学习。
  • • 优势:能够有效结合关键词匹配的准确性和语义匹配的召回能力,通常能获得比单一检索策略更好、更稳定的结果,尤其在处理多样化查询(有的偏关键词,有的偏语义)时表现更佳。

五、Reranker (重排序器):检索结果的“精炼师” 🔍

经过上述一种或多种检索策略的“粗筛”(召回阶段),我们通常会得到一个包含较多候选文档的列表(比如几百个)。为了进一步提升最终喂给LLM的文档质量,Reranker(重排序器)应运而生。它相当于一位“精炼师”或“质量品鉴官”,对初步召回的结果进行更细致、更精准的二次排序。

  • • 与召回阶段检索的区别
  • • 召回模型(如BM25, SBERT等双塔模型Bi-Encoder):通常独立编码查询和文档,然后计算它们向量表示的相似度。这种方式计算快,适合从海量数据中快速筛选。它们像是两位考官分别给一篇作文打分,然后取平均。
  • • 重排序模型(通常是Cross-Encoder交叉编码器模型):会将查询(query)和每个候选文档(document)拼接起来,作为一个整体输入到一个更强大的深度模型(如BERT、RoBERTa等)中。模型内部通过复杂的注意力机制,让查询和文档的每个部分都能充分交互,从而更深入地理解两者之间的细微语义关系和相关性。这更像是一位考官拿到作文题目和作文后,逐字逐句地进行比对和深度分析。

下图清晰地展示了其架构上的核心过程:

  • • 优势:由于进行了更充分的交互和更深层次的语义分析,Reranker通常能达到比召回模型更高的排序精度。
  • • 代价:计算成本远高于召回模型。因为它需要对“查询-每个候选文档”对都进行一次复杂的模型推理。因此,Reranker一般只用于对召回阶段筛选出的少量(例如前几十或几百个)最有希望的文档进行精排。
  • • 常见模型:包括Cohere Rerank, BAAI开发的bge-reranker系列, Jina AI的Reranker等。这些模型通常针对重排序任务进行了专门优化。

六、总结与实践建议 🎯

回顾一下我们今天探讨的RAG检索技术:

  • • BM25:关键词检索的基石,简单高效,精确匹配场景下的可靠选择。
  • • Embedding 技术:开启语义理解大门。
  • • Sparse Embedding (如SPLADE):在关键词基础上融入初步语义,兼顾效率与可解释性。
  • • Dense Embedding (如SBERT, jina-embeddings-v3):强大的语义理解能力,应对复杂查询的利器。
  • • Multi-vector Embedding (如ColBERT):精细捕捉长文档中的局部信息,避免重要细节被稀释。
  • • bge-m3:提供稀疏、密集、多向量一体化解决方案的“多面手”,方便尝试不同策略。
  • • Hybrid Retrieval:融合多种检索策略优势,提升整体鲁棒性和效果,是生产环境中的常见选择。
  • • Reranker:对初步结果进行精细化重排,是提升最终输入LLM质量的关键一环,尤其在高精度要求的场景下。

在实际项目中如何选择和组合这些技术呢?这里有一些建议:

  1. 1. 起步阶段/轻量级应用
  • • 可以从 BM25 + 一个高质量的Dense Embedding模型 (如Sentence-BERT的某个优秀变体,或jina-embeddings-v3的基础版) 开始。这种组合能兼顾关键词匹配和基本的语义理解,投入产出比较高。
  1. 2. 标准生产环境/追求更佳效果
  • • 强烈推荐 Hybrid Retrieval。例如,BM25结合一个强大的Dense Embedding模型(如jina-embeddings-v3的高级版本或bge-m3),并使用RRF或加权融合策略。这能更好地应对多样化的用户查询。
  1. 3. 对精度要求极高/计算资源相对充足
  • • 在Hybrid Retrieval的基础上,引入 Reranker。例如,使用BM25+Dense Embedding进行初步召回(如Top 50-200个结果),然后用一个高效的Reranker模型(如bge-reranker)对这些结果进行精排(如选出Top 3-10个)。
  1. 4. 特定领域/重视可解释性
  • • 如果需要较好的可解释性(了解哪些词或因素对匹配起到了关键作用),可以考虑 SPLADE 这样的稀疏语义检索方法。如果领域专业性强,可能还需要结合领域词典或专门训练的Reranker。

最重要的原则是:没有一劳永逸的“最佳”方案,只有最适合当前业务需求、数据特性、资源限制和维护能力的组合。

建议从小处着手,逐步迭代,通过实验来验证不同策略组合在你的具体场景下的表现。多做AB测试,用数据说话。

 

 

 

交流与探讨

希望这篇文章能帮助你对RAG中的检索策略有一个更全面的认识!技术的探索永无止境,RAG领域也在飞速发展。

  1. 1. 你在RAG项目中尝试过哪些检索方法?在你的实践中,遇到了哪些挑战,或者有哪些特别的经验和“aha moment”?
  2. 2. 对于文中的某项技术(例如ColBERT的多向量表示如何处理极端长文档,或者bge-m3的自知识蒸馏具体是如何工作的),你有什么特别想深入了解或讨论的吗?
  3. 3. 你认为未来RAG检索技术会朝着哪些方向发展?(例如,更智能的端到端检索模型?更低成本的Reranker?还是其他?)

欢迎在评论区留下你的想法和问题,我们一起交流学习,共同进步!


往期精彩
10分钟搞定!AI表情包自由,白嫖GPT-4o,让你在群里横着走!
还在置顶文件传输助手吗?元宝也可以置顶聊天了!快来试试AI助手吧!
SEO老了?GEO来了!玩转传统搜索+AI搜索,吸引眼球大作战!
Agent如何改造传统工作流:从搜索到全能助手" data-itemshowtype="0" linktype="text" data-linktype="2">智能Agent如何改造传统工作流:从搜索到全能助手
AI团队比单打独斗强!CrewAI多智能体协作系统开发踩坑全解析
深入浅出:Agent如何调用工具——从OpenAI Function Call到CrewAI框架
一文读懂-多智能体编译:从例行到交接的奥秘
《使用coze搭建一个会搜索、写ppt、思维导图的Agent》
AI驱动开发:用Cursor零基础打造web项目的终极指南
在 RAG 中数据处理的关键:数据切片的挑战与解决方案
阅读原文链接了解更多信息

觉得有用?点赞、在看、转发三连,下次教你更刺激的AI玩法!



53AI,企业落地大模型首选服务商

产品:场景落地咨询+大模型应用平台+行业解决方案

承诺:免费场景POC验证,效果验证后签署服务协议。零风险落地应用大模型,已交付160+中大型企业

联系我们

售前咨询
186 6662 7370
预约演示
185 8882 0121

微信扫码

添加专属顾问

回到顶部

加载中...

扫码咨询