rag系列文章目录
文章目录
前言
Embedding在rag召回文本中,占有重要的作用,准确的召回能够避免llm的幻觉。一般项目中使用bge-m3或openai向量模型作为rag的选型。其实,还有其他一些embedding模型可供选择,下面我们来探究一下,并讨论下,如何选择一个适合自己场景的embedding模型。
一、Embedding类型
1.1 Sparse embedding
它的特点是稀疏性,生成的向量大多数维度为零,仅有少数非零值。它的可解释性强,每个维度可以直接映射到一个具体的词或特征,易于解释模型结果。
它的常用方法是TF-IDF和Bag of Words(BoW),一般根据词频、逆文档频率等生成向量,无法捕捉上下文信息,语义相似度有限。适用于关键词匹配和简单的文档检索。
1.2 Dense embedding
它有以下特点:
• 稠密性:生成的向量大多数维度都有非零值。
• 低维:通常为 100~1,024 维,相比稀疏嵌入更紧凑。
• 语义表达能力强:通过神经网络训练,能够捕捉词语、句子或文档的深层语义信息。
常用的方法有
Word2Vec: 基于上下文窗口预测目标词或上下文词,生成静态词向量。
BERT: 基于 Transformer,通过双向注意力机制捕捉词的上下文关系。
它能够捕捉深层语义关系,但是需要大规模数据和计算资源进行预训练,且具有不可解释性,因为向量表示缺乏直观的可解释性。适合进行语义检索,rag中常用的embedding模型,一般是这种类型。
1.3 Multi-Vector Embeddings
该方法通过多个向量表示单个实体或文本。这些向量通常表示不同的语义方面,或者同一实体在不同上下文中的不同含义。每个向量可以代表不同上下文中的信息,适合多义词的处理。如何处理这多个向量呢,常见的方式是多个向量求平均、加权求和或者拼接。
它使用多个向量,计算和存储开销较大,计算复杂度高,优点是能捕捉同一文本或实体在不同上下文中的多重含义。适用于多义词处理场景。
1. 4 Long Context Embeddings
该方法旨在处理长文本(如长篇文章、完整的段落),通常采用不同的策略来延长上下文窗口的范围,使模型能够捕捉更长距离的依赖关系。
通常,基于 Transformer 的模型(如 BERT)只能处理有限长度的上下文,超过长度限制的文本需要被截断或分段处理。长上下文嵌入方法通过优化模型结构或通过分段拼接技术来缓解这一问题。
它能够处理更长的上下文,避免文本截断导致的信息丢失。但是处理长文本时,仍然需要较高的计算和内存资源。长文本嵌入模型结构更为复杂,训练时间较长。
1.5 Variable Dimension Embeddings
这种嵌入方式不是使用固定维度的向量来表示所有文本或实体,而是根据输入文本的复杂度、信息量或上下文的重要性动态调整向量的维度。
可变维度嵌入的目的是让模型能够根据任务需求自动调整表示的详细程度。复杂的任务或多信息源的输入可能会使用更高维度的向量表示,简单的输入则使用较低维度的向量表示。
它通过根据任务动态调整维度,减少了不必要的计算负担。但是动态调整维度使得模型的设计和训练更加复杂。它适合需要根据不同任务调整嵌入表示精度的场景。
此外,有code embedding,旨在将编程语言中的代码片段表示为向量。它不仅考虑了代码的语法,还考虑了语义和上下文关系。它针对code场景进行各种优化,在code生成,code检索相关的大模型服务中,用处较广。
以下是这几类模型的对比:
二、评价模型
如何评价一个embedding模型的好坏呢,一般使用MTEB: Massive Text Embedding Benchmark。
它是一个专门设计用于评估不同文本嵌入模型(Embedding Models)性能的基准框架。它通过一系列标准化的任务和数据集,对嵌入模型在多种文本处理任务中的表现进行综合评估。这使得研究人员和开发者可以对各种嵌入模型的效果进行客观比较。
它允许用户评估不同嵌入模型在以下几个关键方面的表现:
- 文本相似度:评估模型在计算文本之间的相似度(如余弦相似度)时的准确性。
- 文本分类:评估模型在将文本归类到多个类别中的表现。
- 问答系统:评估嵌入模型在信息检索和问答任务中的表现。
- 多语言支持:评估模型在不同语言之间的适用性。
- 效率:评估模型的推理速度、存储需求以及计算资源消耗等。
具体如何使用Python代码进行评估,参考文档。
场景不同,embedding模型的效果也不同,建议自己根据自己的业务,构建数据集,并进行评测。
总结
Embedding数据是在文档上传时生成,对embedding性能要求并不高,它不影响到问答时间的快慢。
Embedding在文档检索中起着特别重要的作用,选择一个embedding模型,需要考虑它的维度、是否开源,成本,响应延迟,多语言支持,文本长度等等多个方面,所以建议多角度进行测试评估,尽可能最大化embedding的能力。