模型概述
模型特點
模型能力
使用案例
🚀 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},
}







