Model reference · open weights

USER2-small

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

USER2-small 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)34M
Context8k tokens
Runs withsentence-transformers
Based ondeepvk/RuModernBERT-small
Released2025-02-19
Popularity7k downloads / month
LicenceOpen weights

About

What USER2-small 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 small model with 34 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-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)

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

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

This model was trained with dimensions [32, 64, 128, 256, 384], 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: Когда был спущен на воду первый миноносец «Спокойный»?"]
documents = ["search_documen

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-small for you, it answers on the OpenAI-compatible API — the same base URL and keys as every other model. (user2-small 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-small","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