SQLCoder:专为 Text-to-SQL 微调的大模型
FreeGuideOnline
最新
2026-06-23
bash pip install torch transformers accelerate bitsandbytes
对于大尺寸模型,建议同时安装 `xformers` 以加速推理。
### 基础推理示例
以下代码演示如何加载 SQLCoder-7B 并生成 SQL 查询:
```python
from transformers import AutoTokenizer, AutoModelForCausalLM
import torch
model_name = "defog/sqlcoder-7b-2"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForCausalLM.from_pretrained(
model_name,
torch_dtype=torch.float16,
device_map="auto",
trust_remote_code=True
)
# 构造提示词,必须包含 Schema 和问题
prompt = """### Instructions:
Your task is to convert a text question to a SQL query, given a database schema.
Adhere to the following rules:
- Use valid SQL syntax only.
- Only generate the SQL query, no explanations.
### Database Schema:
CREATE TABLE employees (
id INTEGER PRIMARY KEY,
name TEXT,
department TEXT,
salary INTEGER,
hire_date DATE
);
### Question:
列出薪资高于80000的所有员工姓名和部门,按入职日期降序排列。
### SQL:
"""
inputs = tokenizer(prompt, return_tensors="pt").to(model.device)
outputs = model.generate(**inputs, max_new_tokens=200, do_sample=False, num_beams=4)
generated_sql = tokenizer.decode(outputs[0], skip_special_tokens=True)
# 提取 SQL 部分
sql_part = generated_sql.split("### SQL:")[-1].strip()
print(sql_part)
注意:提示词格式对结果影响巨大。务必清晰给出任务指令、数据库 DDL 语句以及自然语言问题。
针对不同数据源定制提示
你可以替换 DB Schema 部分来查询自己的数据库。例如,对于 PostgreSQL,可以包含标准的 DDL;对于 BigQuery 可能需要指定分区过滤等,也可以通过提示词中的“Additional Rules”指导模型生成方言语法。
微调属于你自己的 SQLCoder 模型
数据集构建
准备一个 JSON 格式的数据集,每行包含 schema(CREATE TABLE 语句)和 question-query 对。示例:
{
"schema": "CREATE TABLE products (product_id INT, name TEXT, price DECIMAL);",
"question": "价格最低的商品叫什么?",
"query": "SELECT name FROM products ORDER BY price ASC LIMIT 1"
}
建议收集至少几百条高质量样本,涵盖你业务中常见的查询模式。可在公开数据基础上增加私有 Schema 样本。
使用 LoRA 进行高效微调
利用 peft 库可以快速完成微调:
from peft import LoraConfig, get_peft_model, TaskType
# 配置 LoRA 参数
lora_config = LoraConfig(
r=8,
lora_alpha=16,
target_modules=["c_attn", "c_proj", "w1", "w2"], # 根据模型架构调整
lora_dropout=0.05,
bias="none",
task_type=TaskType.CAUSAL_LM,
)
model = get_peft_model(model, lora_config)
随后使用 Trainer 进行常规的训练循环,监督信号为 query 部分的交叉熵损失。微调后的模型会显著提升在私有 Schema 上的准确率。
微调经验与最佳实践
- 小步快跑:先用少量数据(如 100 条)验证流程,再逐步扩大。
- 保留原始能力:混合少量通用 SQL 数据,避免模型完全只记住私有 Schema 而失去泛化能力。
- 评估指标:使用执行准确率(Execution Accuracy)作为终极指标,而非仅匹配 SQL 文本。
- 显存优化:使用 4bit 量化加载基础模型,并结合 gradient_checkpointing 减少显存占用。
常见问题与优化技巧
模型生成的 SQL 语法错误怎么办?
- 在提示词中进一步明确数据库类型(如
-- Use PostgreSQL syntax)。 - 增加后处理步骤,使用 SQL 解析器(如
sqlglot)进行语法检查和自动修正。 - 在微调数据中专门加入带语法错误的修正样本。
如何让模型更好地遵循 Schema?
确保 DDL 语句完整,包含主键、外键约束和列注释(作为内联注释):
CREATE TABLE orders (
order_id INT PRIMARY KEY, -- 订单唯一ID
customer_id INT REFERENCES customers(id),
order_date TIMESTAMP, -- 下单时间
total DECIMAL(10,2) -- 总金额
);