# План практической части ВКР: «Утилита 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 первой недели.