vindows's picture
Upload folder using huggingface_hub
909715e verified
---
license: apache-2.0
base_model: Qwen/Qwen2.5-7B-Instruct
tags:
- qwen2.5
- lora
- text-to-sql
- sql
- peft
library_name: peft
---
# Qwen2.5-7B LoRA Fine-tuned for Text-to-SQL
This is a **LoRA adapter** for [Qwen/Qwen2.5-7B-Instruct](https://huggingface.co/Qwen/Qwen2.5-7B-Instruct) fine-tuned on natural language to SQL conversion.
## Quick Links
- 🔗 **Merged Model (Ready-to-use):** [vindows/qwen2.5-7b-text-to-sql-merged](https://huggingface.co/vindows/qwen2.5-7b-text-to-sql-merged)
- 🖥️ **GGUF for CPU Inference:** [vindows/qwen2.5-7b-text-to-sql-gguf](https://huggingface.co/vindows/qwen2.5-7b-text-to-sql-gguf)
## Model Performance
### Training Metrics (54 test examples)
| Metric | Base Model | Fine-tuned | Improvement |
|--------|-----------|------------|-------------|
| Loss | 2.1301 | 0.4098 | 80.76% ⬆️ |
| Perplexity | 8.4155 | 1.5064 | 82.10% ⬆️ |
### Spider Benchmark Results (200 examples)
| Metric | Score |
|--------|-------|
| Exact Match | 0.00% |
| Normalized Match | 0.50% |
| Component Accuracy | 92.60% |
| Average Similarity | 25.47% |
**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:** 6 minutes 15 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-7B-Instruct",
device_map="auto",
torch_dtype=torch.bfloat16,
trust_remote_code=True
)
# Load LoRA adapter
model = PeftModel.from_pretrained(base_model, "vindows/qwen2.5-7b-text-to-sql")
tokenizer = AutoTokenizer.from_pretrained("Qwen/Qwen2.5-7B-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-7b-text-to-sql-merged",
device_map="auto",
trust_remote_code=True
)
tokenizer = AutoTokenizer.from_pretrained("vindows/qwen2.5-7b-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-7b-text-to-sql,
title = {Qwen2.5-7B LoRA Fine-tuned for Text-to-SQL},
year = {2024},
publisher = {Hugging Face},
url = {https://huggingface.co/vindows/qwen2.5-7b-text-to-sql}
}
```
## License
Apache 2.0 (inherits from base Qwen2.5 model)