Model reference · open weights

USER2

Available as managed deployment Embeddings deepvk Embeddings 1 variants 12k dl/mo

USER2 is an open-weight embedding model from deepvk. AxForge deploys and operates it for you on dedicated EU-owned hardware — with the licence handled where one is required.

Available as managed deployment — configured and operated for you on dedicated EU hardware, quoted per deployment.

What it is

Released bydeepvk
TypeEmbedding models
TaskEmbeddings
Parameters (lead)149M
Context8k tokens
Runs withsentence-transformers
Based ondeepvk/RuModernBERT-base
Released2025-02-25
Popularity12k downloads / month
LicenceOpen weights

About

What USER2 is

USER2 is a new generation of the Universal Sentence Encoder for Russian, designed for sentence representation with long-context support of up to 8,192 tokens.

The models are built on top of the RuModernBERT encoders and are fine-tuned for retrieval and semantic tasks. They also support Matryoshka Representation Learning (MRL) — a technique that enables reducing embedding size with minimal loss in representation quality.

This is a base model with 149 million parameters.

ModelSizeContext LengthHidden DimMRL Dims
deepvk/USER2-small34M8192384[32, 64, 128, 256, 384]
deepvk/USER2-base149M8192768[32, 64, 128, 256, 384, 512, 768]
Read the full model card

Performance

To evaluate the model, we measure quality on the MTEB-rus benchmark. Additionally, to measure long-context retrieval, we run Russian subset of MultiLongDocRetrieval (MLDR) task.

MTEB-rus

ModelSizeHidden DimContext LengthMRL supportMean(task)Mean(taskType)ClassificationClusteringMultiLabelClassificationPairClassificationRerankingRetrievalSTS
USER-base124M76851258.1156.6759.8953.2637.7259.7655.5856.1474.35
USER-bge-m3359M1024819262.8062.2861.9253.6636.1865.0768.7273.6376.76
multilingual-e5-base278M76851258.3457.2458.2550.2733.6554.9866.2467.1470.16
multilingual-e5-large-instruct560M102451265.0063.3666.2863.1341.1563.8964.3568.2376.48
jina-embeddings-v3572M1024819263.4560.9365.2460.9039.2459.2253.8671.9976.04
ru-en-RoSBERTa404M102451261.7160.4062.5656.0638.8860.7963.8966.5274.13
USER2-small34M384819258.3256.6859.7657.0633.5654.0258.2661.8772.25
USER2-base149M768819261.1259.5961.6759.2236.6156.3962.0666.9074.28

MLDR-rus

ModelSizenDCG@10 ↑
USER-bge-m3359M58.53
KaLM-v1.5494M53.75
jina-embeddings-v3572M49.67
E5-mistral-7b7.11B52.40
USER2-small34M51.69
USER2-base149M54.17

We compare only model with context length of 8192.

Matryoshka

To evaluate MRL capabilities, we also use MTEB-rus, applying dimensionality cropping to the embeddings to match the selected size.

Usage

Prefixes

This model is trained similarly to Nomic Embed and expects task-specific prefixes to be added to the input. The choice of prefix depends on the specific task. We follow a few general guidelines when selecting a prefix:

  • "classification: " is the default and most universal prefix, often performing well across a variety of tasks.
  • "clustering: " is recommended for clustering applications: group texts into clusters, discover shared topics, or remove semantic duplicates.
  • "search_query: " and "search_document: " are intended for retrieval and reranking tasks. Also, in some classification tasks, especially with shorter texts, "search_query" shows superior performance to other prefixes. On the other hand, "search_document" can be beneficial for long-context sentence similarity tasks.

However, we encourage users to experiment with different prefixes, as certain domains may benefit from specific ones.

Sentence Transformers

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)

To truncate the embedding dimension, simply pass the new value to the model initialization:

model = SentenceTransformer("deepvk/USER2-base", truncate_dim=128)

This model was trained with dimensions [32, 64, 128, 256, 384, 512, 768], so it’s recommended to use one of these for best performance.

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: Когда был спущен на воду первый миноносец «Спокойный»?"]
document

From the published model card. Full card on the HuggingFace links in the sidebar.

Using it via the API

Call it like any OpenAI endpoint

Once AxForge deploys user2 for you, it answers on the OpenAI-compatible API — the same base URL and keys as every other model. (user2 below is illustrative; you get the exact model name on deployment.)

$ curl -sS https://api.axforge.ai/v1/embeddings \
  -H "Authorization: Bearer $AXFORGE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"model":"user2","input":"text to embed"}'

Create an account — your API key is available in the console. 3M free tokens every 30 days with every new account.

© 2026 AxForge · EU-hosted AI infrastructure Pricing Docs Trust Privacy Terms