链载Ai

标题: RAG检索策略深度解析:从BM25到Embedding、Reranker,如何为LLM选对“导航系统”? [打印本页]

作者: 链载Ai    时间: 2 小时前
标题: RAG检索策略深度解析:从BM25到Embedding、Reranker,如何为LLM选对“导航系统”?

ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;font-size: 14px;letter-spacing: 0.1em;color: rgb(63, 63, 63);">大家好!今天我们来聊聊一个热门技术——RAG(检索增强生成)中至关重要的“检索”环节。如果你正在探索如何让你的大型语言模型(LLM)更智能、回答更靠谱,那这篇文章你可千万别错过。

ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;font-size: 14px;letter-spacing: 0.1em;color: rgb(63, 63, 63);">我们会一起深入了解几种主流的检索策略:从经典的BM25,到现代的各类Embedding技术(稀疏、密集、多向量),再到提升最终效果的Reranker。目标是帮你理解它们的工作原理和适用场景,为你构建高效RAG系统提供清晰的指引。

ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;font-size: 14px;letter-spacing: 0.1em;color: rgb(63, 63, 63);">ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;font-size: inherit;color: rgb(15, 76, 129);">正文:

ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;font-size: 14px;letter-spacing: 0.1em;color: rgb(63, 63, 63);">ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;font-size: inherit;color: rgb(15, 76, 129);">一、RAG与检索:为什么它是LLM的“神队友”?🤔

ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;font-size: 14px;letter-spacing: 0.1em;color: rgb(63, 63, 63);">想象一下,大型语言模型(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、全文搜索与倒排索引:它们是如何协同工作的?

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

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

  1. 1. 你告诉图书管理员你要找关于“天体物理学”的书(用户查询)。
  2. 2. 管理员查阅一个总卡片索引(倒排索引),迅速告诉你哪些书架(文档ID)上有包含“天体物理学”这个词的书。
  3. 3. 你走到这些书架,快速翻阅这些书(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.对每个文本中的词元,估算其对词汇表中所有词的贡献
foreach token_embeddingincontextual_token_embeddings:
foreach word_indexinrange(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)
returnfinal_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
// 对查询中的每一个词元嵌入
forq_embeddinginquery_token_embeddings:
max_similarity_for_this_q_token =0
// 遍历文档中的每一个词元嵌入,找到与当前查询词元最相似的那个
ford_embeddingindocument_token_embeddings:
similarity = calculate_cosine_similarity(q_embedding, d_embedding) // 通常用余弦相似度
ifsimilarity > max_similarity_for_this_q_token:
max_similarity_for_this_q_token = similarity
// 将这个最大相似度值累加到总分中
total_max_similarity_score += max_similarity_for_this_q_token
returntotal_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(重排序器)应运而生。它相当于一位“精炼师”或“质量品鉴官”,对初步召回的结果进行更细致、更精准的二次排序。

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

六、总结与实践建议 🎯

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

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

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

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

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






欢迎光临 链载Ai (https://www.lianzai.com/) Powered by Discuz! X3.5