库名称: sentence-transformers
流水线标签: 句子相似度
标签:
- 句子转换器
- 特征提取
- 句子相似度
许可证: apache-2.0
基础模型:
- deepvk/RuModernBERT-base
数据集:
- deepvk/ru-HNP
- deepvk/ru-WANLI
- deepvk/cultura_ru_ed
- Shitao/bge-m3-data
- CarlBrendt/Summ_Dialog_News
- IlyaGusev/gazeta
- its5Q/habr_qna
- wikimedia/wikipedia
- RussianNLP/wikiomnia
语言:
- 俄语
USER2基础版
USER2 是新一代俄语通用句子编码器(Universal Sentence Encoder for Russian),专为支持长达8,192个token的上下文句子表征而设计。
该模型基于RuModernBERT
编码器构建,并针对检索和语义任务进行了微调。
同时支持套娃表征学习(MRL)技术——该技术可在表征质量损失最小的情况下缩减嵌入维度。
此为1.49亿参数的基础版本。
模型 |
参数量 |
上下文长度 |
隐藏维度 |
MRL支持维度 |
deepvk/USER2-small |
3400万 |
8192 |
384 |
[32, 64, 128, 256, 384] |
deepvk/USER2-base |
1.49亿 |
8192 |
768 |
[32, 64, 128, 256, 384, 512, 768] |
性能表现
我们通过MTEB-rus
基准测试评估模型质量,同时使用MultiLongDocRetrieval(MLDR)任务的俄语子集衡量长上下文检索能力。
MTEB-rus
模型 |
参数量 |
隐藏维度 |
上下文长度 |
MRL支持 |
平均(任务) |
平均(任务类型) |
分类 |
聚类 |
多标签分类 |
配对分类 |
重排序 |
检索 |
语义相似度 |
USER-base |
1.24亿 |
768 |
512 |
❌ |
58.11 |
56.67 |
59.89 |
53.26 |
37.72 |
59.76 |
55.58 |
56.14 |
74.35 |
USER-bge-m3 |
3.59亿 |
1024 |
8192 |
❌ |
62.80 |
62.28 |
61.92 |
53.66 |
36.18 |
65.07 |
68.72 |
73.63 |
76.76 |
multilingual-e5-base |
2.78亿 |
768 |
512 |
❌ |
58.34 |
57.24 |
58.25 |
50.27 |
33.65 |
54.98 |
66.24 |
67.14 |
70.16 |
multilingual-e5-large-instruct |
5.60亿 |
1024 |
512 |
❌ |
65.00 |
63.36 |
66.28 |
63.13 |
41.15 |
63.89 |
64.35 |
68.23 |
76.48 |
jina-embeddings-v3 |
5.72亿 |
1024 |
8192 |
✅ |
63.45 |
60.93 |
65.24 |
60.90 |
39.24 |
59.22 |
53.86 |
71.99 |
76.04 |
ru-en-RoSBERTa |
4.04亿 |
1024 |
512 |
❌ |
61.71 |
60.40 |
62.56 |
56.06 |
38.88 |
60.79 |
63.89 |
66.52 |
74.13 |
USER2-small |
3400万 |
384 |
8192 |
✅ |
58.32 |
56.68 |
59.76 |
57.06 |
33.56 |
54.02 |
58.26 |
61.87 |
72.25 |
USER2-base |
1.49亿 |
768 |
8192 |
✅ |
61.12 |
59.59 |
61.67 |
59.22 |
36.61 |
56.39 |
62.06 |
66.90 |
74.28 |
MLDR-rus
模型 |
参数量 |
nDCG@10 ↑ |
USER-bge-m3 |
3.59亿 |
58.53 |
KaLM-v1.5 |
4.94亿 |
53.75 |
jina-embeddings-v3 |
5.72亿 |
49.67 |
E5-mistral-7b |
71.1亿 |
52.40 |
USER2-small |
3400万 |
51.69 |
USER2-base |
1.49亿 |
54.17 |
仅比较支持8192上下文长度的模型。
套娃表征
为评估MRL能力,我们对嵌入进行维度裁剪后使用MTEB-rus
测试。
使用指南
前缀说明
本模型采用与Nomic Embed相似的训练方式,需在输入前添加任务特定前缀:
- "classification: " 默认通用前缀,适用于多数任务
- "clustering: " 推荐用于聚类场景:文本分组、主题发现或去重
- "search_query: " 与 "search_document: " 专为检索和重排序设计。短文本分类任务中"search_query"可能表现更优,而长文本相似度任务适合使用"search_document"
建议尝试不同前缀,某些领域可能需要特定前缀。
Sentence Transformers
from sentence_transformers import SentenceTransformer
model = SentenceTransformer("deepvk/USER2-base")
query_embeddings = model.encode(["第一艘'平静'号驱逐舰何时下水?"], prompt_name="search_query")
document_embeddings = model.encode(["平静号驱逐舰\n1952年8月19日列入苏联海军序列。"], prompt_name="search_document")
similarities = model.similarity(query_embeddings, document_embeddings)
维度裁剪示例:
model = SentenceTransformer("deepvk/USER2-base", truncate_dim=128)
推荐使用训练维度[32, 64, 128, 256, 384, 512, 768]
以获得最佳效果。
Transformers
import torch
import torch.nn.functional as F
from transformers import AutoTokenizer, AutoModel
def mean_pooling(model_output, attention_mask):
token_embeddings = model_output[0]
input_mask_expanded = (
attention_mask.unsqueeze(-1).expand(token_embeddings.size()).float()
return torch.sum(token_embeddings * input_mask_expanded, 1) / torch.clamp(
input_mask_expanded.sum(1), min=1e-9
)
queries = ["search_query: 第一艘'平静'号驱逐舰何时下水?"]
documents = ["search_document: 平静号驱逐舰\n1952年8月19日列入苏联海军序列。"]
tokenizer = AutoTokenizer.from_pretrained("deepvk/USER2-base")
model = AutoModel.from_pretrained("deepvk/USER2-base")
encoded_queries = tokenizer(queries, padding=True, truncation=True, return_tensors="pt")
encoded_documents = tokenizer(documents, padding=True, truncation=True, return_tensors="pt")
with torch.no_grad():
queries_outputs = model(**encoded_queries)
documents_outputs = model(**encoded_documents)
query_embeddings = mean_pooling(queries_outputs, encoded_queries["attention_mask"])
query_embeddings = F.normalize(query_embeddings, p=2, dim=1)
doc_embeddings = mean_pooling(documents_outputs, encoded_documents["attention_mask"])
doc_embeddings = F.normalize(doc_embeddings, p=2, dim=1)
similarities = query_embeddings @ doc_embeddings.T
维度裁剪方法:
query_embeddings = query_embeddings[:, :truncate_dim]
训练细节
本1.49亿参数基础版基于RuModernBERT-base
,经历三阶段训练:
- RetroMAE预训练
- 弱监督微调
- 监督微调
采用bge-m3训练策略,使用RetroMAE增强检索能力(尤其长文本)。为解决俄语优质数据稀缺问题,我们采用:
- 跨语言迁移:联合训练英俄数据,利用
nomic-unsupervised
及自建平行语料
- 无监督配对挖掘:从
cultura_ru_edu
语料中提取5000万非重叠文本对
训练数据集
弱监督阶段
监督阶段