初始化项目,由ModelHub XC社区提供模型
Model: Vilyam888/Broken_Code_Generation.1.0 Source: Original Platform
This commit is contained in:
292
README.md
Normal file
292
README.md
Normal file
@@ -0,0 +1,292 @@
|
||||
---
|
||||
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.
|
||||
|
||||
Reference in New Issue
Block a user