Rag中选择合适的embedding

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)性能的基准框架。它通过一系列标准化的任务和数据集,对嵌入模型在多种文本处理任务中的表现进行综合评估。这使得研究人员和开发者可以对各种嵌入模型的效果进行客观比较。

它允许用户评估不同嵌入模型在以下几个关键方面的表现:

  1. 文本相似度:评估模型在计算文本之间的相似度(如余弦相似度)时的准确性。
  2. 文本分类:评估模型在将文本归类到多个类别中的表现。
  3. 问答系统:评估嵌入模型在信息检索和问答任务中的表现。
  4. 多语言支持:评估模型在不同语言之间的适用性。
  5. 效率:评估模型的推理速度、存储需求以及计算资源消耗等。

具体如何使用Python代码进行评估,参考文档

场景不同,embedding模型的效果也不同,建议自己根据自己的业务,构建数据集,并进行评测。


总结

Embedding数据是在文档上传时生成,对embedding性能要求并不高,它不影响到问答时间的快慢。

Embedding在文档检索中起着特别重要的作用,选择一个embedding模型,需要考虑它的维度、是否开源,成本,响应延迟,多语言支持,文本长度等等多个方面,所以建议多角度进行测试评估,尽可能最大化embedding的能力。

### RAG 架构中的 Embedding 使用与实现 在检索增强生成 (Retrieval-Augmented Generation, RAG) 模型中,Embedding 扮演着至关重要的角色。这些嵌入向量用于表示文档和查询的内容,在模型的不同阶段起着桥梁的作用。 #### 查询编码器中的 Embedding 当用户提交一个查询时,该查询会被送入预训练的语言模型作为查询编码器的一部分。此编码器负责将自然语言形式的查询转换成密集向量空间中的点,即查询的 embedding 表示[^1]。这种表示方法使得机器能够捕捉到词语之间的语义关系,并为进一步的信息检索提供基础。 ```python query_embedding = query_encoder(query_text) ``` #### 文档库索引构建 为了支持高效的相似度匹配操作,通常会对整个文档集合预先计算其对应的 embeddings 并建立索引结构。这一步骤允许系统快速定位最有可能满足给定查询条件的一组候选文档。对于大规模数据集而言,采用近似最近邻算法(Approximate Nearest Neighbor Search)来加速这一过程是非常常见的做法[^2]。 ```python from faiss import IndexFlatL2 document_embeddings = document_encoder(document_texts) index = IndexFlatL2(embedding_dim) index.add(document_embeddings) ``` #### 动态更新机制下的延迟参数同步 考虑到实际应用场景下可能存在的资源限制情况,某些情况下会选择实施一种称为 “ZeRO-Offload with Delayed Parameter Update”的策略。在这种模式下,只有当必要时才会触发参数间的完全同步动作;而在其他时候,则保持各节点上的局部副本独立运作状态不变。这种方法可以在不影响整体性能的前提下有效降低通信开销并提高系统的可扩展性[^3]。 #### 基于 Embedding 的上下文理解 除了上述静态特征外,动态变化也是影响最终输出质量的重要因素之一。因此,在处理多轮对话或者连续文本片段的情况下,还需要特别关注如何利用历史交互记录来进行更精准的情境感知。具体来说,可以通过引入额外的记忆模块或是调整现有网络层的设计思路等方式达成目标[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值