模型简介
模型特点
模型能力
使用案例
🚀 USER2-small
USER2 是新一代的俄语通用句子编码器(Universal Sentence Encoder for Russian),专为句子表示而设计,支持长达 8192 个标记的长上下文。
这些模型基于 RuModernBERT
编码器构建,并针对检索和语义任务进行了微调。它们还支持 Matryoshka 表示学习(MRL) 技术,该技术能够在表示质量损失最小的情况下减小嵌入维度。
这是一个小型模型,拥有 3400 万个参数。
🚀 快速开始
USER2-small 模型专为俄语句子表示而设计,支持长上下文,且具备 Matryoshka 表示学习(MRL)能力。以下将从模型性能、使用方法、训练细节等方面详细介绍该模型。
✨ 主要特性
- 长上下文支持:能够处理长达 8192 个标记的长上下文。
- Matryoshka 表示学习(MRL):支持 MRL 技术,可在表示质量损失最小的情况下减小嵌入维度。
- 多任务微调:基于
RuModernBERT
编码器构建,并针对检索和语义任务进行了微调。
📚 详细文档
模型信息
属性 | 详情 |
---|---|
模型类型 | USER2-small |
基础模型 | deepvk/RuModernBERT-small |
训练数据集 | 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 |
许可证 | apache-2.0 |
模型对比
模型 | 大小 | 上下文长度 | 隐藏维度 | MRL 维度 |
---|---|---|---|---|
deepvk/USER2-small |
34M | 8192 | 384 | [32, 64, 128, 256, 384] |
deepvk/USER2-base |
149M | 8192 | 768 | [32, 64, 128, 256, 384, 512, 768] |
性能评估
MTEB-rus 基准测试
模型 | 大小 | 隐藏维度 | 上下文长度 | MRL 支持 | 平均任务得分 | 平均任务类型得分 | 分类 | 聚类 | 多标签分类 | 成对分类 | 重排序 | 检索 | STS |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
USER-base |
124M | 768 | 512 | ❌ | 58.11 | 56.67 | 59.89 | 53.26 | 37.72 | 59.76 | 55.58 | 56.14 | 74.35 |
USER-bge-m3 |
359M | 1024 | 8192 | ❌ | 62.80 | 62.28 | 61.92 | 53.66 | 36.18 | 65.07 | 68.72 | 73.63 | 76.76 |
multilingual-e5-base |
278M | 768 | 512 | ❌ | 58.34 | 57.24 | 58.25 | 50.27 | 33.65 | 54.98 | 66.24 | 67.14 | 70.16 |
multilingual-e5-large-instruct |
560M | 1024 | 512 | ❌ | 65.00 | 63.36 | 66.28 | 63.13 | 41.15 | 63.89 | 64.35 | 68.23 | 76.48 |
jina-embeddings-v3 |
572M | 1024 | 8192 | ✅ | 63.45 | 60.93 | 65.24 | 60.90 | 39.24 | 59.22 | 53.86 | 71.99 | 76.04 |
ru-en-RoSBERTa |
404M | 1024 | 512 | ❌ | 61.71 | 60.40 | 62.56 | 56.06 | 38.88 | 60.79 | 63.89 | 66.52 | 74.13 |
USER2-small |
34M | 384 | 8192 | ✅ | 58.32 | 56.68 | 59.76 | 57.06 | 33.56 | 54.02 | 58.26 | 61.87 | 72.25 |
USER2-base |
149M | 768 | 8192 | ✅ | 61.12 | 59.59 | 61.67 | 59.22 | 36.61 | 56.39 | 62.06 | 66.90 | 74.28 |
MultiLongDocRetrieval (MLDR) 俄语子集任务
模型 | 大小 | nDCG@10 ↑ |
---|---|---|
USER-bge-m3 |
359M | 58.53 |
KaLM-v1.5 |
494M | 53.75 |
jina-embeddings-v3 |
572M | 49.67 |
E5-mistral-7b |
7.11B | 52.40 |
USER2-small |
34M | 51.69 |
USER2-base |
149M | 54.17 |
Matryoshka 评估
为了评估 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-small")
query_embeddings = model.encode(["Когда был спущен на воду первый миноносец «Спокойный»?"], prompt_name="search_query")
document_embeddings = model.encode(["Спокойный (эсминец)\nЗачислен в списки ВМФ СССР 19 августа 1952 года."], prompt_name="search_document")
similarities = model.similarity(query_embeddings, document_embeddings)
若要截断嵌入维度,只需在模型初始化时传递新的值:
model = SentenceTransformer("deepvk/USER2-small", truncate_dim=128)
该模型在 [32, 64, 128, 256, 384]
维度上进行训练,因此建议使用这些值以获得最佳性能。
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: Спокойный (эсминец)\nЗачислен в списки ВМФ СССР 19 августа 1952 года."]
tokenizer = AutoTokenizer.from_pretrained("deepvk/USER2-small")
model = AutoModel.from_pretrained("deepvk/USER2-small")
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 = mean_pooling(queries_outputs, encoded_queries["attention_mask"])
query_embeddings = query_embeddings[:, :truncate_dim]
query_embeddings = F.normalize(query_embeddings, p=2, dim=1)
🔧 技术细节
训练过程
该模型是基于 RuModernBERT-small
的小型版本,拥有 3400 万个参数。它经过三个阶段的微调:RetroMAE、弱监督微调(Weakly Supervised Fine-Tuning)和监督微调(Supervised Fine-Tuning)。
遵循 bge-m3 训练策略,我们将 RetroMAE 作为面向检索的连续预训练步骤。利用 RuModernBERT
训练最后阶段的数据,RetroMAE 提高了检索质量,特别是对于长上下文输入。
为了遵循构建最先进编码器的最佳实践,我们依赖于大规模的弱相关文本对训练。然而,与英语或中文不同,俄语的此类数据集并未公开。为了克服这一问题,我们采用了两种互补策略:
- 跨语言迁移:我们同时在英语和俄语数据上进行训练,利用英语资源 (
nomic-unsupervised
) 以及我们内部的英俄平行语料库。 - 无监督对挖掘:从
deepvk/cultura_ru_edu
语料库中,我们使用简单的启发式方法提取了 5000 万对文本,即选择不重叠且不是彼此子字符串的文本块。
这种方法显示出了有希望的结果,使我们能够使用最少的目标语言对训练出高性能的模型,特别是与其他语言的管道相比。
以下表格显示了使用的数据集以及每个数据集的上采样次数。
数据集 | 大小 | 上采样次数 |
---|---|---|
nomic-en | 235M | 1 |
nomic-ru | 39M | 3 |
内部英俄平行语料库 | 250M | 1 |
cultura-sampled | 50M | 1 |
总计 | 652M |
在第三阶段,我们切换到更干净、特定任务的数据集。在某些情况下,使用交叉编码器进行了额外的过滤。对于所有检索数据集,我们挖掘了难负样本。
数据集 | 示例数量 | 备注 |
---|---|---|
Nomic-en-supervised | 1.7 M | 未修改 |
AllNLI | 200 K | 将 SNLI/MNLI/ANLI 翻译成俄语 |
fishkinet-posts | 93 K | 标题 - 内容对 |
gazeta | 55 K | 标题 - 文本对 |
habr_qna | 100 K | 标题 - 描述对 |
lenta | 100 K | 标题 - 新闻对 |
miracl_ru | 10 K | 每个锚点一个正样本 |
mldr_ru | 1.8 K | 未修改 |
mr-tydi_ru | 5.3 K | 未修改 |
mmarco_ru | 500 K | 未修改 |
ru-HNP | 100 K | 每个锚点一个正样本 + 一个负样本 |
ru‑queries | 199 K | 内部(按照 arXiv:2401.00368 生成) |
ru‑WaNLI | 35 K | 蕴含关系 -> 正样本,矛盾关系 -> 负样本 |
sampled_wiki | 1 M | 从维基百科中采样的文本块 |
summ_dialog_news | 37 K | 摘要 - 信息对 |
wikiomnia_qna | 100 K | 问答对(T5 生成) |
yandex_q | 83 K | 问题 + 描述 - 答案对 |
总计 | 4.3 M |
消融实验
除了最终模型,我们还发布了所有中间训练步骤。retromae 和 weakly_sft 模型可在本仓库的指定版本中找到。我们希望这些额外的模型对您的实验有用。
以下是所有训练阶段在 MTEB-rus
子集上的比较。
📄 许可证
本项目采用 apache-2.0
许可证。
📖 引用
@misc{deepvk2025user,
title={USER2},
author={Malashenko, Boris and Spirin, Egor and Sokolov Andrey},
url={https://huggingface.co/deepvk/USER2-small},
publisher={Hugging Face},
year={2025},
}







