| | --- |
| | license: apache-2.0 |
| | base_model: Qwen/Qwen2.5-0.5B-Instruct |
| | tags: |
| | - qwen2.5 |
| | - lora |
| | - text-to-sql |
| | - sql |
| | - peft |
| | library_name: peft |
| | --- |
| | |
| | # Qwen2.5-0.5B LoRA Fine-tuned for Text-to-SQL |
| |
|
| | This is a **LoRA adapter** for [Qwen/Qwen2.5-0.5B-Instruct](https://huggingface.co/Qwen/Qwen2.5-0.5B-Instruct) fine-tuned on natural language to SQL conversion. |
| |
|
| | ## Quick Links |
| |
|
| | - 🔗 **Merged Model (Ready-to-use):** [vindows/qwen2.5-0.5b-text-to-sql-merged](https://huggingface.co/vindows/qwen2.5-0.5b-text-to-sql-merged) |
| | - 🖥️ **GGUF for CPU Inference:** [vindows/qwen2.5-0.5b-text-to-sql-gguf](https://huggingface.co/vindows/qwen2.5-0.5b-text-to-sql-gguf) |
| |
|
| | ## Model Performance |
| |
|
| | ### Training Metrics (54 test examples) |
| |
|
| | | Metric | Base Model | Fine-tuned | Improvement | |
| | |--------|-----------|------------|-------------| |
| | | Loss | 2.1429 | 0.5823 | 72.83% ⬆️ | |
| | | Perplexity | 8.5244 | 1.7901 | 79.00% ⬆️ | |
| |
|
| | ### Spider Benchmark Results (200 examples) |
| |
|
| | | Metric | Score | |
| | |--------|-------| |
| | | Exact Match | 0.00% | |
| | | Normalized Match | 0.00% | |
| | | Component Accuracy | 91.94% | |
| | | Average Similarity | 21.78% | |
| |
|
| | **Note:** The model shows strong component understanding but tends to append explanatory text after SQL queries, affecting exact match scores. See limitations below. |
| |
|
| | ## Training Details |
| |
|
| | - **Training Time:** 2 minutes 5 seconds |
| | - **Epochs:** 3 |
| | - **LoRA Rank:** 16 |
| | - **LoRA Alpha:** 32 |
| | - **Learning Rate:** 2e-4 |
| | - **Dataset:** 425 training examples, 54 validation, 54 test |
| |
|
| | ## Usage |
| |
|
| | ### With PEFT (Recommended for fine-tuning/adapters) |
| |
|
| | ```python |
| | from transformers import AutoModelForCausalLM, AutoTokenizer |
| | from peft import PeftModel |
| | import torch |
| | |
| | # Load base model |
| | base_model = AutoModelForCausalLM.from_pretrained( |
| | "Qwen/Qwen2.5-0.5B-Instruct", |
| | device_map="auto", |
| | torch_dtype=torch.bfloat16, |
| | trust_remote_code=True |
| | ) |
| | |
| | # Load LoRA adapter |
| | model = PeftModel.from_pretrained(base_model, "vindows/qwen2.5-0.5b-text-to-sql") |
| | tokenizer = AutoTokenizer.from_pretrained("Qwen/Qwen2.5-0.5B-Instruct", trust_remote_code=True) |
| | |
| | # Generate SQL |
| | prompt = "Convert the following natural language question to SQL:\n\nDatabase: concert_singer\nQuestion: How many singers do we have?\n\nSQL:" |
| | inputs = tokenizer(prompt, return_tensors="pt").to(model.device) |
| | outputs = model.generate(**inputs, max_new_tokens=128, temperature=0.1) |
| | sql = tokenizer.decode(outputs[0], skip_special_tokens=True) |
| | print(sql) |
| | ``` |
| |
|
| | ### Using the Merged Model (Easier) |
| |
|
| | For easier usage without loading base + adapter separately, use the merged model: |
| |
|
| | ```python |
| | from transformers import AutoModelForCausalLM, AutoTokenizer |
| | |
| | model = AutoModelForCausalLM.from_pretrained( |
| | "vindows/qwen2.5-0.5b-text-to-sql-merged", |
| | device_map="auto", |
| | trust_remote_code=True |
| | ) |
| | tokenizer = AutoTokenizer.from_pretrained("vindows/qwen2.5-0.5b-text-to-sql-merged") |
| | ``` |
| |
|
| | ## Limitations |
| |
|
| | 1. **Appends Explanatory Text:** The model tends to append explanatory text or context after generating SQL queries. Post-processing to extract only the SQL statement is recommended. |
| | 2. **Hallucinated Table Names (0.5B):** The smaller 0.5B model sometimes invents table names not present in the schema. |
| | 3. **Training Data Distribution:** Best performance on queries similar to training examples. |
| |
|
| | ## Recommended Post-Processing |
| |
|
| | ```python |
| | def extract_sql(generated_text): |
| | # Extract SQL after the "SQL:" marker |
| | if "SQL:" in generated_text: |
| | sql = generated_text.split("SQL:")[-1].strip() |
| | else: |
| | sql = generated_text |
| | |
| | # Take only the first SQL statement (before extra text) |
| | if '\n\n' in sql: |
| | sql = sql.split('\n\n')[0].strip() |
| | |
| | # Remove trailing semicolon if present |
| | sql = sql.rstrip(';').strip() |
| | |
| | return sql |
| | ``` |
| |
|
| | ## Files Included |
| |
|
| | - `adapter_config.json` - LoRA configuration |
| | - `adapter_model.safetensors` - LoRA weights |
| | - `README.md` - This file |
| |
|
| | ## Citation |
| |
|
| | ```bibtex |
| | @misc{qwen2.5-0.5b-text-to-sql, |
| | title = {Qwen2.5-0.5B LoRA Fine-tuned for Text-to-SQL}, |
| | year = {2024}, |
| | publisher = {Hugging Face}, |
| | url = {https://huggingface.co/vindows/qwen2.5-0.5b-text-to-sql} |
| | } |
| | ``` |
| |
|
| | ## License |
| |
|
| | Apache 2.0 (inherits from base Qwen2.5 model) |
| |
|