--- license: apache-2.0 base_model: Qwen/Qwen2.5-Coder-7B-Instruct tags: - text-to-sql - sql - qlora - lora - fine-tuned - qwen2 language: - en pipeline_tag: text-generation --- # fg-sql-merged A fine-tuned text-to-SQL model for the `fg_organization` HR/ERP database schema. Given a natural-language question, it generates the corresponding MySQL query. This repo is the **merged** model (base weights + LoRA adapter folded together, full fp16 precision) — for the standalone adapter alone, see [`yoonboom/fg-sql-lora-adapter`](https://huggingface.co/yoonboom/fg-sql-lora-adapter). ## Model Details - **Base model:** [Qwen/Qwen2.5-Coder-7B-Instruct](https://huggingface.co/Qwen/Qwen2.5-Coder-7B-Instruct) - **Fine-tuning method:** QLoRA (4-bit base + LoRA adapter during training, merged back to fp16 for this repo) - **LoRA config:** r=16, alpha=32, dropout=0.05, target modules `q_proj, k_proj, v_proj, o_proj, gate_proj, up_proj, down_proj` - **Precision:** fp16 (merged); a `q8_0` GGUF quantization is also available for llama.cpp/Ollama serving at [`yoonboom/fg-sql-gguf`](https://huggingface.co/yoonboom/fg-sql-gguf) - **Language:** English (natural-language input), MySQL 8.0 dialect (SQL output) ## Intended Use Translate natural-language questions about a fictional company's HR/ERP data into MySQL queries against the `fg_organization` schema (18 tables covering organization structure, workforce, projects/tasks, and finance). Intended to run behind a guardrail layer that validates generated SQL against the real schema before execution (see `sql_schema_guard.py` in the companion repo) — **this model should not be trusted to execute SQL directly against a production database without that validation step.** ### Out of Scope - Any other database schema — this model is specifically tuned to `fg_organization`'s tables/columns/ID conventions and will not generalize to arbitrary SQL schemas. - Recruitment/candidate data, IT asset tracking, employee training records, and real external client identity — the underlying schema has no tables for any of these; the model is trained to decline these rather than fabricate a table. - True cost/profit/margin calculations — the schema has no cost/rate column anywhere, only revenue and hours logged as separate figures. ## Training Data - 400 hand-written/generated question→SQL pairs (320 train / 40 val / 40 test), stratified across ~10-11 categories: simple lookups, joins, aggregations, date/time filtering, manager-hierarchy recursion, and mixed-complexity queries (CTEs, EXISTS, correlated subqueries). - Schema: `fg_organization`, 18 tables, MySQL 8.0 (`WITH RECURSIVE` support required for hierarchy queries). ## Training Procedure - **Hardware:** Google Colab free-tier, Tesla T4 GPU (16GB VRAM, fp16 only — no bf16 support) - **Method:** QLoRA — 4-bit quantized base (`bitsandbytes`, nf4, double-quant) + LoRA adapter (`peft`), trained via `transformers.Trainer` - **Hyperparameters:** 3 epochs, effective batch size 16 (per-device batch 1 × grad accumulation 16), learning rate 2e-4, cosine schedule, 3% warmup, `paged_adamw_8bit` optimizer - **Loss masking:** assistant-turn-only (system + user prompt tokens masked to -100, loss computed only on the generated SQL) ### Training Results | Step | Train loss | Val loss | |---|---|---| | 10 | 0.369 | 0.227 | | 20 | 0.195 | 0.155 | | 30 | 0.102 | 0.124 | | 40 | 0.075 | 0.113 | | 50 | 0.065 | 0.110 | | 60 | 0.048 | 0.109 | Val loss plateaus over the final 20 steps while train loss keeps falling — 3 epochs was about the right stopping point for this dataset size. ## Evaluation - **Exact-match on held-out test set (40 examples):** ~30% strict string-match; substantially higher (~68%) when accounting for functionally-equivalent-but-differently-styled SQL (renamed aliases, different but valid `ORDER BY` choices, extra helpful columns). - **Known weak categories** (as of this checkpoint): resolving named roles/titles without hardcoded lookups, descendant-direction recursive hierarchy questions ("everyone under X" vs. "who X reports to"), and a tendency toward schema hallucination under harder aggregation/CTE questions (invented column/ID names that don't exist in the real schema). - A static schema-fidelity checker (regex/alias-aware, no DB required) is used alongside this model in production to catch hallucinated tables/columns/IDs before execution. ## Limitations - Trained on a relatively small dataset (400 pairs) for a 7B model — some brittleness on question phrasings not well-represented in training data should be expected, particularly for hierarchy-direction and role/title resolution questions (see Evaluation above). - This model can still generate SQL referencing non-existent columns/tables/IDs when uncertain, rather than reliably declining — always validate output against the real schema before execution. - Specific to the `fg_organization` schema; not a general-purpose text-to-SQL model. ## License Apache 2.0 (inherited from the Qwen2.5-Coder-7B-Instruct base model).