LLMs之EmbeddingModel/reRanker:gte-multilingual-base的简介、安装和使用方法、案例应用之详细攻略

LLMs之EmbeddingModel/reRanker:gte-multilingual-base的简介、安装和使用方法、案例应用之详细攻略

导读:这篇论文介绍了mGTE,一个用于多语言文本检索的通用长上下文文本表示模型和重排序模型。mGTE 通过在长上下文多语言文本编码器、混合文本表示模型和交叉编码器重排序器上进行一系列的改进和优化,在保证检索效果的同时显著提高了效率。 其在长上下文多语言文本检索领域具有显著的优势,并有潜力应用于各种研究和工业场景。 反向缩放RoPE NTK和两阶段预训练策略的有效性也得到了实验验证。

>> 背景痛点

长文本多语言文本检索的需求日益增长: 现有的基于编码器的模型难以处理长文本和多语言文本,而大型语言模型(LLM)计算成本过高,不适合自托管搜索服务。

● 现有多语言编码器上下文窗口有限: 例如,之前的多语言编码器XLM-R的上下文窗口长度仅为512个token,无法有效处理长文本。

● 缺乏高效且有效的长上下文多语言检索模型: 现有模型在处理长上下文检索任务时,效率和效果难以兼顾。

● 需要高效的多语言文本表示模型重排序器来改进检索性能。

>> 具体的解决方案:提出了mGTE,一种面向长上下文的多语言文本表示模型重排序模型。论文提出了一种端到端的解决方案,包括一个长上下文多语言文本编码器、一个混合文本表示模型(TRM)和一个交叉编码器重排序器。

● 长上下文多语言文本编码器基于BERT架构,进行了多项改进,包括使用旋转位置编码(RoPE)代替绝对位置编码,将FFN升级为门控线性单元(GLU),移除注意力分数上的dropout,并将token embedding大小填充为64的倍数以提高吞吐量。 此外,引入了无填充(unpadding)机制以减少冗余计算。该编码器在原生8192个token的上下文中进行预训练。使用多阶段课程(2048-token到8192-token)进行掩码语言模型预训练

● 混合文本表示模型 (TRM): 基于编码器构建,通过对比学习进行预训练和微调。使用InfoNCE损失函数,结合密集向量和稀疏向量两种表示方式。该模型结合了密集向量和稀疏向量两种表示方式。密集向量通过对比学习获得,稀疏向量则通过预测每个token的权重得到。TRM采用多任务学习的方式,同时优化Matryoshka嵌入和稀疏表示,以提供弹性向量表示。

● 交叉编码器重排序器: 该模型采用交叉编码器架构,根据对比学习进行微调直接预测查询和文档的相关性得分

>> 核心思路步骤

● 文本编码器预训练: 使用两阶段的课程学习策略,先在2048个token的上下文中预训练,再在8192个token的上下文中预训练,均采用掩码语言建模(MLM)目标函数。

● 文本表示模型 (TRM) 预训练: 使用对比学习,对大量的弱相关文本对进行预训练,得到文本的密集向量表示。 使用了反向缩放RoPE NTK来适应较短的上下文长度。

● TRM 微调: 在高质量数据集上进行微调,同时学习Matryoshka嵌入和稀疏表示,目标函数为InfoNCE损失函数。

● 重排序器微调: 在相同的数据集上微调重排序器,同样使用InfoNCE损失函数,但调整了负样本的采样策略。

>> 优势

● 高效:在训练和推理过程中都比同等规模的现有模型(如BGE-M3)效率更高,编码速度提升了14倍。无填充机制xFormers库的应用是效率提升的关键。

● 有效:在多个多语言和长上下文检索基准测试中,其性能与大型的现有模型相当,甚至在长上下文检索任务上表现更好。

● 通用性:支持多种语言,能够处理长文本。

● 开源:模型和代码将开源,便于进一步的研究和应用。

目录

相关文章

《mGTE: Generalized Long-Context Text Representation and Reranking Models for Multilingual Text Retrieval》翻译与解读

gte-multilingual-base的简介

1、模型信息:305M,Dimension=768,Max_Tokens=8192

2、评估

检索任务

MLDR的详细结果

MTEB上的结果:英语、中文、法语、波兰语

gte-multilingual-base的安装和使用方法

1、安装

2、使用方法

建议安装 xformers 并启用 unpadding 来加速,参考enable-unpadding-and-xformers

如何离线使用:new-impl/discussions/2

如何与TEI一起使用:refs/pr/7

3、云 API 服务

嵌入模型:文本嵌入模型有三个版本可用:text-embedding-v1/v2/v3,其中 v3 是最新 API 服务

ReRank 模型:gte-rerank 模型服务可用

gte-multilingual-base的案例应用

1、使用 Transformer 实现密集嵌入

2、与sentence-transformers一起使用

3、与自定义代码一起使用以获取密集嵌入和稀疏标记权重


相关文章

《mGTE: Generalized Long-Context Text Representation and Reranking Models for Multilingual Text Retrieval》翻译与解读

地址

论文地址:https://arxiv.org/abs/2407.19669

时间

2024729

作者

阿里巴巴集团,香港理工大学

摘要

我们介绍了从零开始构建长上下文多语言文本表示模型(TRM)和重排序器用于文本检索的系统性工作。首先,我们介绍了一个基于RoPE无填充技术增强的文本编码器(基础尺寸),该编码器在原生8192个token的上下文中进行了预训练(比之前多语言编码器的512个token更长)。然后,我们通过对比学习构建了一个混合型TRM和一个交叉编码器重排序器。评估表明,我们的文本编码器性能优于相同大小的先前最先进XLM-R模型。同时,我们的TRM和重排序器达到了与大尺寸最先进BGE-M3模型相当的表现,并且在长上下文检索基准测试中取得了更好的结果。进一步分析显示,所提出的模型在训练和推理过程中都表现出更高的效率。我们认为它们的效率和有效性可以为各种研究和工业应用带来益处。

gte-multilingual-base的简介

gte -multilingual-base模型是GTE (通用文本嵌入)模型系列中的最新模型,具有几个关键属性:
>> 高性能:与类似规模的模型相比,在多语言检索任务和多任务表示模型评估中取得了最先进的(SOTA)结果。
>> 训练架构:使用编码器的 transformers 架构进行训练,从而减小了模型大小。与之前基于码器的 LLM 架构的模型(例如 gte-qwen2-1.5b-instruct)不同,该模型对推理的硬件要求较低,推理速度提高了 10 倍。
>> 长上下文:支持最多8192 个标记的文本长度。
>> 多语言功能:支持超过70 种语言。
>> 弹性密集嵌入:支持弹性输出密集表示,同时保持下游任务的有效性,显著降低存储成本,提高执行效率。
>> 稀疏向量:除了密集表示之外,它还可以生成稀疏向量。

HuggingFace地址https://huggingface.co/Alibaba-NLP/gte-multilingual-base

1、模型信息:305M,Dimension=768,Max_Tokens=8192

模型尺寸:305M
嵌入维度:768
最大输入令牌:8192

2、评估

我们在多个下游任务上验证了gte-multilingual-base模型的性能,包括多语言检索、跨语言检索、长文本检索以及MTEB 排行榜上的一般文本表示评估等。

检索任务

关于MIRACL和MLDR(多语言)、MKQA(跨语言)、BEIR和LoCo (英语)的检索结果。

MLDR的详细结果

MTEB上的结果:英语、中文、法语、波兰语

gte-multilingual-base的安装和使用方法

1、安装

下载地址https://huggingface.co/Alibaba-NLP/gte-multilingual-base

2、使用方法

建议安装 xformers 并启用 unpadding 来加速,参考enable-unpadding-and-xformers

地址https://huggingface.co/Alibaba-NLP/new-impl#recommendation-enable-unpadding-and-acceleration-with-xformers

如何离线使用:new-impl/discussions/2

地址https://huggingface.co/Alibaba-NLP/new-impl/discussions/2#662b08d04d8c3d0a09c88fa3

如何与TEI一起使用:refs/pr/7

地址https://huggingface.co/Alibaba-NLP/gte-multilingual-base/discussions/7#66bfb82ea03b764ca92a2221

3、云 API 服务

除了开源的GTE系列机型外,GTE系列机型在阿里云上也以商业API服务的形式提供。请注意,商业 API 背后的模型与开源模型并不完全相同。

嵌入模型:文本嵌入模型有三个版本可用:text-embedding-v1/v2/v3,其中 v3 是最新 API 服务

ReRank 模型:gte-rerank 模型服务可用

gte-multilingual-base的案例应用

1、使用 Transformer 实现密集嵌入

# Requires transformers>=4.36.0

import torch.nn.functional as F
from transformers import AutoModel, AutoTokenizer

input_texts = [
    "what is the capital of China?",
    "how to implement quick sort in python?",
    "北京",
    "快排算法介绍"
]

model_name_or_path = 'Alibaba-NLP/gte-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) * 100
print(scores.tolist())

# [[0.3016996383666992, 0.7503870129585266, 0.3203084468841553]]

2、与sentence-transformers一起使用

​
# Requires transformers>=4.36.0

import torch.nn.functional as F
from transformers import AutoModel, AutoTokenizer

input_texts = [
    "what is the capital of China?",
    "how to implement quick sort in python?",
    "北京",
    "快排算法介绍"
]

model_name_or_path = 'Alibaba-NLP/gte-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) * 100
print(scores.tolist())

# [[0.3016996383666992, 0.7503870129585266, 0.3203084468841553]]

​

3、与自定义代码一起使用以获取密集嵌入和稀疏标记权重

# You can find the script gte_embedding.py in https://huggingface.co/Alibaba-NLP/gte-multilingual-base/blob/main/scripts/gte_embedding.py

from gte_embedding import GTEEmbeddidng

model_name_or_path = 'Alibaba-NLP/gte-multilingual-base'
model = GTEEmbeddidng(model_name_or_path)
query = "中国的首都在哪儿"

docs = [
    "what is the capital of China?",
    "how to implement quick sort in python?",
    "北京",
    "快排算法介绍"
]

embs = model.encode(docs, return_dense=True,return_sparse=True)
print('dense_embeddings vecs', embs['dense_embeddings'])
print('token_weights', embs['token_weights'])
pairs = [(query, doc) for doc in docs]
dense_scores = model.compute_scores(pairs, dense_weight=1.0, sparse_weight=0.0)
sparse_scores = model.compute_scores(pairs, dense_weight=0.0, sparse_weight=1.0)
hybrid_scores = model.compute_scores(pairs, dense_weight=1.0, sparse_weight=0.3)

print('dense_scores', dense_scores)
print('sparse_scores', sparse_scores)
print('hybrid_scores', hybrid_scores)

# dense_scores [0.85302734375, 0.257568359375, 0.76953125, 0.325439453125]
# sparse_scores [0.0, 0.0, 4.600879669189453, 1.570279598236084]
# hybrid_scores [0.85302734375, 0.257568359375, 2.1497951507568356, 0.7965233325958252]

<think>好的,我现在需要帮用户解决在Navicat中为已有的主键设置自增属性的问题。根据用户提供的引用内容,我需要先整理现有的信息,然后一步步指导用户操作。 首先,用户提到的引用[2]提到可以通过SQL语句来添加自增主键,例如使用`alter table`命令。引用[3]是关于PostgreSQL的,但同样使用`alter table`来设置自增。而引用[4]则指出在Navicat图形界面中修改自增初始值时可能遇到保存后回弹的问题,但其实已经生效了。 用户的问题是针对已有的主键添加自增属性。通常,自增属性在数据库中有不同的实现方式,比如MySQL的AUTO_INCREMENTPostgreSQL的序列(sequence)。需要区分数据库类型,但用户提供的引用中同时提到了MySQLPostgreSQL,可能需要分别说明。 接下来,我需要考虑两种方法使用SQL语句使用Navicat的图形界面。对于已有主键,可能需要先确保该主键列是整数类型,比如INT或SERIAL(PostgreSQL)。如果已经存在主键但没有自增属性,可以通过修改列属性来添加。 在MySQL中,用户可以使用`ALTER TABLE 表名 MODIFY 列名 数据类型 AUTO_INCREMENT;`。例如,引用[2]中的例子是添加自增主键,但如果主键已存在,可能需要用MODIFY而不是ADD。需要注意的是,如果表中已有数据,设置自增起始值可能需要使用`ALTER TABLE ... AUTO_INCREMENT=值;`,但引用[4]提到在Navicat中修改初始值可能会显示回弹,但实际上生效,所以需要告知用户这一点。 对于PostgreSQL,设置自增通常涉及创建序列(SEQUENCE)并将列的默认值设置为该序列的nextval,如引用[3]所示。用户可能需要先创建序列,然后将列的默认值关联到该序列。Navicat的图形界面是否有直接设置的方式呢?可能需要指导用户通过设计表界面,在默认值中选择“序列”并指定已有的序列,或者新建一个。 然后,图形界面操作的步骤大致是:打开表设计,选择主键字段,勾选自增选项(AUTO_INCREMENT或类似),对于PostgreSQL可能需要设置默认值为序列。同时,初始值的设置虽然可能回弹,但实际有效,需要用户测试插入数据确认。 需要注意的是,不同数据库类型的操作不同,用户可能不清楚自己使用的数据库,所以需要分开说明MySQLPostgreSQL的情况。另外,用户可能遇到的常见问题,比如主键字段不是整数类型,或者已有数据导致自增值冲突,也需要提醒。 最后,生成相关问题的时候,需要考虑用户可能进一步的问题,比如如何修改起始值,或处理自增冲突的情况,以及不同数据库的区别。</think>### 如何在Navicat中为已有的主键设置自增属性? #### 方法一:通过SQL语句直接修改(推荐) 1. **MySQL数据库** 使用`ALTER TABLE`语句修改主键字段属性,添加`AUTO_INCREMENT`: ```sql ALTER TABLE 表名 MODIFY 主键字段名 数据类型 AUTO_INCREMENT; ``` 例如,将表`user`的主键`id`设置为自增: ```sql ALTER TABLE user MODIFY id INT AUTO_INCREMENT; ``` > **注意**:需确保主键字段为整数类型(如`INT`, `BIGINT`)[^2]。 2. **PostgreSQL数据库** PostgreSQL需通过序列(Sequence)实现自增: ```sql -- 创建序列(若不存在) CREATE SEQUENCE 表名_主键字段名_seq; -- 将主键字段默认值绑定到序列 ALTER TABLE 表名 ALTER COLUMN 主键字段名 SET DEFAULT nextval('表名_主键字段名_seq'); ``` 例如: ```sql CREATE SEQUENCE user_id_seq; ALTER TABLE user ALTER COLUMN id SET DEFAULT nextval('user_id_seq'); ``` 若已有序列,可直接绑定[^3]。 --- #### 方法二:通过Navicat图形界面操作 1. **MySQL设置步骤** - 右键目标表 → **设计表** → 选择主键字段。 - 勾选下方**自动递增**选项(需字段为整数类型)。 - 保存修改,插入数据测试自增是否生效。 2. **PostgreSQL设置步骤** - 右键目标表 → **设计表** → 选择主键字段。 - 在**默认**栏输入`nextval('序列名'::regclass)`(需提前创建序列)。 - 保存后测试插入数据。 --- #### 常见问题处理 1. **自增初始值无法保存** 在Navicat中修改初始值时,保存后可能显示回弹到默认值,但实际已生效。可通过插入新数据验证[^4]。 2. **主键字段类型错误** 若主键字段非整数类型(如字符串),需先修改字段类型为`INT`或`BIGINT`。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一个处女座的程序猿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值