--- 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.