File size: 12,329 Bytes
7eec37b
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9a86355
7eec37b
9a86355
7eec37b
9a86355
7eec37b
 
 
9a86355
7eec37b
9a86355
7eec37b
 
9a86355
7eec37b
9a86355
7eec37b
9a86355
7eec37b
9a86355
 
7eec37b
9a86355
7eec37b
9a86355
7eec37b
 
 
 
 
 
 
 
 
 
 
 
 
 
9a86355
7eec37b
9a86355
7eec37b
9a86355
 
 
 
 
7eec37b
9a86355
7eec37b
9a86355
7eec37b
 
 
 
9a86355
 
 
7eec37b
9a86355
 
 
 
 
 
 
 
 
 
 
 
 
7eec37b
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9a86355
 
 
 
 
 
15ff158
 
 
 
 
 
 
 
 
 
 
 
 
 
9a86355
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
7eec37b
 
9a86355
7eec37b
 
 
9a86355
 
 
 
 
 
 
 
 
 
 
7eec37b
 
 
 
 
9a86355
 
7eec37b
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9a86355
7eec37b
 
 
 
9a86355
7eec37b
 
 
 
 
9a86355
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
---

license: other
library_name: transformers
pipeline_tag: text-generation
base_model: Qwen/Qwen2.5-Coder-3B-Instruct
tags:
  - qwen
  - qwen2.5-coder
  - transformers
  - text-generation
  - code
  - fine-tuned
  - russian
---


# Broken_Code_Generation1.0

`Broken_Code_Generation1.0` - это модель для генерации задач по программированию в стиле ML bugfix.

Если совсем просто: ты задаешь **3 тега** и **сложность**, а модель возвращает **одну готовую задачу** в JSON-формате: с названием, контекстом, тестами, требованиями, ограничениями и сломанным кодом, который нужно исправить.

Модель основана на `Qwen/Qwen2.5-Coder-3B-Instruct`, была дообучена через `QLoRA`, а затем смержена в полноценную модель для инференса и публикации.

Built with Qwen.

## Что делает модель

Модель принимает:

- ровно 3 тега
- одну сложность: `easy`, `medium` или `hard`

И возвращает:

- один JSON-объект
- без Markdown
- без дополнительных пояснений
- в формате, похожем на обучающий датасет

## Что будет в ответе

На выходе ожидается JSON с такими полями:

- `id`
- `title`
- `difficulty`
- `topic_tags`
- `task_context`
- `tests`
- `expected_output`
- `input_example`
- `output_example`
- `requirements`
- `constraints`
- `broken_code`

## Где модель полезна

Эта модель подойдет, если тебе нужно:

- генерировать новые ML bugfix-задачи
- собирать учебные примеры для студентов
- делать синтетические данные для обучения и тестирования
- быстро получать задачи в одном и том же структурированном формате
- использовать ее вместе с анализом кода

## Основное подключение

Подключение через `transformers` напрямую:

```python

import json

from transformers import AutoModelForCausalLM, AutoTokenizer

import torch



model_path = "Vilyam888/Broken_Code_Generation.1.0"



tokenizer = AutoTokenizer.from_pretrained(model_path, trust_remote_code=True)

if tokenizer.pad_token is None:

    tokenizer.pad_token = tokenizer.eos_token

tokenizer.padding_side = "left"



model = AutoModelForCausalLM.from_pretrained(

    model_path,

    torch_dtype=torch.bfloat16 if torch.cuda.is_available() and torch.cuda.is_bf16_supported() else (

        torch.float16 if torch.cuda.is_available() else torch.float32

    ),

    device_map="auto",

    trust_remote_code=True,

)



SYSTEM_PROMPT = (

    "Ты генерируешь новую ML bugfix-задачу строго в формате объектов из датасета. "

    "Верни только один JSON-объект без Markdown и без пояснений. "

    "Порядок полей должен быть ровно таким: "

    "`title`, `difficulty`, `topic_tags`, `task_context`, `tests`, "

    "`expected_output`, `input_example`, `output_example`, `requirements`, "

    "`constraints`, `broken_code`. "

    "`tests`, `requirements` и `constraints` должны быть массивами строк. "

    "`broken_code` должен быть одной строкой с полным Python-кодом и символами `\\n`. "

    "Не добавляй лишние поля и не обрывай JSON."

)



topic_tags = {

    "TabularData": 0.4,

    "Statistics": 0.3,

    "DataPreprocessing": 0.3,

}



payload = {

    "difficulty": "medium",

    "topic_tags": topic_tags,

}



messages = [

    {"role": "system", "content": SYSTEM_PROMPT},

    {

        "role": "user",

        "content": (

            "Сгенерируй новую ML bugfix-задачу по параметрам.\n"

            "Формат должен совпадать со структурой датасета: "

            "все поля обязательны, `tests`/`requirements`/`constraints` - это списки строк, "

            "`broken_code` - полная строка кода с ошибками и комментариями `ВОТ ТУТ НУЖНО ИСПРАВИТЬ КОД`.\n"

            "Поля должны идти в порядке: "

            "title, difficulty, topic_tags, task_context, tests, expected_output, "

            "input_example, output_example, requirements, constraints, broken_code.\n"

            + json.dumps(payload, ensure_ascii=False, indent=2)

        ),

    },

]



prompt = tokenizer.apply_chat_template(

    messages,

    tokenize=False,

    add_generation_prompt=True,

)

inputs = tokenizer(prompt, return_tensors="pt").to(model.device)

prompt_length = inputs["input_ids"].shape[1]



with torch.no_grad():

    output = model.generate(

        **inputs,

        max_new_tokens=1200,

        temperature=0.7,

        top_p=0.95,

        do_sample=True,

        pad_token_id=tokenizer.pad_token_id,

        eos_token_id=tokenizer.eos_token_id,

    )



completion_tokens = output[0][prompt_length:]

completion = tokenizer.decode(completion_tokens, skip_special_tokens=True).strip()

print(completion)

```

После этого модели нужно передать:

- 3 тега
- сложность `easy`, `medium` или `hard`
- промпт с просьбой вернуть один JSON-объект

Для этой модели это важно: она обучена не на обычный разговорный чат, а на генерацию задач.

Поэтому хороший запрос для нее выглядит так:

- "Сгенерируй ML bugfix-задачу по таким тегам и такой сложности"

А вот запросы вроде:

- `Who are you?`
- `Hello`
- `Tell me a joke`

для этой модели не являются целевым сценарием и обычно не дают полезного результата.

Если нужен более простой запуск именно внутри этого проекта, ниже есть второй вариант через готовый скрипт.

Если говорить совсем коротко: для обычного подключения другим людям достаточно `transformers`, `torch` и имени репозитория:

- `Vilyam888/Broken_Code_Generation.1.0`

## Основной инференс в проекте

Самый простой и понятный способ запуска в этом проекте:

```powershell

.\.venv\Scripts\python.exe .\HF_Release\infer_merged_model.py --tag1 TabularData --tag2 Statistics --tag3 DataPreprocessing --difficulty medium

```

Что произойдет после запуска:

- загрузится смерженная модель
- в модель передадутся 3 тега и сложность
- модель сгенерирует задачу
- готовый JSON сохранится в `HF_Release/inference_output/generated_task.json`
- сырой текст ответа сохранится в `HF_Release/inference_output/raw_output.txt`

Еще один пример:

```powershell

.\.venv\Scripts\python.exe .\HF_Release\infer_merged_model.py --tag1 Classification --tag2 Evaluation --tag3 Metrics --difficulty hard

```

## Что можно менять

В основной команде ты обычно меняешь только это:

- `--tag1`, `--tag2`, `--tag3` - любые 3 нужных тега
- `--difficulty` - `easy`, `medium` или `hard`

Например, если хочешь другую генерацию, просто подставляешь другие значения в ту же команду.

## Как это работает

Внутри все довольно просто:

1. из трех тегов собирается `topic_tags`
2. в промпт подставляются теги и сложность
3. модель генерирует текст
4. из текста извлекается JSON
5. JSON сохраняется в итоговый файл

То есть в обычной работе тебе не нужно менять код модели. Достаточно менять входные теги и сложность.

## Совместимость с Code Analyze

Эта модель хорошо работает в связке с [`Vilyam888/Code_analyze.1.0`](https://huggingface.co/Vilyam888/Code_analyze.1.0).

Удобный сценарий такой:

1. `Code_analyze.1.0` анализирует код и определяет тип ошибки
2. по этому анализу выбираются подходящие теги
3. `Broken_Code_Generation1.0` генерирует новую bugfix-задачу в нужном формате

Это удобно для:

- учебных пайплайнов
- генерации новых примеров
- полуавтоматической подготовки задач
- систем, где сначала анализируется решение, а потом создается похожая задача на закрепление

## Как лучше формулировать запрос

Модель обычно отвечает лучше, если:

- давать ровно 3 тега
- явно указывать сложность
- просить вернуть ровно один JSON-объект
- отдельно писать, что не нужно добавлять Markdown и пояснения

## Ограничения

Важно помнить:

- модель все еще может иногда выдавать неполный JSON
- качество зависит от промпта и параметров генерации
- иногда ответы могут быть стилистически похожими друг на друга
- генерации лучше просматривать вручную перед использованием в важном датасете или продукте

## Кратко об обучении

- Базовая модель: `Qwen/Qwen2.5-Coder-3B-Instruct`
- Метод дообучения: `QLoRA`
- Итоговая версия: merged-модель после вливания LoRA-адаптера в базовую
- Целевая задача: генерация структурированных ML bugfix-задач

## Что лежит в репозитории

Главные файлы:

- шарды модели: `model-00001-of-00004.safetensors` ... `model-00004-of-00004.safetensors`
- файлы токенизатора
- `chat_template.jinja`
- `config.json`
- `generation_config.json`

## Лицензия

Этот репозиторий является производной работой от `Qwen/Qwen2.5-Coder-3B-Instruct`.

Базовая модель распространяется по лицензии `Qwen RESEARCH LICENSE AGREEMENT`. На Hugging Face для этой модели используется `license: other`.

Важно:

- лицензия Qwen ориентирована на research / non-commercial использование
- для коммерческого использования нужно отдельно проверить условия исходной лицензии
- при распространении нужно сохранять `LICENSE` и `NOTICE`

## Атрибуция

Improved using Qwen.