293 lines
12 KiB
Markdown
293 lines
12 KiB
Markdown
|
|
---
|
|||
|
|
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.
|
|||
|
|
|