导航

RAG中的稀疏检索与密集检索

Posted on 2025-04-21 18:28  蝈蝈俊  阅读(157)  评论(0)    收藏  举报

在RAG(Retrieval-Augmented Generation,检索增强生成)框架中,检索机制是其核心部分,用于从知识库中提取与用户查询最相关的文档或段落。

根据技术原理的不同,检索方法主要分为稀疏检索和密集检索两种:

一、稀疏检索(Sparse Retrieval)

稀疏检索是一种基于关键词匹配的传统方法,常见技术包括TF-IDF和BM25。

它通过计算查询和文档中词项的共现程度(例如关键词出现的频率)来评估相关性。

1、优点:

  • 计算速度快,易于实现。
  • 在大规模文档集上性能良好。

2、缺点:

  • 仅依赖关键词匹配,无法捕捉语义信息。 例如,对于“苹果”和“水果”这种语义相关的词,稀疏检索可能无法准确关联。

  • 对于同义词或语义相似的表达,检索效果较差,可能导致召回率和精确率不足。

3、常见的稀疏检索算法包括:

TF-IDF(Term Frequency-Inverse Document Frequency)

TF-IDF 通过统计方法衡量一个词项对文档的重要性。TF(词频)表示词项在文档中的出现频率,IDF(逆文档频率)表示词项在整个文档集中的稀有程度。两者相乘得到的得分越高,说明该词项对文档的区分度越高。

BM25(Best Matching 25)

BM25 是 TF-IDF 的改进版本,引入了文档长度归一化和词频饱和等优化,使得相关性评分更合理。它在实际文本检索任务中表现优异。

二、密集检索(Dense Retrieval)

密集检索是一种现代的信息检索方法,它通过将文本(无论是用户查询还是文档)转换为高维向量来实现检索。

这些向量能够捕捉文本的语义特征,使得语义相似的文本在向量空间中距离更近。

与传统的稀疏检索(基于关键词匹配)不同,密集检索能够理解文本的深层含义,从而提高检索的准确性。

1、优点:

  • 能够捕捉语义信息,处理同义词、近义词等语义相关的查询和文档。
  • 检索准确性和召回率更高。

2、缺点:

  • 计算复杂度高,需要大量计算资源。
  • 在大规模文档集上可能面临效率挑战。

3、目前的主流向量模型都是密集检索

常见的向量模型,例如 Word2Vec、GloVe、FastText、Sentence-BERT、OpenAI Embeddings (如 ada-002) 等,通常用于密集检索方式。文本嵌入模型的选择这里介绍的都是稠密向量模型。

三、稀疏检索要解决什么问题?

稀疏检索是一种基于关键词匹配的传统信息检索方法,其核心任务是从大规模文档集中快速、准确地找出与用户查询相关的文档。具体来说,它要解决以下几个问题:

1、相关性评估:

通过分析查询与文档中共同出现的关键词,计算两者的相关性得分,确保检索到的文档与用户需求高度匹配。

2、检索效率:

面对海量数据,稀疏检索需要在短时间内返回结果,让用户能够及时获取信息。

3、可扩展性:

随着数据量的不断增长,稀疏检索需要具备处理大规模文档集的能力,保持稳定的性能。

简单来说,稀疏检索的目标是通过关键词的表面匹配,在浩如烟海的信息中为RAG的生成模型提供高质量的输入文档。

4、使用稀疏检索的例子

假设我们有一个小型文档集:

  • 文档1:"我喜欢吃苹果"
  • 文档2:"苹果是一种水果"
  • 文档3:"我喜欢吃香蕉"

用户查询为:"苹果"。目标是从文档集中找出与查询最相关的文档。

实现步骤

  • 构建文档集:将上述三个文档输入系统。

  • 处理查询:将用户输入的"苹果"作为检索目标。

  • 计算TF-IDF:用TF-IDF模型计算查询与每个文档的相关性得分。

  • 排序输出:根据得分排序,返回最相关的文档。

Python代码实现

from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics.pairwise import cosine_similarity

# 文档集
documents = ["我喜欢吃苹果", "苹果是一种水果", "我喜欢吃香蕉"]

# 查询
query = ["苹果"]

# 构建TF-IDF模型
vectorizer = TfidfVectorizer()
tfidf_matrix = vectorizer.fit_transform(documents)

# 将查询转为TF-IDF向量
query_vector = vectorizer.transform(query)

# 计算余弦相似度
similarities = cosine_similarity(query_vector, tfidf_matrix)

# 找到最相关文档
most_similar_doc_index = similarities.argmax()
most_similar_doc = documents[most_similar_doc_index]

print("最相关的文档:", most_similar_doc)

输出结果

运行代码后,输出可能是:

最相关的文档:苹果是一种水果

这表明TF-IDF成功识别出与“苹果”最相关的文档。

四、混合检索

为了弥补稀疏检索缺乏语义理解的短板,混合检索模型将稀疏检索与密集检索结合,兼顾效率和准确性。

1、稀疏检索的局限

稀疏检索虽然速度快,但在处理语义相关性时表现不足。例如,用户查询“人工智能的未来发展趋势”,如果文档中没有明确出现“趋势”这个词,而是用了“发展方向”等近义词,稀疏检索可能无法识别,导致遗漏相关内容。

2、密集检索的挑战

密集检索虽然擅长语义理解,但由于需要将所有文档转化为向量并计算相似度,其计算成本高,尤其在实时性要求高或文档量巨大的场景下,效率成为瓶颈。

3、混合检索的动机

为了兼顾效率和准确性,混合检索应运而生。它结合了稀疏检索的快速筛选能力和密集检索的语义理解能力,通过两步流程优化检索效果:

  • 先用稀疏检索快速筛选出候选文档,
  • 再用密集检索进行精细排序。

这样既降低了计算负担,又提升了结果的相关性。

4、混合检索示例:BM25 + BERT

以下是一个具体的混合检索示例,展示了如何结合BM25(稀疏检索)和BERT(密集检索)来处理用户查询:

BM25(稀疏检索)

BM25首先从大规模文档集中快速筛选出与查询相关的候选文档。它基于关键词匹配,计算查询与文档的相关性得分。

例如,对于用户查询“人工智能的未来发展趋势”,BM25会优先检索包含“人工智能”“未来”“趋势”等关键词的文档,生成一个较小的候选集。

BERT(密集检索)

随后,BERT对这些候选文档进行语义分析。它将查询和文档转化为高维向量,通过计算向量相似度(如余弦相似度)重新排序候选文档,输出最符合用户意图的结果。

BERT能识别“趋势”和“发展方向”之间的语义关联,从而提升结果的准确性。

适用场景

在问答系统中,这种方法非常实用。

例如,用户提问“人工智能的未来发展趋势”,BM25可以快速锁定包含相关关键词的文档(比如新闻、论文等),而BERT则进一步分析这些文档的语义,筛选出真正讨论未来趋势的内容,而不是仅仅提到“人工智能”的无关文档。

优势

  • 效率:BM25减少了需要进行密集计算的文档数量。

  • 准确性:BERT通过语义理解确保结果更贴近用户意图。

五、总结

混合检索通过整合稀疏检索和密集检索的优势,实现了高效与精准的平衡。

这种方法不仅解决了稀疏检索缺乏语义理解的问题,也克服了密集检索效率较低的短板,是信息检索技术的重要进步。