🚀 析言SQL-QwenCoder-2504
析言SQL-QwenCoder-2504是最新的SQL生成模型,在之前版本基础上持续优化,性能显著提升。它结合微调与GRPO训练,支持多方言,开箱即用,在不同方言和跨领域数据集上表现出色。
重要链接
📖Github |
🤖ModelScope |
🌐析言SQL |
🌕析言GBI |
💻Modelscope Space
✨ 主要特性
我们很高兴发布 析言SQL-QwenCoder-2504 版本,这是我们最新的SQL生成模型。此版本在之前版本的基础上继续优化,性能得到显著提升。
- 模型结合了 微调与GRPO训练 的重要探索,利用无思考过程的GRPO后训练策略,在SQL生成中实现了效率与准确性的平衡。
- 展现出 出色的性能,支持 多种方言,可直接使用。
- 泛化能力得到提升,在不同方言和 跨领域数据集 上表现优异。
在评估中,我们还增加了 真实世界的SQL基准测试(DW测试集),作为重要的内部评估基线。该测试集包含数千个来自PostgreSQL和MySQL方言真实场景的复杂查询,能有效反映模型在多种方言和跨领域数据上的性能。
📦 模型下载
📊 性能表现
析言SQL-QwenCoder系列模型作为多方言SQL基础模型,展现出强大的SQL生成能力。以下是模型发布时的综合评估结果。我们使用BIRD和Spider作为Text-to-SQL领域的SQLite基准测试,以及PostgreSQL和MySQL方言的DW基准测试,在M-Schema和原始DDL两种模式格式下对模型性能进行了全面评估。
模型名称 |
大小 |
BIRD Dev@M-Schema |
BIRD Dev@DDL |
Spider Test@M-Schema |
Spider Test@DDL |
DW PostgreSQL@M-Schema |
DW MySQL@M-Schema |
GPT-4o-0806 |
UNK |
58.47% |
54.82% |
82.89% |
78.45% |
46.79% |
57.77% |
GPT-4.1-0414 |
UNK |
59.39% |
54.11% |
84.45% |
79.86% |
54.29% |
63.18% |
Claude3.5-sonnet-1022 |
UNK |
53.32% |
50.46% |
76.27% |
73.04% |
55.22% |
52.84% |
Claude3.7-sonnet |
UNK |
54.82% |
49.22% |
78.04% |
74.66% |
53.23% |
54.61% |
Gemini-1.5-Pro |
UNK |
61.34% |
57.89% |
85.11% |
84.00% |
52.78% |
62.78% |
DeepSeek-V2.5-1210 |
236B |
55.74% |
55.61% |
82.08% |
80.57% |
45.74% |
52.18% |
DeepSeek-V3 |
685B |
59.58% |
56.71% |
81.52% |
79.91% |
52.56% |
55.95% |
DeepSeek-R1 |
685B |
58.15% |
55.61% |
80.72% |
78.85% |
60.56% |
62.00% |
DeepSeek-R1-Distill-Qwen-32B |
32B |
50.65% |
48.31% |
78.65% |
77.33% |
37.22% |
44.72% |
Deepseek-Coder-33B-Instruct |
33B |
47.52% |
44.72% |
72.39% |
62.0% |
31.48% |
36.17% |
OmniSQL-32B |
32B |
60.37% |
55.87% |
85.16% |
83.19% |
38.19% |
42.34% |
析言SQL-QwenCoder-3B-2502 |
3B |
53.52% |
52.54% |
83.34% |
79.10% |
34.75% |
35.62% |
析言SQL-QwenCoder-3B-2504 |
3B |
55.08% |
52.09% |
84.10% |
80.57% |
36.65% |
37.63% |
析言SQL-QwenCoder-7B-2502 |
7B |
59.65% |
56.32% |
84.15% |
80.01% |
39.38% |
42.10% |
析言SQL-QwenCoder-7B-2504 |
7B |
62.13% |
57.43% |
85.97% |
82.48% |
42.08% |
44.67% |
析言SQL-QwenCoder-14B-2502 |
14B |
63.23% |
60.10% |
85.31% |
82.84% |
38.51% |
41.62% |
析言SQL-QwenCoder-14B-2504 |
14B |
65.32% |
60.17% |
86.82% |
83.75% |
40.52% |
44.60% |
析言SQL-QwenCoder-32B-2412 |
32B |
67.07% |
63.04% |
88.39% |
85.46% |
45.07% |
52.84% |
析言SQL-QwenCoder-32B-2504 |
32B |
67.14% |
62.26% |
89.20% |
86.17% |
53.52% |
57.74% |
💻 使用示例
基础用法
以下是一个快速使用 析言SQL-QwenCoder 模型的简单代码片段。我们提供了中文提示模板,你只需替换 "question"、"db_schema" 和 "evidence" 的占位符即可开始使用。建议使用 M-Schema 格式的模式;其他格式如DDL也可接受,但可能会影响性能。目前,模型主要支持SQLite、PostgreSQL和MySQL等主流方言。
环境要求
- transformers >= 4.37.0
- vllm >= 0.7.2
提示模板
nl2sqlite_template_cn = """你是一名{dialect}专家,现在需要阅读并理解下面的【数据库schema】描述,以及可能用到的【参考信息】,并运用{dialect}知识生成sql语句回答【用户问题】。
【用户问题】
{question}
【数据库schema】
{db_schema}
【参考信息】
{evidence}
【用户问题】
{question}
```sql"""
使用Transformers进行推理
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer
model_name = "XGenerationLab/XiYanSQL-QwenCoder-32B-2504"
model = AutoModelForCausalLM.from_pretrained(
model_name,
torch_dtype=torch.bfloat16,
device_map="auto"
)
tokenizer = AutoTokenizer.from_pretrained(model_name)
prompt = nl2sqlite_template_cn.format(dialect="", db_schema="", question="", evidence="")
message = [{'role': 'user', 'content': prompt}]
text = tokenizer.apply_chat_template(
message,
tokenize=False,
add_generation_prompt=True
)
model_inputs = tokenizer([text], return_tensors="pt").to(model.device)
generated_ids = model.generate(
**model_inputs,
pad_token_id=tokenizer.pad_token_id,
eos_token_id=tokenizer.eos_token_id,
max_new_tokens=1024,
temperature=0.1,
top_p=0.8,
do_sample=True,
)
generated_ids = [
output_ids[len(input_ids):] for input_ids, output_ids in zip(model_inputs.input_ids, generated_ids)
]
response = tokenizer.batch_decode(generated_ids, skip_special_tokens=True)[0]
使用vLLM进行推理
from vllm import LLM, SamplingParams
from transformers import AutoTokenizer
model_path = "XGenerationLab/XiYanSQL-QwenCoder-32B-2504"
llm = LLM(model=model_path, tensor_parallel_size=8)
tokenizer = AutoTokenizer.from_pretrained(model_path)
sampling_params = SamplingParams(
n=1,
temperature=0.1,
max_tokens=1024
)
prompt = nl2sqlite_template_cn.format(dialect="", db_schema="", question="", evidence="")
message = [{'role': 'user', 'content': prompt}]
text = tokenizer.apply_chat_template(
message,
tokenize=False,
add_generation_prompt=True
)
outputs = llm.generate([text], sampling_params=sampling_params)
response = outputs[0].outputs[0].text
📄 许可证
本项目采用Apache-2.0许可证。
🙏 致谢
如果您觉得我们的工作有帮助,请引用或点赞,让我们为开源社区做出更大的贡献!