PruhaNLP/USER2-1C-code
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.
Прирост относительно базовой deepvk/USER2-base — +0.106 avg nDCG@10 (0.493 → 0.599).
Детально по сплитам
Matryoshka (MRL): обрезаемые эмбеддинги
Модель обучена с MatryoshkaLoss, поэтому эмбеддинг можно усекать до меньшей размерности (взять первые d компонент и перенормировать) почти без потери качества. Это позволяет экономить память индекса и ускорять поиск.
До 256d качество практически не падает — можно смело уменьшать индекс втрое.
Использование
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 укажите целевую размерность:
model = SentenceTransformer("PruhaNLP/USER2-1C-code", truncate_dim=256)Кастомный токенайзер для приватности
При подготовке данных персональные данные в коде/текстах не вырезаются грубо, а заменяются на отдельные служебные токены, которые модель видит как единый элемент (а не как ломаную последовательность сабтокенов):
Свободные слоты словаря ([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
Цитирование
@misc{user2_1c_code,
title = {USER2-1C-code: эмбеддинг-модель для поиска по коду 1С},
author = {PruhaNLP},
year = {2026},
url = {https://huggingface.co/PruhaNLP/USER2-1C-code}
}