Система генерации SQL-запросов по естественному языку с использованием дообученной модели LoRA и LLM для оптимизации.
Проект представляет собой микросервисную архитектуру для генерации SQL-запросов из текстовых описаний на русском/английском языках. Система обучена на датасете Spider и использует:
- LoRA Fine-tuned модель - Qwen2.5-Coder-3B-Instruct, дообученная для генерации SQL
- OpenRouter LLM - Claude/DeepSeek для анализа, оптимизации и чата
- Spider Dataset - более 200 SQLite баз данных для тестирования
┌─────────────────────────────────────────────────────────────────────┐
│ Streamlit UI (:8501) │
│ Веб-интерфейс пользователя │
└─────────────────┬───────────────┬────────────────┬─────────────────┘
│ │ │
▼ ▼ ▼
┌─────────────────────┐ ┌─────────────────┐ ┌─────────────────────┐
│ Model API (:8001) │ │ Spider API │ │ LLM API (:8002) │
│ LoRA Inference │ │ (:8000) │ │ OpenRouter │
│ │ │ Database Ops │ │ │
│ • Генерация SQL │ │ • Выполнение │ │ • Text-to-SQL │
│ • Qwen2.5-Coder-3B │ │ запросов │ │ • Оптимизация SQL │
│ │ │ • EXPLAIN │ │ • Чат │
│ │ │ • Evaluate │ │ • DeepSeek/Claude │
└─────────────────────┘ └─────────────────┘ └─────────────────────┘
│ │
▼ ▼
┌─────────────────────┐ ┌─────────────────────┐
│ LoRA Adapter │ │ Spider Data │
│ ./lora_adapter/ │ │ ./spider_data/ │
│ Qwen2.5-Coder-3B │ │ 200+ databases │
└─────────────────────┘ └─────────────────────┘
project/
├── api/
│ ├── model_api/ # API для LoRA модели
│ │ ├── api_model.py # FastAPI сервер
│ │ ├── inference.py # Инференс модели
│ │ └── Dockerfile
│ ├── spider_api/ # API для работы с БД Spider
│ │ ├── main.py # FastAPI сервер
│ │ ├── evaluator.py # Оценка качества SQL
│ │ └── Dockerfile
│ ├── llm_api/ # API для OpenRouter LLM
│ │ ├── main.py # FastAPI сервер
│ │ ├── llm.py # LLM клиент
│ │ └── Dockerfile
│ └── streamlit_app/ # Веб-интерфейс
│ ├── app.py # Streamlit приложение
│ └── Dockerfile
├── models/ # Базовая модель
│ └── Qwen2.5-Coder-3B-Instruct/
├── lora_adapter/ # Обученный LoRA адаптер
├── spider_data/ # Spider датасет
│ ├── database/ # 200+ SQLite баз данных
│ ├── dev.json # Валидационные примеры
│ ├── train_spider.json # Тренировочные примеры
│ └── tables.json # Схемы таблиц
├── train_src/ # Скрипты обучения
│ ├── train.py # Основной скрипт обучения
│ └── data_preparation.py # Подготовка данных
├── docker-compose.yml # Конфигурация сервисов
├── restart.sh # Скрипт перезапуска
└── check_status.sh # Скрипт проверки статуса
- Docker и Docker Compose
- NVIDIA GPU с поддержкой CUDA (рекомендуется 8+ GB VRAM)
- NVIDIA Container Toolkit для работы GPU в Docker
- OpenRouter API Key для LLM функций
# Клонируйте репозиторий
git clone <repository-url>
cd project
# Создайте .env файл с API ключом OpenRouter
echo "OPENROUTER_API_KEY=your_api_key_here" > .envУбедитесь, что в папке models/ находится базовая модель:
models/Qwen2.5-Coder-3B-Instruct/
LoRA адаптер должен быть в папке lora_adapter/.
Spider датасет должен быть в папке spider_data/.
# Дать права на выполнение скриптов
chmod +x restart.sh check_status.sh
# Запуск всех сервисов
./restart.sh
# Или вручную через docker-compose
docker-compose up -d --build# Проверить статус всех сервисов
./check_status.sh| Сервис | URL | Описание |
|---|---|---|
| Streamlit UI | http://localhost:8501 | Веб-интерфейс |
| Model API Docs | http://localhost:8001/docs | Swagger для LoRA API |
| Spider API Docs | http://localhost:8000/docs | Swagger для Spider API |
| LLM API Docs | http://localhost:8002/docs | Swagger для LLM API |
| Метод | Endpoint | Описание |
|---|---|---|
| GET | /health |
Проверка статуса и загрузки модели |
| POST | /generate |
Генерация SQL по тексту |
Пример запроса /generate:
{
"question": "Show all singers with age greater than 30",
"db_id": "concert_singer",
"schema": "CREATE TABLE singer (singer_id INT, name TEXT, age INT)"
}| Метод | Endpoint | Описание |
|---|---|---|
| GET | /health |
Проверка статуса |
| GET | /databases |
Список доступных баз данных |
| GET | /schema/{db_id} |
Схема указанной БД |
| POST | /query |
Выполнение SQL запроса |
| POST | /explain |
Получение EXPLAIN плана запроса |
| POST | /evaluate |
Оценка SQL запроса |
Пример запроса /query:
{
"db_id": "concert_singer",
"sql": "SELECT * FROM singer WHERE age > 30"
}Пример запроса /explain:
{
"db_id": "concert_singer",
"sql": "SELECT * FROM singer WHERE age > 30"
}| Метод | Endpoint | Описание |
|---|---|---|
| GET | /health |
Проверка статуса |
| GET | /models |
Список доступных LLM моделей |
| POST | /text-to-sql |
Генерация SQL через LLM |
| POST | /optimize-sql |
Оптимизация SQL с анализом |
| POST | /chat |
Общий чат с LLM |
Пример запроса /optimize-sql:
{
"sql": "SELECT * FROM singer WHERE age > 30",
"schema": "CREATE TABLE singer (...)",
"explain_plan": "SCAN singer",
"model": "deepseek/deepseek-chat-v3-0324"
}Ответ с structured output:
{
"original_sql": "SELECT * FROM singer WHERE age > 30",
"optimized_sql": "SELECT singer_id, name, age FROM singer WHERE age > 30",
"analysis": "Заменён SELECT * на явный список колонок",
"recommendations": ["Создать индекс на колонке age"]
}cd train_src
# Скачивание базовой модели (если нужно)
python download_model.py
# Подготовка данных для обучения
python data_preparation.py# Обучение с конфигурацией по умолчанию
python train.py
# Обучение с кастомной конфигурацией
python train.py --config configs/custom_config.yamlМодель использует следующие параметры LoRA:
- 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
# .env файл
OPENROUTER_API_KEY=sk-or-... # API ключ OpenRouter (обязательно)| Сервис | Порт | GPU | Описание |
|---|---|---|---|
lora_model_inference |
8001 | Да | LoRA модель |
spider_fastapi |
8000 | Нет | База данных Spider |
llm_fastapi |
8002 | Нет | OpenRouter LLM |
streamlit_ui |
8501 | Нет | Веб-интерфейс |
- Откройте http://localhost:8501
- Выберите базу данных из списка (например,
concert_singer) - Введите вопрос на естественном языке
- Выберите модель:
LoRA (Qwen2.5-Coder-3B)- локальная дообученная модельDeepSeek Chat V3- через OpenRouterClaude 3.5 Sonnet- через OpenRouter
- Нажмите "Сгенерировать SQL"
- Просмотрите результаты:
- Сгенерированный SQL
- Результат выполнения
- EXPLAIN план
- Рекомендации по оптимизации (если применимо)
# Проверьте логи
docker-compose logs -f lora_model_inference
# Убедитесь, что модель и адаптер на месте
ls -la models/Qwen2.5-Coder-3B-Instruct/
ls -la lora_adapter/# Проверьте NVIDIA Docker runtime
docker run --rm --gpus all nvidia/cuda:11.0-base nvidia-smi# Проверьте API ключ
echo $OPENROUTER_API_KEY
# Проверьте логи LLM API
docker-compose logs -f llm_fastapi# Полный перезапуск с очисткой
docker-compose down
docker-compose build --no-cache
docker-compose up -d# Все логи
docker-compose logs -f
# Логи конкретного сервиса
docker-compose logs -f lora_model_inference
docker-compose logs -f spider_fastapi
docker-compose logs -f llm_fastapi
docker-compose logs -f streamlit_ui