E5-large-en-ru 模型信息
模型基本信息
这是intfloat/multilingual-e5-large模型的词汇表剪枝版本,仅保留俄语和英语词元。
模型尺寸对比
|
intfloat/multilingual-e5-large原版 |
d0rj/e5-large-en-ru剪裁版 |
模型大小(MB) |
2135.82 |
1394.8 |
参数量 |
559,890,946 |
365,638,14 |
词嵌入维度 |
256,002,048 |
61,749,248 |
性能表现
在SberQuAD开发集基准测试中表现相当:
SberQuAD指标(4122个问题) |
intfloat/multilingual-e5-large原版 |
d0rj/e5-large-en-ru剪裁版 |
recall@3 |
0.787239204269772 |
0.7882096069868996 |
map@3 |
0.7230713245997101 |
0.723192624939351 |
mrr@3 |
0.7241630276564784 |
0.7243651948892132 |
recall@5 |
0.8277535177098496 |
0.8284813197476953 |
map@5 |
0.7301603186155587 |
0.7302573588872716 |
mrr@5 |
0.7334667637069385 |
0.7335718906679607 |
recall@10 |
0.8716642406598738 |
0.871421639980592 |
map@10 |
0.7314774917730316 |
0.7313000338687417 |
mrr@10 |
0.7392223685527911 |
0.7391814537556898 |
使用指南
- 检索任务使用点积距离
- 非对称任务(如开放QA中的段落检索)使用"query: "和"passage: "前缀
- 对称任务(如语义相似度)统一使用"query: "前缀
- 特征提取任务(如线性探测分类)也使用"query: "前缀
transformers使用示例
直接调用方式
import torch.nn.functional as F
from torch import Tensor
from transformers import XLMRobertaTokenizer, XLMRobertaModel
def average_pool(last_hidden_states: Tensor, attention_mask: Tensor) -> Tensor:
last_hidden = last_hidden_states.masked_fill(~attention_mask[..., None].bool(), 0.0)
return last_hidden.sum(dim=1) / attention_mask.sum(dim=1)[..., None]
input_texts = [
'query: 企业官网与名片网站有何区别?',
'query: 第一辆无轨电车是在哪里发明的?',
'passage: 第一辆无轨电车由德国工程师维尔纳·冯·西门子发明,可能受到其兄弟威廉·西门子博士1881年5月18日在英国皇家科学学会提出的构想影响。电力系统通过八轮接触车沿着两条平行接触线运行...',
'passage: 企业官网包含公司完整信息,区别于名片网站的特点是信息全面性,通常包含内容管理功能工具(搜索筛选、事件日历、图片库、企业博客等),可与内部信息系统集成,并可能包含员工、经销商等特定用户的专属版块...'
]
tokenizer = XLMRobertaTokenizer.from_pretrained('d0rj/e5-large-en-ru', use_cache=False)
model = XLMRobertaModel.from_pretrained('d0rj/e5-large-en-ru', use_cache=False)
batch_dict = tokenizer(input_texts, max_length=512, padding=True, truncation=True, return_tensors='pt')
outputs = model(**batch_dict)
embeddings = average_pool(outputs.last_hidden_state, batch_dict['attention_mask'])
embeddings = F.normalize(embeddings, p=2, dim=1)
scores = (embeddings[:2] @ embeddings[2:].T) * 100
print(scores.tolist())
使用pipeline
from transformers import pipeline
pipe = pipeline('feature-extraction', model='d0rj/e5-large-en-ru')
embeddings = pipe(input_texts, return_tensors=True)
print(embeddings[0].size())
sentence-transformers使用示例
from sentence_transformers import SentenceTransformer
sentences = [
'query: 什么是圆形张量?',
'passage: 摘要:我们提出了一种基于径向对称性的圆形张量压缩新方法,首先推广了PCA和特征分解在圆形张量上的应用...'
]
model = SentenceTransformer('d0rj/e5-large-en-ru')
embeddings = model.encode(sentences, convert_to_tensor=True)
print(embeddings.size())