在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通过语义理解确保结果更贴近用户意图。
五、总结
混合检索通过整合稀疏检索和密集检索的优势,实现了高效与精准的平衡。
这种方法不仅解决了稀疏检索缺乏语义理解的问题,也克服了密集检索效率较低的短板,是信息检索技术的重要进步。