更高效的RAG文本检索和排序: 多语言GTE系列模型开源

01.背景

检索增强生成(Retrieval-Augmented Generation, 简称RAG)正日益成为大模型应用中的热门范式。这种创新方法将检索与生成相结合,使得大模型在提供回答时,能够充分借助外部知识库的支撑,从而获得更为准确且丰富的内容。这不仅有效地减轻了大模型常见的误解和数据隐私问题,也提升了实时响应的能力。

在RAG实施过程中,文本表示模型(Embedding model)和排序模型(Reranker model)是至关重要的两大模块。两者的目标一致,皆为检索与用户问题相关的文档,但在实现方法上却有所不同:文本表示模型首先计算每段文本的向量表示,然后通过余弦距离等方法计算它们之间的相关性分数。因此,所有文档的向量表示可以在离线阶段提前计算,在线上只需处理用户查询的向量,通过高效的向量搜索引擎迅速获取相关候选文档。而排序模型则直接将文本对作为输入,通过更精细的计算方法输出它们的相关性分数,实现更准确的排序效果。需要注意的是,排序模型的计算复杂度较高,因此主要适用于小规模的候选集合。

随着RAG技术的不断发展,系统的功能也在日益增强。早期的系统主要关注向量召回,而如今更复杂的模块被逐步引入,进一步提升了RAG系统的整体效果。同时,随着应用场景的拓展以及大模型处理上下文长度的能力增强,对多语言检索、跨语言检索以及长文本处理的需求也愈加迫切。

此前,通义实验室推出了GTE(General Text Embedding)系列文本向量模型,涵盖了基于BERT架构的模型及基于Qwen LLM系列训练的LLM embedding模型,如gte-Qwen2-1.5B-instruct和gte-Qwen2-7B-instruct。目前,基于双向注意力的Encoder-only结构的模型在同一规模下相较于Decoder-only模型在召回和排序效果上明显更优。然而,当前基于Encoder-only的Embedding和Ranking模型仍面临一些来自BERT时代的遗留问题,例如最长上下文长度仅为512,以及预训练阶段使用的语料明显不足。为解决这些问题,GTE模型开发团队从零开始训练了一种能支持长上下文和多语言的Encoder-only基础模型,并在此基础上推出了最新版本的GTE-MultiLingual系列模型(简称mGTE模型)。

该系列模型具备以下显著特点:

-高性能:在多个数据集上与同规模开源模型的对比中,对比效果领先

-长文档支持:Embedding和Reranker均可处理8k token文本长度,且支持通过ntk-rope等方法扩展到更长的上下文

-多语言支持:模型支持75种语言,涵盖当前主要大模型所支持的所有语种。

-弹性向量表示(Elastic Embedding):模型支持输出128-768维度之间的任意向量表示,以便在性能和存储成本之间取得最佳平衡。在128维的情况下,与768维相比,召回性能损失小于2%,同时节省6倍的存储空间。

-稀疏向量表示(Sparse Embedding):模型可以输出句子中每个单词的词权重作为稀疏表示,适用于需要精确匹配的场景。

模型构建

mGTE系列模型构建流程如图2所示,首先训练了支持长下文的多语言Encoder-only底座模型(mGTE-MLM)。在底座基础上继续训练文本表示模型(mGTE-TRM)和排序模型(mGTE- Reranker)。下面将详细介绍不同阶段的训练过程。

底座预训练

模型结构

为了提升模型多语言以及长文本领域相关的能力,mGTE模型参考了目前Decode-Only架构大语言模型训练过程中一些常见的技巧,对原始的BERT架构做了以下几点改动,具体模型结构如图3所示

-位置编码: 将BERT模型中采用的绝对位置embedding方式改为了旋转位置编码RoPE,以便能更好的支持长上下文的训练,同时保持上下文长度扩展的可能性。

-激活函数: 将BERT模型中线性层(FFN)部分改为了GLU(gated linear unit),这也是在LLM训练过程中已经经过充分验证能有效提升模型训练稳定性的技巧。

此外,为了满足多语言和长文本处理能力的需求,mGTE模型使用了XLM-Roberta系列的词表。

训练过程

预训练阶段mGTE使用MLM(Masked Language Prediction)作为预训练阶段的loss,并参考RoBERTa等工作去掉了NSP loss。在此基础上,mGTE模型尝试了以下几种训练技巧来提升模型训练的效率:

  1. 数据采样:训练过程中,为保证每个Batch内的数据均来自同一种语言,每次会从所有语言中根据概率采样某种语言的数据,具体每一种语言的采样的概率计算方法如下:

其中n代表的是该语言的数据量,

  1. 多阶段预训练:为提高训练效率,训练过程中首先将数据截断为2k长度进行训练,之后在此基础上将数据截断到8k进行继续训练,并将RoPE的base参数由10000设置为160,000。

  2. Unpaddding Model:训练过程中,由于并不是所有的文档都都是统一的长度,mGTE利用了unpadding技术来避免在计算过程中对padding部分的token进行计算,通过这一技术可以有效的提升训练效率,目前常见的flash-attention与xformers库中均支持该操作。

预训练阶段,模型均使用BF16精度进行训练。

底座模型效果评测

为了验证预训练底座模型的效果,mGTE模型在多语言评测榜单XTREAM(共包含50种不同的语言)和英文GLUE数据上对比了2K阶段与8K阶段训练模型与之前Encoder-only架构的同尺寸多语言模型的效果,可以看到在绝大多数任务上mGTE底座模型都相较于过去的模型有更好的效果。

表1 XTREME-R多语言数据评估

表2 英文GLUE数据集评估

02.文本表示模型

在目前的研究中,基于Encoder-only架构的文本表征模型普遍采用双阶段训练范式,即弱监督训练与监督训练的结合,旨在提升模型的泛化能力与性能。在监督阶段,mGTE不仅使用了基础的连续向量对比学习损失,还引入了两个新的表征特性:

-弹性维度表示:该特性允许模型输出不同维度的向量表示,以平衡索引存储和模型效果之间的权衡。多个开源和闭源项目均通过MRL学习支持这一特性。在训练时,先定义一个整数列表D,并分别对模型输出的前k维度(k属D)进行标准化处理,以计算对比学习损失。最终,损失值是各维度对比损失的平均数。

-Sparse向量表示:与传统的连续向量(Dense)表示法不同,Sparse表示通过深度模型计算文本中每个单词的权重,并将两段文本间相互匹配单词的权重乘积求和,从而得到相似度。这种方法可以视为对传统检索手段(如BM25)的扩展。Sparse表示在精准匹配(如型号、品牌、年份等)和长上下文检索场景中,常常展现出更强的性能。为了实现Sparse表示,mGTE模型在每个位置token的最后一层输出后增加了一层线性层(使用ReLU激活),并运用对比学习损失作为Sparse向量表示的损失函数

由此,模型的最终训练损失函数由MRL部分损失和Sparse部分损失的加权和构成,确保模型的有效性能与训练效率。

效果评测

检索效果评测

为了深入评估GTE多语言文本表征模型在检索任务上的表现,特别是在多语言和长文本检索方面,GTE模型作者选择了以下几个数据集进行评测:

-MLDR:多语言长文档检索评测集,包含13种语言的数据。

-MIRACL:多语言检索评测集,涵盖18种语言的数据。

-MKQA:跨语言检索评测集,提供25种不同语言的数据。

-BEIR:英文多领域检索评测集。

-LoCo:专注于英文长文档的检索评测集。

在这些数据集上的对比效果如表3所示:

-长文本检索的领先性:得益于原生的长文本底座训练,mGTE模型在长文本检索任务中显著优于其他开源模型(如mE5、BGE-M3等)及商业API(如OpenAI-3-large)。

-短文本检索的优势:在短文本检索场景中,mGTE模型表现出色,相较于同规模的其他模型,效果大幅领先;即便与参数量更大的模型对比,其效果也接近。

-稀疏向量检索的优势:在大多数检索场景中,稀疏向量检索相较于BM25表现优异,尤其在长文档场景中,与现有的稠密向量检索相比,显示出明显的优势。

表3 检索数据集效果对比

多任务文本表征效果评测

MTEB是一个涵盖多任务文本表示的通用评测数据集,包含分类,聚类,检索,文本相似度计算等多项任务,也是目前文本表示领域公认的衡量文本表示综合能力的榜单。mGTE在英语、法语和波兰语这四种不同语言上对mGTE模型与其他模型的性能进行了对比。类似于检索任务,mGTE模型在与开源社区中同规模的Encoder-only系列模型进行比较时表现出非常好的效果。

当然,与更大型的基于LLM的模型相比,mGTE仍存在明显差距。然而,考虑到mGTE小模型在推理性能方面的优势,其在实际应用场景中应具备更大的发挥空间。

表3 MTEB多任务多语言效果效果对比

03.排序模型

在训练排序模型时,mGTE继续采用对比学习损失函数。mGTE作者在实验过程发现弱监督训练阶段对排序模型效果的提升非常有限。因此,在最终的排序模型训练过程中,mGTE放弃了弱监督训练,仅使用监督数据对模型进行微调。

由于排序模型需要以文本对作为输入来计算相关性分数,因此无法像Embedding模型那样利用batch内其他文档作为负样本。为了保证负样本的多样性,mGTE在训练过程中为每个查询构造了不同难度的负样本。具体而言,mGTE会针对每个查询从排序在不同区间的文档中随机采样负样本,并从文档集合中随机采样负样本,组合成该查询的负样本集合。在训练过程中,每次从这个负样本集合中随机采样K个用于训练。此外,排序模型的训练设置均与文本表示模型保持一致。

效果评测

类似地,mGTE对MLDR、MIRACL、MKQA和BEIR数据集上的排序结果进行了评估。所有的排序模型都基于mGTE-TRM-base模型生成的稠密向量召回的top100结果进行重新排序。具体结果如下:

图4 排序模型结果对比图

图4展示了不同排序模型的检索效果:

  • 整体来看各个排序模型相比召回模型均表现出更佳的性能,证明了在检索链路中引入排序模型的必要性

  • 与同尺寸甚至更大尺寸的模型相比,mGTE-reranker-base模型在各个数据集上均取得了相当甚至更好的效果,尤其是在多语言长文档的检索场景中

04.推理性能评测

GTE多语言Embedding和ReRanking模型共享同一个训练底座,对同等规模的输入,两者的推理效率相当。因此在Embedding表征任务上测试验证mGTE系列模型的推理性能。

图5展示了不同模型编码100条平均长度1000的文档所需的时间,所有的实验都基于单张32G V100完成。可以看到,对比基于LLM的文本表示模型,mGTE编码同样数量的文本仅需约1/8的时间,在推理性能方面有较大优势。

05.GTE多语言系列使用

GTE文本向量-多语言-base

https://modelscope.cn/models/iic/gte_sentence-embedding_multilingual-base

GTE文本排序-多语言-base

https://modelscope.cn/models/iic/gte_passage-ranking_multilingual-base

  • Embedding模型
import torch.nn.functional as F``from modelscope import AutoModel, AutoTokenizer``   ``input_texts = [`    `"what is the capital of China?",`    `"how to implement quick sort in python?",`    `"北京",`    `"快排算法介绍"``]``   ``model_name_or_path = 'iic/gte_sentence-embedding_multilingual-base'``tokenizer = AutoTokenizer.from_pretrained(model_name_or_path)``model = AutoModel.from_pretrained(model_name_or_path, trust_remote_code=True)``   ``# Tokenize the input texts``batch_dict = tokenizer(input_texts, max_length=8192, padding=True, truncation=True, return_tensors='pt')``   ``outputs = model(**batch_dict)``   ``dimension=768 # The output dimension of the output embedding, should be in [128, 768]``embeddings = outputs.last_hidden_state[:, 0][:dimension]``   ``embeddings = F.normalize(embeddings, p=2, dim=1)``scores = (embeddings[:1] @ embeddings[1:].T)``print(scores.tolist())``   ``# [[0.3016996383666992, 0.7503870129585266, 0.3203084468841553]]
  • ReRank模型
import torch``from modelscope import AutoModelForSequenceClassification, AutoTokenizer``   ``model_name_or_path = "iic/gte_passage-ranking_multilingual-base"``   ``tokenizer = AutoTokenizer.from_pretrained(model_name_or_path)``model = AutoModelForSequenceClassification.from_pretrained(model_name_or_path, trust_remote_code=True)``model.eval()``   ``with torch.no_grad():`    `pairs = [["中国的首都在哪儿", "北京"], ["what is the capital of China?", "北京"], ["how to implement quick sort in python?","Introduction of quick sort"]]`    `inputs = tokenizer(pairs, padding=True, truncation=True, return_tensors='pt', max_length=8192)`    `scores = model(**inputs, return_dict=True).logits.view(-1, ).float()`    `print(scores)``# tensor([1.2315, 0.5923, 0.3041])

06.GTE系列模型

GTE(General Text Embedding)系列模型是由通义实验室开源的系列通用文本表征、剖析模型,旨在为RAG(检索增强生成)等检索场景提供领先的文本表征和排序功能。目前,GTE系列涵盖了多种模型,包括GTE中文/英文单语言系列、GTE-Qwen-instruct系列(MTEB榜单评测多语言SOTA模型)以及最新的GTE-Multilingual系列。这些模型已经在Modelscope上开源,拥有超过10万开发者的使用和支持。GTE系列模型也被Langchain、LLaMA Index等主流开源框架集成。

07.开源模型列表

ModelScope链接

GTE文本向量-中文-通用领域-large

https://modelscope.cn/models/iic/nlp_gte_sentence-embedding_chinese-large

GTE文本向量-中文-通用领域-base

https://modelscope.cn/models/iic/nlp_gte_sentence-embedding_chinese-base

GTE文本向量-英文-通用领域-large

https://modelscope.cn/models/iic/nlp_gte_sentence-embedding_english-large

GTE文本向量-中文-通用领域-base

https://modelscope.cn/models/iic/nlp_gte_sentence-embedding_chinese-base

GTE文本向量-Qwen2-1.5B

https://modelscope.cn/models/iic/gte_Qwen2-1.5B-instruct

GTE文本向量-Qwen2-7B

https://modelscope.cn/models/iic/gte_Qwen2-7B-instruct

GTE文本向量-多语言-base

https://modelscope.cn/models/iic/gte_sentence-embedding_multilingual-base

GTE文本排序-多语言-base

https://modelscope.cn/models/iic/gte_passage-ranking_multilingual-base

08.云服务API

除了开源的GTE系列模型,GTE系列模型同时在阿里云上提供商用API服务:

  • 文本Embedding模型: 提供三种版本的文本嵌入模型:text-embedding-v1/v2/v3,其中v3是最新版本的模型服务(https://help.aliyun.com/zh/model-studio/developer-reference/general-text-embedding/)

  • 文本ReRank模型: 提供gte-rerank模型服务, 模型持续迭代中(https://help.aliyun.com/zh/model-studio/developer-reference/general-text-sorting-model/)

如何学习大模型 AI ?

由于新岗位的生产效率,要优于被取代岗位的生产效率,所以实际上整个社会的生产效率是提升的。

但是具体到个人,只能说是:

“最先掌握AI的人,将会比较晚掌握AI的人有竞争优势”。

这句话,放在计算机、互联网、移动互联网的开局时期,都是一样的道理。

我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。

我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。

在这里插入图片描述

第一阶段(10天):初阶应用

该阶段让大家对大模型 AI有一个最前沿的认识,对大模型 AI 的理解超过 95% 的人,可以在相关讨论时发表高级、不跟风、又接地气的见解,别人只会和 AI 聊天,而你能调教 AI,并能用代码将大模型和业务衔接。

  • 大模型 AI 能干什么?
  • 大模型是怎样获得「智能」的?
  • 用好 AI 的核心心法
  • 大模型应用业务架构
  • 大模型应用技术架构
  • 代码示例:向 GPT-3.5 灌入新知识
  • 提示工程的意义和核心思想
  • Prompt 典型构成
  • 指令调优方法论
  • 思维链和思维树
  • Prompt 攻击和防范

第二阶段(30天):高阶应用

该阶段我们正式进入大模型 AI 进阶实战学习,学会构造私有知识库,扩展 AI 的能力。快速开发一个完整的基于 agent 对话机器人。掌握功能最强的大模型开发框架,抓住最新的技术进展,适合 Python 和 JavaScript 程序员。

  • 为什么要做 RAG
  • 搭建一个简单的 ChatPDF
  • 检索的基础概念
  • 什么是向量表示(Embeddings)
  • 向量数据库与向量检索
  • 基于向量检索的 RAG
  • 搭建 RAG 系统的扩展知识
  • 混合检索与 RAG-Fusion 简介
  • 向量模型本地部署

第三阶段(30天):模型训练

恭喜你,如果学到这里,你基本可以找到一份大模型 AI相关的工作,自己也能训练 GPT 了!通过微调,训练自己的垂直大模型,能独立训练开源多模态大模型,掌握更多技术方案。

到此为止,大概2个月的时间。你已经成为了一名“AI小子”。那么你还想往下探索吗?

  • 为什么要做 RAG
  • 什么是模型
  • 什么是模型训练
  • 求解器 & 损失函数简介
  • 小实验2:手写一个简单的神经网络并训练它
  • 什么是训练/预训练/微调/轻量化微调
  • Transformer结构简介
  • 轻量化微调
  • 实验数据集的构建

第四阶段(20天):商业闭环

对全球大模型从性能、吞吐量、成本等方面有一定的认知,可以在云端和本地等多种环境下部署大模型,找到适合自己的项目/创业方向,做一名被 AI 武装的产品经理。

  • 硬件选型
  • 带你了解全球大模型
  • 使用国产大模型服务
  • 搭建 OpenAI 代理
  • 热身:基于阿里云 PAI 部署 Stable Diffusion
  • 在本地计算机运行大模型
  • 大模型的私有化部署
  • 基于 vLLM 部署大模型
  • 案例:如何优雅地在阿里云私有部署开源大模型
  • 部署一套开源 LLM 项目
  • 内容安全
  • 互联网信息服务算法备案

学习是一个过程,只要学习就会有挑战。天道酬勤,你越努力,就会成为越优秀的自己。

如果你能在15天内完成所有的任务,那你堪称天才。然而,如果你能完成 60-70% 的内容,你就已经开始具备成为一名大模型 AI 的正确特征了。

这份完整版的大模型 AI 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值