| --- |
| library_name: peft |
| base_model: Qwen/Qwen2.5-Coder-3B-Instruct |
| language: |
| - ru |
| tags: |
| - text-to-sql |
| - qlora |
| - russian |
| - sql-generation |
| license: apache-2.0 |
| datasets: |
| - ai-forever/PAUQ |
| --- |
| |
| # qwen-coder-pauq-lora |
|
|
| LoRA-адаптер для модели **Qwen2.5-Coder-3B-Instruct**, обученный методом |
| **QLoRA** на датасете **PAUQ** для задачи преобразования вопросов на |
| русском языке в SQL-запросы. Часть выпускной квалификационной работы |
| по направлению 09.03.04 «Программная инженерия», КНИТУ-КАИ. |
|
|
| ## Описание |
|
|
| Адаптер обучает модель отвечать на русскоязычный аналитический вопрос |
| синтаксически корректным SQL-запросом, учитывая схему конкретной базы |
| данных, переданную в системном сообщении вместе с примерами строк. |
|
|
| Базовая модель остаётся замороженной, обучаются только LoRA-матрицы |
| рангом 16, наложенные на все проекционные слои attention и MLP. Это |
| позволяет хранить и распространять адаптер размером несколько десятков |
| мегабайт, а не полные веса модели в несколько гигабайт. |
|
|
| ## Использование |
|
|
| ```python |
| from transformers import AutoModelForCausalLM, AutoTokenizer |
| from peft import PeftModel |
| |
| base = "Qwen/Qwen2.5-Coder-3B-Instruct" |
| adapter = "Tyycha/qwen-coder-pauq-lora" |
| |
| tokenizer = AutoTokenizer.from_pretrained(base) |
| model = AutoModelForCausalLM.from_pretrained(base, device_map="auto") |
| model = PeftModel.from_pretrained(model, adapter) |
| model.eval() |
| |
| messages = [ |
| {"role": "system", "content": "Ты — ассистент, который преобразует вопросы на русском языке в SQL..."}, |
| {"role": "user", "content": "### Schema:\nCREATE TABLE orders (id INT, amount REAL, status TEXT);\n\n### Question:\nКакая суммарная выручка по оплаченным заказам?\n\n### SQL:\n"}, |
| ] |
| prompt = tokenizer.apply_chat_template(messages, tokenize=False, add_generation_prompt=True) |
| inputs = tokenizer(prompt, return_tensors="pt").to(model.device) |
| output = model.generate(**inputs, max_new_tokens=256, do_sample=False) |
| print(tokenizer.decode(output[0][inputs["input_ids"].shape[1]:], skip_special_tokens=True)) |
| ``` |
|
|
| Полный pipeline (формирование промпта, постобработка, исполнение SQL) |
| реализован в проекте [Ru2SQL](https://github.com/Tyycha/Ru2SQL). |
|
|
| ## Данные |
|
|
| - **Датасет:** PAUQ (Bakshandaeva et al., 2022) — первый крупный русскоязычный |
| корпус для задачи Text-to-SQL, построенный на основе Spider. |
| - **Размер:** ~7 тыс. пар (вопрос, SQL) в train, 1076 в dev. |
| - **Структура примера:** диалог в формате chat-template из трёх сообщений |
| (`system` с инструкцией и опциональным бизнес-словарём, `user` со |
| схемой и вопросом, `assistant` с эталонным SQL). |
|
|
| ## Гиперпараметры обучения |
|
|
| | Параметр | Значение | |
| |---|---| |
| | Базовая модель | Qwen/Qwen2.5-Coder-3B-Instruct | |
| | Метод | QLoRA (NF4, double quantization, compute dtype = bfloat16) | |
| | LoRA rank `r` | 16 | |
| | LoRA alpha | 32 | |
| | LoRA dropout | 0.05 | |
| | Target modules | q_proj, k_proj, v_proj, o_proj, gate_proj, up_proj, down_proj | |
| | Эпохи | 2 | |
| | Размер батча | 1 (на устройство) | |
| | Накопление градиентов | 8 шагов (эффективный батч 8) | |
| | Скорость обучения | 2e-4 (cosine, warmup 3 %) | |
| | Max sequence length | 1024 | |
| | Точность | bfloat16 | |
| | Оборудование | NVIDIA Tesla T4 16 GB (Kaggle) | |
| |
| ## Метрики |
| |
| Оценка на валидационной выборке PAUQ (1076 примеров, 166 баз данных): |
| |
| | Метрика | Значение | |
| |---|---| |
| | Exact Match (EM) | 40.0 % (430 / 1076) | |
| | Execution Accuracy (EX) | 71.9 % (772 / 1074) | |
| |
| Для сравнения, опубликованные результаты на той же выборке: |
| |
| | Модель | EM | EX | |
| |---|---|---| |
| | RAT-SQL (PAUQ, mono) | 51 % | 49 % | |
| | BRIDGE (PAUQ, mono) | 52 % | 48 % | |
| | **Qwen2.5-Coder-3B + QLoRA (эта работа)** | **40 %** | **71.9 %** | |
| |
| Высокий разрыв между EM и EX отражает специфику задачи: модель |
| генерирует семантически корректные запросы, но синтаксически |
| отличающиеся от эталонных (другой порядок условий, альтернативные |
| JOIN-стратегии, иные псевдонимы). |
| |
| ## Ограничения |
| |
| - Модель обучена на схемах PAUQ/Spider. На существенно отличающихся |
| предметных областях качество может падать; для адаптации |
| предусмотрен механизм бизнес-словаря в основном проекте. |
| - Наиболее сложные классы запросов — вложенные SELECT, конструкции |
| INTERSECT/EXCEPT/UNION, HAVING с несколькими условиями — остаются |
| слабым местом. |
| - При работе на CPU без GPU инференс занимает 15–30 секунд на запрос. |
| - Адаптер ориентирован на SQLite. Для PostgreSQL/MySQL рекомендуется |
| явно указать диалект в промпте. |
| |
| ## Лицензия |
| |
| Apache 2.0. Базовая модель Qwen2.5-Coder также распространяется под |
| лицензией Apache 2.0; датасет PAUQ — Apache 2.0. |
| |
| ## Цитирование |
| |
| ```bibtex |
| @misc{ru2sql-qlora-2026, |
| title = {Ru2SQL: Russian Text-to-SQL via QLoRA on Qwen2.5-Coder}, |
| author = {Siryazeev, Danis}, |
| year = {2026}, |
| note = {Bachelor's thesis, Kazan National Research Technical University}, |
| } |
| ``` |
| |