PruhaNLP/USER2-1C-code
8650
1---2license: apache-2.03language:4- ru5library_name: sentence-transformers6pipeline_tag: sentence-similarity7base_model: deepvk/USER2-base8tags:9- sentence-transformers10- feature-extraction11- sentence-similarity12- code-retrieval13- 1c14- bsl15- matryoshka16- ru17model-index:18- name: USER2-1C-code19 results:20 - task:21 type: retrieval22 name: Code Retrieval23 dataset:24 type: PruhaNLP/1C-Ebench25 name: 1C-Ebench (forum)26 config: forum27 split: test28 metrics:29 - type: ndcg_at_1030 value: 0.461731 - type: recall_at_1032 value: 0.600833 - type: mrr_at_1034 value: 0.417835 - task:36 type: retrieval37 name: Code Retrieval38 dataset:39 type: PruhaNLP/1C-Ebench40 name: 1C-Ebench (fastcode)41 config: fastcode42 split: test43 metrics:44 - type: ndcg_at_1045 value: 0.736646 - type: recall_at_1047 value: 0.920848 - type: mrr_at_1049 value: 0.677450---51 52# USER2-1C-code53 54**Первая открытая эмбеддинг-модель, заточенная под код и язык 1С (1С:Предприятие / BSL).**55 56`USER2-1C-code` — это би-энкодер для семантического поиска по коду 1С: на вход подаётся вопрос на естественном языке, на выходе — релевантные фрагменты кода/решений. Модель — fine-tune [`deepvk/USER2-base`](https://huggingface.co/deepvk/USER2-base) (ModernBERT, контекст до 8192 токенов) на парах «вопрос → код 1С».57 58 59- **Тип:** bi-encoder (sentence-transformers), mean pooling, cosine similarity60- **База:** `deepvk/USER2-base` (ModernBERT, 768d, до 8192 токенов)61- **Языки:** русский + код 1С (BSL)62- **Matryoshka (MRL):** полноценные эмбеддинги на `768 / 512 / 384 / 256 / 128 / 64 / 32`63- **Префиксы:** `search_query` для запросов, `search_document` для кода64 65## Результаты на 1C-Ebench66 67Бенчмарк [`PruhaNLP/1C-Ebench`](https://huggingface.co/datasets/PruhaNLP/1C-Ebench): retrieval по двум источникам — `forum` (живые вопросы с тематических площадок) и `fastcode` (готовые сниппеты/шаблоны). Метрика — nDCG@10.68 6970 71| Модель | avg nDCG@10 |72|---|---|73| **USER2-1C-code (наша)** | **0.599** |74| google/embeddinggemma-300m | 0.540 |75| deepvk/USER2-base | 0.493 |76| deepvk/USER-bge-m3 | 0.491 |77| ibm-granite/granite-embedding-311m-multilingual-r2 | 0.485 |78| microsoft/harrier-oss-v1-270m | 0.480 |79| intfloat/multilingual-e5-base | 0.429 |80| ai-forever/sbert_large_nlu_ru | 0.086 |81 82Прирост относительно базовой `deepvk/USER2-base` — **+0.106 avg nDCG@10** (0.493 → 0.599).83 84### Детально по сплитам85 8687 88| Сплит | nDCG@10 | Recall@10 | MRR@10 |89|---|---|---|---|90| forum | 0.4617 | 0.6008 | 0.4178 |91| fastcode | 0.7366 | 0.9208 | 0.6774 |92 93## Matryoshka (MRL): обрезаемые эмбеддинги94 95Модель обучена с `MatryoshkaLoss`, поэтому эмбеддинг можно усекать до меньшей размерности (взять первые `d` компонент и перенормировать) почти без потери качества. Это позволяет экономить память индекса и ускорять поиск.96 9798 99| dim | avg nDCG@10 | от полной 768d |100|---|---|---|101| 768 | 0.599 | 100.0% |102| 512 | 0.600 | 100.1% |103| 384 | 0.600 | 100.2% |104| 256 | 0.598 | 99.9% |105| 128 | 0.584 | 97.5% |106| 64 | 0.560 | 93.5% |107| 32 | 0.503 | 83.9% |108 109До **256d качество практически не падает** — можно смело уменьшать индекс втрое.110 111## Использование112 113```python114from sentence_transformers import SentenceTransformer115 116model = SentenceTransformer("PruhaNLP/USER2-1C-code")117 118query = "Как программно провести документ в 1С?"119docs = [120 "Документы.РеализацияТоваровУслуг.СоздатьДокумент();",121 "Процедура ПровестиДокумент(Ссылка) Экспорт ... КонецПроцедуры",122]123 124q_emb = model.encode(query, prompt_name="search_query", normalize_embeddings=True)125d_emb = model.encode(docs, prompt_name="search_document", normalize_embeddings=True)126 127scores = model.similarity(q_emb, d_emb)128print(scores)129```130 131Для MRL укажите целевую размерность:132 133```python134model = SentenceTransformer("PruhaNLP/USER2-1C-code", truncate_dim=256)135```136 137## Кастомный токенайзер для приватности138 139При подготовке данных персональные данные в коде/текстах не вырезаются грубо, а заменяются на отдельные **служебные токены**, которые модель видит как единый элемент (а не как ломаную последовательность сабтокенов):140 141| Сущность | Токен | Токенов после кодирования |142|---|---|---|143| Пути | `[PATH]` | 1 |144| Имена | `[PERSON]` | 1 |145| E-mail | `\|\|\|EMAIL_ADDRESS\|\|\|` | 1 |146| Телефон | `\|\|\|PHONE_NUMBER\|\|\|` | 1 |147| IP | `\|\|\|IP_ADDRESS\|\|\|` | 1 |148 149Свободные слоты словаря (`[unused0]`/`[unused1]`) переиспользованы под `[PATH]`/`[PERSON]`, а их эмбеддинги инициализированы средним по сабтокенам исходных строк. В результате анонимизация не ломает токенизацию и не плодит шум в последовательности — это аккуратно закрывает персональные данные и держит распределение входа стабильным.150 151## Детали обучения152 153- **База:** `deepvk/USER2-base` (ModernBERT)154- **Лосс:** `CachedMultipleNegativesRankingLoss` (scale 20, hard-negatives) внутри `MatryoshkaLoss` по размерностям `[768, 512, 384, 256, 128, 64, 32]`155- **Хард-негативы:** майнинг по FAISS156- **LR-расписание:** трапеция (warmup → stable → cosine decay), peak LR 2e-5157- **Контекст:** до 8192 токенов, fp16158- **Префиксы:** `search_query` / `search_document`159 160## Код валидации161 162Eval метод опубликован отдельно:163[`https://github.com/PruhaNLP/1C-RB`](https://github.com/PruhaNLP/1C-RB).164 165## Правовая информация166 167«1С», «1С:Предприятие» и связанные обозначения — товарные знаки ООО «1С». Проект является независимым, **не аффилирован с фирмой «1С»** и не одобрен ею. Названия используются исключительно для указания предметной области (номинативное использование). Модель и датасеты предоставляются «как есть», без гарантий. Если вы правообладатель и считаете, что какой-либо материал нарушает ваши права — напишите на контакт ниже, и он будет удалён.168 169## Контакт для связи170 171`konstphx@gmail.com`172 173## Цитирование174 175```bibtex176@misc{user2_1c_code,177 title = {USER2-1C-code: эмбеддинг-модель для поиска по коду 1С},178 author = {PruhaNLP},179 year = {2026},180 url = {https://huggingface.co/PruhaNLP/USER2-1C-code}181}182```183 