微信扫码
添加专属顾问
我要投稿
探索RAG检索策略的进化之路,从经典BM25到现代Embedding技术,助你为LLM打造精准导航系统。核心内容: 1. RAG技术如何通过检索模块增强LLM的准确性与可靠性 2. 经典BM25算法的工作原理与适用场景解析 3. 现代Embedding与Reranker技术的优势与组合策略
大家好!今天我们来聊聊一个热门技术——RAG(检索增强生成)中至关重要的“检索”环节。如果你正在探索如何让你的大型语言模型(LLM)更智能、回答更靠谱,那这篇文章你可千万别错过。
我们会一起深入了解几种主流的检索策略:从经典的BM25,到现代的各类Embedding技术(稀疏、密集、多向量),再到提升最终效果的Reranker。目标是帮你理解它们的工作原理和适用场景,为你构建高效RAG系统提供清晰的指引。
正文:
一、RAG与检索:为什么它是LLM的“神队友”?🤔
想象一下,大型语言模型(LLM)就像一个知识渊博但有时会“脑补”过度的学霸。RAG(Retrieval Augmented Generation)技术,就是给这位学霸配备了一个超级智能的“图书馆检索员”和“事实核查员”。
下图清晰地展示了RAG的基本工作流程:
友情提示: 接下来的内容会涉及一些技术概念,我会尽量用通俗易懂的方式来解释,希望能帮助大家轻松理解。
二、经典永流传:BM25——关键词匹配的“老兵” 💪
BM25(Best Matching 25)是一种久经考验的排序算法,广泛应用于传统搜索引擎中。它基于“词袋模型”,核心思想是通过关键词匹配程度来衡量文档与查询的相关性。
其核心打分逻辑可以用以下公式框架来表示:
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、全文搜索与倒排索引:它们是如何协同工作的?
这三者是构建搜索系统的关键组件:
把它们比作在图书馆找特定主题的书籍:
为了更清晰地理解它们之间的协作,可以参考下图:
三、Embedding家族:让机器理解文本的“言外之意” 💡
为了克服BM25等传统方法在语义理解上的不足,基于Embedding(嵌入)的检索策略应运而生。其核心思想是将文本(无论是词语、句子还是整个文档)映射到一个低维、稠密的向量空间中,使得语义相近的文本在向量空间中的距离也相近。
想象一下,每段文字都被翻译成了一串独特的“数字密码”(向量)。语义相似的文字,它们的“数字密码”在某个多维空间里就会靠得很近。这个概念可以用下图来形象理解:
1. 稀疏嵌入 (Sparse Embedding):关键词与语义的初步融合
下图直观地对比了稀疏嵌入和密集嵌入的主要视觉特征:
这个过程大致可以用以下伪代码思路来理解:
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的核心思想:它不是简单地统计词频,而是利用深度学习模型的能力,为整个词汇表中的词(包括那些在原文本中未直接出现的、但语义相关的词)智能地赋予权重,从而实现“语义扩展”并生成一个信息量更丰富的稀疏向量。
2. 密集嵌入 (Dense Embedding):深度理解语义的“主力军” 🚀
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,表示两个向量(及其代表的文本语义)越相似。
3. 多向量嵌入 (Multi-vector Embeddings):捕捉长文档中的“微光” ✨
其核心的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:追求全面的“多面手” 🦾
四、混合检索 (Hybrid Retrieval):集各家之长,效果更上一层楼 📈
既然不同的检索策略各有千秋(例如,BM25擅长关键词精确匹配,Embedding擅长语义理解),那么将它们结合起来,是不是能达到“1+1>2”的效果呢?答案是肯定的,这就是混合检索的核心思想。
下图展示了一个典型的混合检索流程BGE-M3的效果:
doc
的RRF得分计算如下:Score_RRF(doc) = Σ_{s ∈ Systems} (1 / (k + rank_s(doc)))
其中:
Systems
是所有参与融合的检索系统的集合。rank_s(doc)
是文档 doc
在检索系统 s
给出的结果列表中的排名(例如,第一名是1,第二名是2)。k
是一个小常数(例如,常设置为60),用于平滑得分,避免排名靠后的文档得分过小或排名第一的文档得分占比过高。这种方法的好处是不需要对不同系统的得分进行归一化,直接利用排名信息进行融合。
五、Reranker (重排序器):检索结果的“精炼师” 🔍
经过上述一种或多种检索策略的“粗筛”(召回阶段),我们通常会得到一个包含较多候选文档的列表(比如几百个)。为了进一步提升最终喂给LLM的文档质量,Reranker(重排序器)应运而生。它相当于一位“精炼师”或“质量品鉴官”,对初步召回的结果进行更细致、更精准的二次排序。
下图清晰地展示了其架构上的核心过程:
六、总结与实践建议 🎯
回顾一下我们今天探讨的RAG检索技术:
在实际项目中如何选择和组合这些技术呢?这里有一些建议:
最重要的原则是:没有一劳永逸的“最佳”方案,只有最适合当前业务需求、数据特性、资源限制和维护能力的组合。
建议从小处着手,逐步迭代,通过实验来验证不同策略组合在你的具体场景下的表现。多做AB测试,用数据说话。
交流与探讨:
希望这篇文章能帮助你对RAG中的检索策略有一个更全面的认识!技术的探索永无止境,RAG领域也在飞速发展。
1. 你在RAG项目中尝试过哪些检索方法?在你的实践中,遇到了哪些挑战,或者有哪些特别的经验和“aha moment”? 2. 对于文中的某项技术(例如ColBERT的多向量表示如何处理极端长文档,或者bge-m3的自知识蒸馏具体是如何工作的),你有什么特别想深入了解或讨论的吗? 3. 你认为未来RAG检索技术会朝着哪些方向发展?(例如,更智能的端到端检索模型?更低成本的Reranker?还是其他?) 欢迎在评论区留下你的想法和问题,我们一起交流学习,共同进步!
觉得有用?点赞、在看、转发三连,下次教你更刺激的AI玩法!
53AI,企业落地大模型首选服务商
产品:场景落地咨询+大模型应用平台+行业解决方案
承诺:免费场景POC验证,效果验证后签署服务协议。零风险落地应用大模型,已交付160+中大型企业
2025-07-01
从碎片到图谱:Graph RAG如何用知识网络颠覆传统搜索?
2025-07-01
qodo如何构建大型代码仓库的RAG?
2025-07-01
爆改RAG!让你的AI检索“见人说人话,见鬼说鬼话”——自适应检索的魔法揭秘
2025-07-01
RAG系统的“聪明药”:如何用反馈回路让你的AI越用越聪明?
2025-06-30
EraRAG:突破传统GraphRAG限制,实现动态语料库的高效检索增强生成
2025-06-30
GraphRAG的索引动态更新解法-分桶+局部更新及“上下文工程”新概念?
2025-06-30
RAG搭建个人LLM知识库助手,很多人第一步就走错了...
2025-06-29
你的RAG系统安全么?
2025-04-13
2025-04-19
2025-04-09
2025-04-16
2025-05-08
2025-04-05
2025-04-23
2025-04-08
2025-04-10
2025-04-09
2025-07-01
2025-07-01
2025-07-01
2025-07-01
2025-06-30
2025-06-29
2025-06-20
2025-06-19