fg-sql-merged / README.md
yoonboom's picture
Upload README.md with huggingface_hub
34bd0e5 verified
|
Raw
History Blame Contribute Delete
5.15 kB
---
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).