掘金 人工智能 07月01日 10:35
RAG检索策略深度解析:从BM25到Embedding、Reranker,如何为LLM选对“导航系统”?
index_new5.html
../../../zaker_core/zaker_tpl_static/wap/tpl_guoji1.html

 

本文深入探讨了RAG(检索增强生成)技术中的检索环节,介绍了BM25、Embedding(稀疏、密集、多向量)以及Reranker等主流检索策略。文章阐述了它们的工作原理、适用场景,并提供了构建高效RAG系统的实用指引,旨在帮助读者理解如何使大型语言模型更智能,回答更准确,为构建RAG系统提供清晰的思路。

💡RAG技术通过为LLM配备检索模块,使其能够从知识库中获取相关信息,从而提高回答的准确性和深度,高效的检索是RAG成功的基石。

💪BM25是一种基于关键词匹配的排序算法,通过词频、逆文档频率和文档长度归一化来衡量文档与查询的相关性,高效且无需深度学习训练,但易受语义鸿沟限制。

🚀Embedding技术通过将文本映射到低维向量空间,捕捉语义相似性,包括稀疏嵌入(如SPLADE)和密集嵌入(如SBERT、jina-embeddings-v3),能够处理更复杂的语义理解。

✨多向量嵌入(如ColBERT)通过细粒度匹配,捕捉长文档中的局部信息,而bge-m3则提供稀疏、密集、多向量一体化解决方案,方便开发者尝试不同策略。

📈混合检索结合多种检索策略,如BM25与Embedding结合,并通过RRF或加权融合提升效果,Reranker则对初步结果进行精细化重排,以提升最终输入LLM的质量。

大家好!今天我们来聊聊一个热门技术——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) ) ]

这里:

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

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

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

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

    你告诉图书管理员你要找关于“天体物理学”的书(用户查询)。

    管理员查阅一个总卡片索引(倒排索引),迅速告诉你哪些书架(文档ID)上有包含“天体物理学”这个词的书。

    你走到这些书架,快速翻阅这些书(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 in range(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||)

这里:

余弦相似度的取值范围在-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的效果:

Score_RRF(doc) = Σ_{s ∈ Systems} (1 / (k + rank_s(doc)))

其中:

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

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

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

下图清晰地对比了Bi-Encoder和Cross-Encoder在架构上的核心差异:

六、总结与实践建议 🎯

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

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

    起步阶段/轻量级应用
    标准生产环境/追求更佳效果
    对精度要求极高/计算资源相对充足
    特定领域/重视可解释性

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

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

交流与探讨:

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

    你在RAG项目中尝试过哪些检索方法?在你的实践中,遇到了哪些挑战,或者有哪些特别的经验和“aha moment”?

    对于文中的某项技术(例如ColBERT的多向量表示如何处理极端长文档,或者bge-m3的自知识蒸馏具体是如何工作的),你有什么特别想深入了解或讨论的吗?

    你认为未来RAG检索技术会朝着哪些方向发展?(例如,更智能的端到端检索模型?更低成本的Reranker?还是其他?)

欢迎在评论区留下你的想法和问题,我们一起交流学习,共同进步!如果你觉得这篇文章对你有帮助,也请不吝点赞和转发,让更多有需要的朋友看到。😊

Fish AI Reader

Fish AI Reader

AI辅助创作,多种专业模板,深度分析,高质量内容生成。从观点提取到深度思考,FishAI为您提供全方位的创作支持。新版本引入自定义参数,让您的创作更加个性化和精准。

FishAI

FishAI

鱼阅,AI 时代的下一个智能信息助手,助你摆脱信息焦虑

联系邮箱 441953276@qq.com

相关标签

RAG 检索策略 BM25 Embedding 混合检索
相关文章