| --- |
| base_model: microsoft/Phi-3-mini-4k-instruct |
| library_name: peft |
| license: apache-2.0 |
| language: |
| - en |
| tags: |
| - sql |
| - code-generation |
| - text-to-sql |
| - phi-3 |
| - lora |
| - qlora |
| - fine-tuned |
| - peft |
| pipeline_tag: text-generation |
| --- |
| |
| # Phi-3 Mini SQL Generator (QLoRA Fine-tuned) |
|
|
| Fine-tuned version of [Phi-3-mini-4k-instruct](https://huggingface.co/microsoft/Phi-3-mini-4k-instruct) |
| for **natural language → SQL** generation using QLoRA on a T4 GPU (Google Colab, ~20 min). |
|
|
| ## Evaluation — Base vs Fine-tuned |
|
|
| Evaluated on 200 held-out examples from [b-mc2/sql-create-context](https://huggingface.co/datasets/b-mc2/sql-create-context). |
|
|
| | Model | Exact Match | |
| |---|---| |
| | Phi-3-mini-4k-instruct (base) | 2.0% | |
| | **This adapter (fine-tuned)** | **73.5%** | |
|
|
| ## Training Details |
|
|
| - **Dataset:** b-mc2/sql-create-context — 1,000 train / 200 validation examples |
| - **Epochs:** 3 |
| - **Effective batch size:** 8 |
| - **Learning rate:** 0.0002 |
| - **Hardware:** NVIDIA T4 (Google Colab free tier) |
| - **Training time:** 21.2 min |
| - **Final train loss:** 0.6526 |
| - **Best checkpoint:** step 250 (by eval loss) |
|
|
| ## LoRA Config |
|
|
| | Parameter | Value | |
| |---|---| |
| | Rank (r) | 16 | |
| | Alpha | 32 | |
| | Dropout | 0.05 | |
| | Target modules | ['down_proj', 'qkv_proj', 'gate_up_proj', 'o_proj'] | |
| | Quantization | 4-bit NF4 (QLoRA) | |
| |
| ## How to Use |
| |
| ```python |
| from transformers import AutoModelForCausalLM, AutoTokenizer |
| from peft import PeftModel |
| import torch |
| |
| tokenizer = AutoTokenizer.from_pretrained("Shizu0n/phi3-mini-sql-generator", trust_remote_code=True) |
| base_model = AutoModelForCausalLM.from_pretrained( |
| "microsoft/Phi-3-mini-4k-instruct", |
| torch_dtype=torch.float16, device_map="auto", trust_remote_code=True, |
| ) |
| model = PeftModel.from_pretrained(base_model, "Shizu0n/phi3-mini-sql-generator") |
| model.eval() |
| |
| prompt = "Given the following SQL table, write a SQL query.\n\n"\ |
| "Table: employees (id, name, department, salary)\n\n"\ |
| "Question: What is the average salary per department?\n\nSQL:" |
| |
| inputs = tokenizer(prompt, return_tensors="pt").to(model.device) |
| with torch.inference_mode(): |
| outputs = model.generate(**inputs, max_new_tokens=100, do_sample=False) |
| prompt_len = inputs["input_ids"].shape[-1] |
| print(tokenizer.decode(outputs[0][prompt_len:], skip_special_tokens=True)) |
| ``` |
| |
| ## Limitations |
|
|
| - Fine-tuned on 1,000 examples — best suited for simple to medium complexity SELECT queries |
| - Not tested on dialect-specific SQL (PostgreSQL/MySQL-specific functions) |
| - May struggle with multi-table JOINs and nested subqueries |
|
|