| # План практической части ВКР: «Утилита Natural Language → SQL для бизнес-аналитики» |
|
|
| **Студент:** Danis, ПИ, 4 курс |
| **Срок:** 4 недели |
| **Дата:** 29 апреля 2026 |
|
|
| --- |
|
|
| ## 0. Контур решения |
|
|
| **Финальный продукт:** утилита, которая позволяет аналитику малого и среднего бизнеса задавать вопросы на русском языке и получать готовые данные из корпоративной базы данных — без знания SQL. |
|
|
| Система: вопрос на русском → бизнес-словарь компании → схема БД → SQL → выполнение → результат. |
|
|
| Подход: fine-tuning **Qwen2.5-Coder-3B-Instruct** методом QLoRA на датасете **PAUQ**, обёрнутый в **FastAPI** с дополнительными модулями подключения к произвольной БД, настраиваемым бизнес-словарём и веб-интерфейсом на Streamlit. |
|
|
| Для научного сравнения параллельно прогоняется **GigaChat API** (или OpenAI) и **ruT5-base** baseline. |
|
|
| Инфраструктура: |
| - Тренировка: **Kaggle Notebooks** (T4 16 GB бесплатно). |
| - Разработка кода и API: **десктоп** Ryzen 5 3600X + 16 GB RAM. |
| - Демо на защите: **ноутбук** Ryzen 5 5500U + 16 GB RAM, инференс на CPU. |
|
|
| Артефакты ВКР: |
| - Рабочая утилита с веб-интерфейсом (Streamlit) |
| - Модуль подключения к произвольной БД (SQLite / PostgreSQL / MySQL) |
| - Модуль бизнес-словаря (YAML-конфиг с определениями метрик компании) |
| - Сравнительная таблица метрик (EM, Execution Accuracy) |
| - Анализ ошибок на 30+ примерах |
|
|
| --- |
|
|
| ## 1. Технологический стек |
|
|
| ### 1.1 Среда разработки |
|
|
| | Компонент | Выбор | |
| |---|---| |
| | Язык | Python 3.10+ | |
| | Менеджер пакетов | uv (быстрый, современный) | |
| | Контроль версий | Git + GitHub | |
| | IDE | VS Code | |
|
|
| ### 1.2 ML и обучение |
|
|
| | Компонент | Выбор | Где используется | |
| |---|---|---| |
| | PyTorch 2.x | основа | Kaggle | |
| | transformers | модели и токенизация | Kaggle + десктоп | |
| | peft | LoRA/QLoRA | Kaggle | |
| | bitsandbytes | 4-bit квантизация | Kaggle (на CPU не нужен) | |
| | trl | SFTTrainer | Kaggle | |
| | datasets | работа с PAUQ | Kaggle + десктоп | |
| | W&B | логирование экспериментов | Kaggle | |
|
|
| ### 1.3 Инференс на десктопе и ноутбуке |
|
|
| Для локального инференса без GPU есть два пути: |
|
|
| | Путь | Скорость | Сложность | Применение | |
| |---|---|---|---| |
| | transformers на CPU (int8) | 15–30 с/запрос | проще | разработка, отладка | |
| | llama.cpp (gguf int4) | 5–15 с/запрос | сложнее | финальное демо | |
|
|
| **Рекомендация:** для разработки — transformers, для защиты — llama.cpp. |
|
|
| ### 1.4 API и SQL |
|
|
| | Компонент | Выбор | |
| |---|---| |
| | FastAPI + Uvicorn | REST API | |
| | Pydantic v2 | валидация | |
| | sqlite3 (stdlib) | работа с БД из PAUQ | |
| | sqlglot | парсинг и валидация SQL | |
| | pytest | тесты | |
|
|
| --- |
|
|
| ## 2. Архитектура |
|
|
| ``` |
| ┌──────────────────────────────────────────────────────────────┐ |
| │ Streamlit Web Interface │ |
| │ Поле вопроса | Выбор БД | Редактор бизнес-словаря │ |
| │ Таблица результатов | История запросов │ |
| └──────────────────────────┬───────────────────────────────────┘ |
| │ HTTP |
| ┌──────────────────────────▼───────────────────────────────────┐ |
| │ FastAPI REST API │ |
| │ POST /query {question_ru, db_id} → {sql, result, ...} │ |
| └──────┬──────────────┬───────────────┬────────────────────────┘ |
| │ │ │ |
| ▼ ▼ ▼ |
| ┌────────────┐ ┌────────────┐ ┌─────────────────┐ |
| │ DbConnector│ │ Business │ │ SchemaRetriever │ |
| │ SQLite / │ │ Vocabulary │ │ (DDL из БД) │ |
| │ Postgres / │ │ (YAML- │ └────────┬────────┘ |
| │ MySQL │ │ конфиг) │ │ |
| └─────┬──────┘ └─────┬──────┘ │ |
| │ │ │ |
| │ ┌────▼─────────────────▼──┐ |
| │ │ PromptBuilder │ |
| │ │ вопрос + схема + │ |
| │ │ определения метрик │ |
| │ └────────────┬────────────┘ |
| │ ▼ |
| │ ┌────────────────────────┐ |
| │ │ InferenceEngine │ |
| │ │ Qwen2.5-Coder-3B │ |
| │ │ + LoRA adapter │ |
| │ └────────────┬───────────┘ |
| │ ▼ |
| │ ┌────────────────────────┐ |
| │ │ SqlPostProcessor │ |
| │ │ (sqlglot validation) │ |
| │ └────────────┬───────────┘ |
| │ │ |
| └──────────────────────┘ |
| │ выполнить SQL |
| ▼ |
| ┌─────────────────┐ |
| │ SqlExecutor │ |
| │ результат → │ |
| │ аналитику │ |
| └─────────────────┘ |
| ``` |
|
|
| Структура проекта (см. файлы в репозитории): |
| ``` |
| ru2sql/ |
| ├── README.md |
| ├── pyproject.toml |
| ├── .gitignore |
| ├── notebooks/ |
| │ └── kaggle_train_qwen_qlora.ipynb |
| ├── src/ |
| │ ├── config.py |
| │ ├── data/ — loader, schema, prompt |
| │ ├── models/ — inference, postprocess |
| │ ├── evaluation/ — metrics, evaluate |
| │ └── api/ — main, schemas, dependencies |
| ├── tests/ |
| └── scripts/ |
| ``` |
|
|
| --- |
|
|
| ## 3. Помесячный план |
|
|
| ### Неделя 1. Окружение, данные, baseline |
|
|
| **Цель:** работающий pipeline от вопроса до SQL на маленькой модели. |
|
|
| | День | Задача | |
| |---|---| |
| | 1 | Установка Python 3.10+, uv, Git. Клонирование репозитория. `uv sync`. Проверка что FastAPI стартует. | |
| | 2 | Регистрация на Kaggle, HuggingFace, W&B. Скачивание PAUQ (https://github.com/ai-forever/pauq). | |
| | 3 | Анализ датасета в notebook: распределения, сложности, примеры. Реализация `SchemaRetriever`. | |
| | 4 | Реализация `PromptBuilder`. Тесты: `pytest tests/test_prompt.py`. | |
| | 5–6 | Kaggle-notebook: обучение **ruT5-base** на 2 эпохи. Сохранение чекпойнта. | |
| | 7 | Реализация `metrics.py` (EM + Execution Accuracy). Прогон ruT5 на dev. Запись в W&B. | |
|
|
| Контрольная точка недели: ruT5-base даёт 25–35% EM на PAUQ dev. |
|
|
| ### Неделя 2. Главная модель (Qwen2.5-Coder-3B + QLoRA) |
|
|
| **Цель:** обученный LoRA-адаптер для Qwen с метриками выше baseline. |
|
|
| | День | Задача | |
| |---|---| |
| | 1 | Kaggle-notebook: загрузка Qwen2.5-Coder-3B в 4-bit, тестовый inference. | |
| | 2 | Подготовка PAUQ в chat-формате под модель. | |
| | 3–4 | SFTTrainer + LoRA (r=16, alpha=32). Прогон 2–3 эпохи (~4–6 часов суммарно). | |
| | 5 | Сохранение LoRA-адаптера на HuggingFace Hub (приватный репозиторий). | |
| | 6 | Скачивание адаптера на десктоп. Локальный инференс на CPU через transformers. | |
| | 7 | Прогон на dev split, метрики, error analysis на 30 примерах. | |
|
|
| Контрольная точка недели: Qwen+LoRA даёт 50–60% EM на PAUQ dev и работает на десктопе. |
|
|
| ### Неделя 3. Бизнес-утилита: коннектор + словарь + исполнение SQL |
|
|
| **Цель:** превратить API в полноценную бизнес-утилиту — подключение к реальной БД, настройка под компанию, возврат данных. |
|
|
| | День | Задача | |
| |---|---| |
| | 1 | FastAPI: `/generate-sql`, `/query`, `/databases`, `/health`. Lifespan для загрузки модели. | |
| | 2 | Модуль `DbConnector` — подключение к SQLite/PostgreSQL/MySQL по строке подключения. Автоматическое чтение схемы (`INFORMATION_SCHEMA`). | |
| | 3 | Модуль `BusinessVocabulary` — загрузка YAML-конфига с определениями метрик. Подстановка определений в промпт перед генерацией SQL. Пример конфига: `выручка: "SUM(orders.amount) WHERE status='paid'"`. | |
| | 4 | Эндпоинт `/query` — принимает вопрос, генерирует SQL, выполняет на подключённой БД, возвращает результат в JSON (таблица строк). | |
| | 5 | Получение API-ключа GigaChat (или YandexGPT), скрипт прогона на тех же примерах. Сравнительная таблица: ruT5 vs Qwen+LoRA vs GigaChat по EM и EX. | |
| | 6 | `SqlPostProcessor` через sqlglot. Тесты pytest на все новые модули. | |
| | 7 | Создание демо-базы данных (SQLite) с реалистичными бизнес-данными: продажи, клиенты, товары. Написание бизнес-словаря под эту базу. | |
|
|
| Контрольная точка недели: аналитик вводит "Какая выручка за январь?" → утилита возвращает число из реальной БД. |
|
|
| ### Неделя 4. Streamlit-интерфейс, демо, материалы для ВКР |
|
|
| **Цель:** красивый рабочий продукт для защиты + готовые материалы для текста ВКР. |
|
|
| | День | Задача | |
| |---|---| |
| | 1 | Streamlit-интерфейс: поле ввода вопроса, выбор БД, отображение сгенерированного SQL и таблицы результатов. | |
| | 2 | В интерфейсе: вкладка настройки бизнес-словаря (редактирование YAML прямо в браузере). История запросов. | |
| | 3 | Error analysis: разбор 30 ошибок Qwen+LoRA, классификация по категориям (неверный JOIN, неверное условие WHERE и т.д.). | |
| | 4 | Конвертация LoRA + базовой модели в gguf через llama.cpp для быстрого инференса на CPU. | |
| | 5 | Диаграммы архитектуры (draw.io), скриншоты интерфейса, графики метрик (matplotlib). | |
| | 6 | Глава «Реализация» и глава «Практическое применение» в тексте ВКР. | |
| | 7 | Прогон полного сценария на ноутбуке с демо-базой. Резервная копия чекпойнта на HuggingFace. | |
|
|
| --- |
|
|
| ## 4. Метрики качества |
|
|
| Стандарт для Text-to-SQL: |
|
|
| - **Exact Match (EM)** — нормализуем оба SQL и сравниваем посимвольно. |
| - **Execution Accuracy (EX)** — выполняем оба SQL на реальной SQLite, сравниваем результаты как множества кортежей. |
|
|
| EX важнее EM, потому что разные SQL могут дать одинаковый результат. |
|
|
| Целевые числа на PAUQ dev (ориентировочно): |
| - ruT5-base: 25–35% EM, 30–40% EX. |
| - Qwen2.5-Coder-3B + LoRA: 50–60% EM, 55–70% EX. |
| - GigaChat / GPT-4 (zero-shot, через API): 55–70% EM, 65–80% EX. |
|
|
| Ваш Qwen после QLoRA должен быть близок к API-моделям. Это и будет защищаемый результат. |
|
|
| --- |
|
|
| ## 5. Риски и план B |
|
|
| | Риск | План B | |
| |---|---| |
| | Kaggle квота закончилась | Переключиться на Google Colab Free или арендовать GPU на vast.ai (~$2 за обучение) | |
| | Qwen-3B плохо сходится | Понизить learning rate до 1e-4, увеличить эпохи до 5, проверить prompt format | |
| | llama.cpp не успеваю настроить к защите | Демо через transformers на CPU напрямую — медленнее, но работает | |
| | GigaChat недоступен | YandexGPT либо OpenAI через VPN — Pydantic-обёртка одна, провайдер меняется одной строчкой | |
| | Не хватает времени на error analysis | Минимум — 20 ошибок руками, простая классификация в Excel | |
|
|
| --- |
|
|
| ## 6. Что вынести в «направления дальнейшей работы» |
|
|
| Эти улучшения **не делаем** в рамках месяца, но упоминаем в ВКР: |
| - Few-shot retrieval (поиск похожих примеров через эмбеддинги). |
| - Schema linking (автоматический отбор таблиц). |
| - Self-correction (выполнение SQL, исправление по ошибке). |
| - Constrained decoding (ограничение токенов до валидной SQL-грамматики). |
| - Дообучение на синтетических данных от GPT-4. |
|
|
| --- |
|
|
| ## 7. Итоговый чек-лист на старте |
|
|
| - [ ] Установлены Python 3.10+, uv, Git, VS Code на десктопе |
| - [ ] Создан репозиторий ru2sql на GitHub |
| - [ ] Зарегистрированы аккаунты Kaggle, HuggingFace, W&B |
| - [ ] Получен ключ GigaChat (или OpenAI) |
| - [ ] Скачан PAUQ |
| - [ ] `uv sync` проходит без ошибок |
| - [ ] `uvicorn src.api.main:app --reload` стартует |
| - [ ] Прочитаны статьи: Spider (2018), QLoRA (2023), краткое описание Qwen2.5-Coder |
|
|
| После чек-листа можно стартовать День 3 первой недели. |
|
|