247 lines
10 KiB
Markdown
247 lines
10 KiB
Markdown
---
|
||
tasks:
|
||
- sentence-embedding
|
||
widgets:
|
||
- version: v1.1.0
|
||
task: sentence-embedding
|
||
inputs:
|
||
- type: text
|
||
name: source_sentence
|
||
- type: text-list
|
||
name: sentences_to_compare
|
||
examples:
|
||
- name: 示例1
|
||
inputs:
|
||
- data:
|
||
- 功和功率的区别
|
||
- data:
|
||
- 功反映做功多少,功率反映做功快慢。
|
||
- 什么是有功功率和无功功率?无功功率有什么用什么是有功功率和无功功率?无功功率有什么用电力系统中的电源是由发电机产生的三相正弦交流电,在交>流电路中,由电源供给负载的电功率有两种;一种是有功功率,一种是无功功率.
|
||
- 优质解答在物理学中,用电功率表示消耗电能的快慢.电功率用P表示,它的单位是瓦特(Watt),简称瓦(Wa)符号是W.电流在单位时间内做的功叫做电功率 以灯泡为例,电功率越大,灯泡越亮.灯泡的亮暗由电功率(实际功率)决定,不由通过的电流、电压、电能决定!
|
||
- name: 示例2
|
||
inputs:
|
||
- data:
|
||
- 什么是桥
|
||
- data:
|
||
- 由全国科学技术名词审定委员会审定的科技名词“桥”的定义为:跨越河流、山谷、障碍物或其他交通线而修建的架空通道
|
||
- 桥是一种连接两岸的建筑
|
||
- 转向桥,是指承担转向任务的车桥。一般汽车的前桥是转向桥。四轮转向汽车的前后桥,都是转向桥。
|
||
- 桥梁艺术研究桥梁美学效果的艺术。起源于人类修建桥梁的实践。作为一种建筑,由于功能不同、使用材料有差别,桥梁表现为不同的结构和形式。基本的有拱桥、梁桥和吊桥。
|
||
- name: 示例3
|
||
inputs:
|
||
- data:
|
||
- 福鼎在哪个市
|
||
- data:
|
||
- 福鼎是福建省宁德市福鼎市。
|
||
- 福鼎位于福建省东北部,东南濒东海,水系发达,岛屿星罗棋布。除此之外,福鼎地貌丰富,著名的太姥山就在福鼎辖内,以峰险、石奇、洞幽、雾幻四绝著称于世。
|
||
- 福鼎市人民政府真诚的欢迎国内外朋友前往迷人的太姥山观光、旅游。
|
||
- 福建省福鼎市桐山街道,地处福鼎城区,地理环境优越,三面环山,东临大海,境内水陆交通方便,是福鼎政治、经济、文化、交通中心区。
|
||
- name: 示例4
|
||
inputs:
|
||
- data:
|
||
- 吃完海鲜可以喝牛奶吗?
|
||
- data:
|
||
- 不可以,早晨喝牛奶不科学
|
||
- 吃了海鲜后是不能再喝牛奶的,因为牛奶中含得有维生素C,如果海鲜喝牛奶一起服用会对人体造成一定的伤害
|
||
- 吃海鲜是不能同时喝牛奶吃水果,这个至少间隔6小时以上才可以。
|
||
- 吃海鲜是不可以吃柠檬的因为其中的维生素C会和海鲜中的矿物质形成砷
|
||
model-type:
|
||
- bert
|
||
|
||
domain:
|
||
- nlp
|
||
|
||
frameworks:
|
||
- pytorch
|
||
|
||
backbone:
|
||
- transformer
|
||
|
||
metrics:
|
||
- mrr@10
|
||
- recall@1000
|
||
- ndcg@10
|
||
|
||
license: Apache License 2.0
|
||
|
||
language:
|
||
- multilingual
|
||
|
||
tags:
|
||
- text representation
|
||
- text retrieval
|
||
- passage retrieval
|
||
- Transformer
|
||
- GTE
|
||
- 多语言
|
||
- 长文本
|
||
- 文本相关性
|
||
- 文本相似度
|
||
|
||
---
|
||
|
||
# GTE多语言通用文本表示模型
|
||
|
||
文本表示是自然语言处理(NLP)领域的核心问题, 其在很多NLP、信息检索的下游任务中发挥着非常重要的作用。近几年, 随着深度学习的发展,尤其是预训练语言模型的出现极大的推动了文本表示技术的效果, 基于预训练语言模型的文本表示模型在学术研究数据、工业实际应用中都明显优于传统的基于统计模型或者浅层神经网络的文本表示模型。这里, 我们主要关注基于预训练语言模型的文本表示。
|
||
|
||
文本表示示例, 输入一个句子, 输入一个固定维度的连续向量:
|
||
|
||
- 输入: 吃完海鲜可以喝牛奶吗?
|
||
- 输出: [0.27162,-0.66159,0.33031,0.24121,0.46122,...]
|
||
|
||
文本的向量表示通常可以用于文本聚类、文本相似度计算、文本向量召回等下游任务中。
|
||
|
||
## GTE多语言通用文本表示模型
|
||
|
||
gte-multilingual-base模型是GTE(通用文本向量,General Text Embedding) 系列模型中的最新的多语言模型,该模型具有几个关键特性:
|
||
|
||
- 高性能: 在多语言检索任务和多任务表示模型评估中,相比同规模模型,达到了最先进的(SOTA)结果。
|
||
- 高推理效率:采用Encoder-Only架构进行训练,使模型体积更小(300M)。LLM架构的向量模型(例如,gte-qwen2-7b-instruct)不同,该模型在推理时对硬件的要求更低,推理速度提高了10倍
|
||
- 长上下文:支持最多8192个token的文本长度
|
||
- 多语言能力:支持70多种语言
|
||
- 弹性向量维度:支持弹性的向量表示,同时保持下游任务的有效性,显著降低存储成本并提高了检索效率。
|
||
- 稀疏向量:除了连续向量表示外,还可以生成稀疏向量表示
|
||
|
||
模型训练更多细节可以参考论文: [mGTE: Generalized Long-Context Text Representation and Reranking Models for Multilingual Text Retrieval](https://arxiv.org/abs/2407.19669)
|
||
|
||
### 如何使用
|
||
```
|
||
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]]
|
||
```
|
||
|
||
- 使用sentence-transformers进行推理
|
||
```
|
||
# Requires sentences-transformers>=3.0.0
|
||
|
||
from sentence_transformers import SentenceTransformer
|
||
from sentence_transformers.util import cos_sim
|
||
import numpy as np
|
||
|
||
input_texts = [
|
||
"what is the capital of China?",
|
||
"how to implement quick sort in python?",
|
||
"北京",
|
||
"快排算法介绍"
|
||
]
|
||
|
||
model_name_or_path="Alibaba-NLP/gte-multilingual-base"
|
||
model = SentenceTransformer(', trust_remote_code=True)
|
||
embeddings = model.encode(input_texts) # embeddings.shape (4, 768)
|
||
|
||
# normalized embeddings
|
||
norms = np.linalg.norm(embeddings, ord=2, axis=1, keepdims=True)
|
||
norms[norms == 0] = 1
|
||
embeddings = embeddings / norms
|
||
|
||
# sim scores
|
||
scores = (embeddings[:1] @ embeddings[1:].T)
|
||
|
||
print(scores.tolist())
|
||
# [[0.301699697971344, 0.7503870129585266, 0.32030850648880005]]
|
||
```
|
||
|
||
- 使用自定义GTE-Embedding脚本获取连续向量表示和离散向量表示
|
||
```gte_embedding.py```文件在```scripts/gte_embedding.py```中
|
||
|
||
```
|
||
from gte_embedding import GTEEmbeddidng
|
||
|
||
model_name_or_path = 'gte_sentence-embedding_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)
|
||
hybird_scores = model.compute_scores(pairs, dense_weight=1.0, sparse_weight=0.3)
|
||
|
||
print('dense_scores', dense_scores)
|
||
print('sparse_scores', sparse_scores)
|
||
print('hybird_scores', hybird_scores)
|
||
|
||
#dense_scores [0.85302734375, 0.257568359375, 0.76953125, 0.325439453125]
|
||
#sparse_scores [0.0, 0.0, 4.600879669189453, 1.570279598236084]
|
||
#hybird_scores [0.85302734375, 0.257568359375, 2.1497951507568356, 0.7965233325958252]
|
||
```
|
||
|
||
## 模型效果评估
|
||
|
||
我们在多个下游任务上验证了GTE多语言表征模型的效果,包括多语言检索、跨语言检索、长文本检索,以及在[MTEB](https://huggingface.co/spaces/mteb/leaderboard)多任务文本表征评测
|
||
|
||
- **检索任务**
|
||
|
||
Retrieval results on [MIRACL](https://arxiv.org/abs/2210.09984) and [MLDR](https://arxiv.org/abs/2402.03216) (multilingual), [MKQA](https://arxiv.org/abs/2007.15207) (crosslingual), [BEIR](https://arxiv.org/abs/2104.08663) and [LoCo](https://arxiv.org/abs/2402.07440) (English)
|
||
|
||
![image](./images/mgte-retrieval.png)
|
||
|
||
- **MTEB多语言**
|
||
|
||
Results on MTEB English, Chinese, French, Polish
|
||
|
||
![image](./images/mgte-mteb.png)
|
||
|
||
更多实验结果可以参考论文[paper](https://arxiv.org/pdf/2407.19669).
|
||
|
||
## API云服务
|
||
|
||
除了开源的 GTE 系列模型,GTE系列模型同时在阿里云上提供商用API服务:
|
||
|
||
- [文本Embedding模型](https://help.aliyun.com/zh/model-studio/developer-reference/general-text-embedding/): 提供三种版本的文本嵌入模型:text-embedding-v1/v2/v3,其中v3是最新版本的模型服务
|
||
- [文本ReRank模型](https://help.aliyun.com/zh/model-studio/developer-reference/general-text-sorting-model/): 提供gte-rerank模型服务, 模型持续迭代中
|
||
|
||
Note: API服务背后的模型与开源模型并不完全相同
|
||
|
||
|
||
|
||
## 引用
|
||
|
||
```BibTeX
|
||
@article{zhang2024mgte,
|
||
title={mGTE: Generalized Long-Context Text Representation and Reranking Models for Multilingual Text Retrieval},
|
||
author={Zhang, Xin and Zhang, Yanzhao and Long, Dingkun and Xie, Wen and Dai, Ziqi and Tang, Jialong and Lin, Huan and Yang, Baosong and Xie, Pengjun and Huang, Fei and others},
|
||
journal={arXiv preprint arXiv:2407.19669},
|
||
year={2024}
|
||
}
|
||
@article{li2023towards,
|
||
title={Towards general text embeddings with multi-stage contrastive learning},
|
||
author={Li, Zehan and Zhang, Xin and Zhang, Yanzhao and Long, Dingkun and Xie, Pengjun and Zhang, Meishan},
|
||
journal={arXiv preprint arXiv:2308.03281},
|
||
year={2023}
|
||
}
|
||
``` |