CoolFace
Modelpublic

PruhaNLP/USER2-1C-code

sourceHugging Faceapache-2.0updated 4mo agoView on Hugging Face
8likes650downloads
Model Card

USER2-1C-code

Первая открытая эмбеддинг-модель, заточенная под код и язык 1С (1С:Предприятие / BSL).

USER2-1C-code — это би-энкодер для семантического поиска по коду 1С: на вход подаётся вопрос на естественном языке, на выходе — релевантные фрагменты кода/решений. Модель — fine-tune `deepvk/USER2-base` (ModernBERT, контекст до 8192 токенов) на парах «вопрос → код 1С».

  • —Тип: bi-encoder (sentence-transformers), mean pooling, cosine similarity
  • —База: deepvk/USER2-base (ModernBERT, 768d, до 8192 токенов)
  • —Языки: русский + код 1С (BSL)
  • —Matryoshka (MRL): полноценные эмбеддинги на 768 / 512 / 384 / 256 / 128 / 64 / 32
  • —Префиксы: search_query для запросов, search_document для кода

Результаты на 1C-Ebench

Бенчмарк `PruhaNLP/1C-Ebench`: retrieval по двум источникам — forum (живые вопросы с тематических площадок) и fastcode (готовые сниппеты/шаблоны). Метрика — nDCG@10.

[image]

Модельavg nDCG@10
USER2-1C-code (наша)0.599
google/embeddinggemma-300m0.540
deepvk/USER2-base0.493
deepvk/USER-bge-m30.491
ibm-granite/granite-embedding-311m-multilingual-r20.485
microsoft/harrier-oss-v1-270m0.480
intfloat/multilingual-e5-base0.429
ai-forever/sbertlargenlu_ru0.086

Прирост относительно базовой deepvk/USER2-base — +0.106 avg nDCG@10 (0.493 → 0.599).

Детально по сплитам

[image]

СплитnDCG@10Recall@10MRR@10
forum0.46170.60080.4178
fastcode0.73660.92080.6774

Matryoshka (MRL): обрезаемые эмбеддинги

Модель обучена с MatryoshkaLoss, поэтому эмбеддинг можно усекать до меньшей размерности (взять первые d компонент и перенормировать) почти без потери качества. Это позволяет экономить память индекса и ускорять поиск.

[image]

dimavg nDCG@10от полной 768d
7680.599100.0%
5120.600100.1%
3840.600100.2%
2560.59899.9%
1280.58497.5%
640.56093.5%
320.50383.9%

До 256d качество практически не падает — можно смело уменьшать индекс втрое.

Использование

python
from sentence_transformers import SentenceTransformer

model = SentenceTransformer("PruhaNLP/USER2-1C-code")

query = "Как программно провести документ в 1С?"
docs = [
    "Документы.РеализацияТоваровУслуг.СоздатьДокумент();",
    "Процедура ПровестиДокумент(Ссылка) Экспорт ... КонецПроцедуры",
]

q_emb = model.encode(query, prompt_name="search_query", normalize_embeddings=True)
d_emb = model.encode(docs, prompt_name="search_document", normalize_embeddings=True)

scores = model.similarity(q_emb, d_emb)
print(scores)

Для MRL укажите целевую размерность:

python
model = SentenceTransformer("PruhaNLP/USER2-1C-code", truncate_dim=256)

Кастомный токенайзер для приватности

При подготовке данных персональные данные в коде/текстах не вырезаются грубо, а заменяются на отдельные служебные токены, которые модель видит как единый элемент (а не как ломаную последовательность сабтокенов):

СущностьТокенТокенов после кодирования
Пути[PATH]1
Имена[PERSON]1
E-mail`\\\EMAIL_ADDRESS\\\`1
Телефон`\\\PHONE_NUMBER\\\`1
IP`\\\IP_ADDRESS\\\`1

Свободные слоты словаря ([unused0]/[unused1]) переиспользованы под [PATH]/[PERSON], а их эмбеддинги инициализированы средним по сабтокенам исходных строк. В результате анонимизация не ломает токенизацию и не плодит шум в последовательности — это аккуратно закрывает персональные данные и держит распределение входа стабильным.

Детали обучения

  • —База: deepvk/USER2-base (ModernBERT)
  • —Лосс: CachedMultipleNegativesRankingLoss (scale 20, hard-negatives) внутри MatryoshkaLoss по размерностям [768, 512, 384, 256, 128, 64, 32]
  • —Хард-негативы: майнинг по FAISS
  • —LR-расписание: трапеция (warmup → stable → cosine decay), peak LR 2e-5
  • —Контекст: до 8192 токенов, fp16
  • —Префиксы: search_query / search_document

Код валидации

Eval метод опубликован отдельно: `https://github.com/PruhaNLP/1C-RB`.

Правовая информация

«1С», «1С:Предприятие» и связанные обозначения — товарные знаки ООО «1С». Проект является независимым, не аффилирован с фирмой «1С» и не одобрен ею. Названия используются исключительно для указания предметной области (номинативное использование). Модель и датасеты предоставляются «как есть», без гарантий. Если вы правообладатель и считаете, что какой-либо материал нарушает ваши права — напишите на контакт ниже, и он будет удалён.

Контакт для связи

konstphx@gmail.com

Цитирование

bibtex
@misc{user2_1c_code,
  title  = {USER2-1C-code: эмбеддинг-модель для поиска по коду 1С},
  author = {PruhaNLP},
  year   = {2026},
  url    = {https://huggingface.co/PruhaNLP/USER2-1C-code}
}