模型简介
模型特点
模型能力
使用案例
🚀 USER2-base
USER2 是新一代的俄语通用句子编码器,专为句子表示而设计,支持长达 8192 个标记的长上下文。
该模型基于 RuModernBERT
编码器构建,并针对检索和语义任务进行了微调。此外,它们还支持 Matryoshka 表示学习 (MRL) 技术,该技术能够在表示质量损失最小的情况下减小嵌入大小。
这是一个具有 1.49 亿参数的基础模型。
属性 | 详情 |
---|---|
模型类型 | 基于 RuModernBERT 编码器构建的俄语通用句子编码器 |
训练数据 | 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 等 |
🚀 快速开始
本模型适用于俄语句子表示,支持长上下文,可用于检索和语义任务。以下是使用示例和相关性能指标,帮助你快速了解和使用该模型。
✨ 主要特性
- 长上下文支持:支持长达 8192 个标记的长上下文。
- 微调优化:基于
RuModernBERT
编码器构建,并针对检索和语义任务进行了微调。 - MRL 技术支持:支持 Matryoshka 表示学习 (MRL) 技术,可减小嵌入大小并保持表示质量。
📦 安装指南
文档未提及安装步骤,因此跳过此章节。
💻 使用示例
基础用法
from sentence_transformers import SentenceTransformer
model = SentenceTransformer("deepvk/USER2-base")
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-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: Спокойный (эсминец)\nЗачислен в списки ВМФ СССР 19 августа 1952 года."]
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 = mean_pooling(queries_outputs, encoded_queries["attention_mask"])
query_embeddings = query_embeddings[:, :truncate_dim]
query_embeddings = F.normalize(query_embeddings, p=2, dim=1)
📚 详细文档
模型性能
为了评估模型,我们在 MTEB-rus
基准测试中衡量质量。此外,为了衡量长上下文检索能力,我们运行了 MultiLongDocRetrieval (MLDR) 任务的俄语子集。
MTEB-rus 性能指标
模型 | 大小 | 隐藏维度 | 上下文长度 | MRL 支持 | 平均(任务) | 平均(任务类型) | 分类 | 聚类 | 多标签分类 | 成对分类 | 重排序 | 检索 | STS |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
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.6 亿 | 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 的模型。
Matryoshka 表示学习 (MRL)
为了评估 MRL 能力,我们同样使用 MTEB-rus
,对嵌入进行维度裁剪以匹配所选大小。
输入前缀
该模型的训练方式与 Nomic Embed 类似,需要在输入中添加特定任务的前缀。前缀的选择取决于具体任务。在选择前缀时,我们遵循以下一般准则:
- “classification: ” 是默认且最通用的前缀,通常在各种任务中表现良好。
- “clustering: ” 建议用于聚类应用,如将文本分组到聚类中、发现共享主题或去除语义重复项。
- “search_query: ” 和 “search_document: ” 用于检索和重排序任务。此外,在某些分类任务中,特别是对于较短的文本,“search_query” 的性能优于其他前缀。另一方面,“search_document” 对于长上下文句子相似性任务可能有益。
不过,我们鼓励用户尝试不同的前缀,因为某些领域可能会从特定的前缀中受益。
训练细节
这是一个具有 1.49 亿参数的基础版本,基于 RuModernBERT-base
。它在三个阶段进行了微调:RetroMAE、弱监督微调 (Weakly Supervised Fine-Tuning) 和监督微调 (Supervised Fine-Tuning)。
遵循 bge-m3 训练策略,我们将 RetroMAE 用作面向检索的连续预训练步骤。利用 RuModernBERT
训练最后阶段的数据,RetroMAE 提高了检索质量,特别是对于长上下文输入。
为了遵循构建最先进编码器的最佳实践,我们依赖于大规模的弱相关文本对训练。然而,与英语或中文不同,俄语没有公开可用的此类数据集。为了克服这一问题,我们采用了两种互补的策略:
- 跨语言迁移:我们同时在英语和俄语数据上进行训练,利用英语资源 (
nomic-unsupervised
) 以及我们内部的英俄平行语料库。 - 无监督对挖掘:从
deepvk/cultura_ru_edu
语料库中,我们使用简单的启发式方法提取了 5000 万对,即选择不重叠且不是彼此子字符串的文本块。
这种方法显示出了有希望的结果,使我们能够使用最少的目标语言对训练出高性能的模型,特别是与其他语言使用的管道相比。
以下表格显示了使用的数据集以及每个数据集的上采样次数。
数据集 | 大小 | 上采样次数 |
---|---|---|
nomic-en | 2.35 亿 | 1 |
nomic-ru | 3900 万 | 3 |
内部英俄平行语料库 | 2.5 亿 | 1 |
cultura-sampled | 5000 万 | 1 |
总计 | 6.52 亿 |
在第三阶段,我们切换到更干净、特定任务的数据集。在某些情况下,使用交叉编码器进行了额外的过滤。对于所有检索数据集,我们挖掘了难负样本。
数据集 | 示例数量 | 备注 |
---|---|---|
Nomic-en-supervised | 170 万 | 未修改 |
AllNLI | 20 万 | 将 SNLI/MNLI/ANLI 翻译成俄语 |
fishkinet-posts | 9.3 万 | 标题 - 内容对 |
gazeta | 5.5 万 | 标题 - 文本对 |
habr_qna | 10 万 | 标题 - 描述对 |
lenta | 10 万 | 标题 - 新闻对 |
miracl_ru | 1 万 | 每个锚点一个正样本 |
mldr_ru | 1800 | 未修改 |
mr-tydi_ru | 5300 | 未修改 |
mmarco_ru | 50 万 | 未修改 |
ru-HNP | 10 万 | 每个锚点一个正样本 + 一个负样本 |
ru‑queries | 19.9 万 | 内部生成(如 arXiv:2401.00368 所述) |
ru‑WaNLI | 3.5 万 | 蕴含 -> 正样本,矛盾 -> 负样本 |
sampled_wiki | 100 万 | 从维基百科采样的文本块 |
summ_dialog_news | 3.7 万 | 摘要 - 信息对 |
wikiomnia_qna | 10 万 | QA 对(T5 生成) |
yandex_q | 8.3 万 | Q + 描述 - 答案对 |
总计 | 430 万 |
消融实验
除了最终模型,我们还发布了所有中间训练步骤。retromae 和 weakly_sft 模型可在本仓库的指定版本中获取。我们希望这些额外的模型对你的实验有所帮助。
以下是所有训练阶段在 MTEB-rus
子集上的比较。
🔧 技术细节
该模型基于 RuModernBERT
编码器构建,通过三个阶段的微调(RetroMAE、弱监督微调、监督微调)来优化性能。在训练过程中,采用了跨语言迁移和无监督对挖掘等策略,以解决俄语特定数据集不足的问题。同时,在第三阶段使用了更干净、特定任务的数据集,并进行了额外的过滤和难负样本挖掘。
📄 许可证
本项目采用 Apache-2.0 许可证。
📚 引用
@misc{deepvk2025user,
title={USER2},
author={Malashenko, Boris and Spirin, Egor and Sokolov Andrey},
url={https://huggingface.co/deepvk/USER2-base},
publisher={Hugging Face}
year={2025},
}







