Vilyam888's picture
Upload folder using huggingface_hub
15ff158 verified
---
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.