微调Qwen2.5做NL2sql(一):常用数据源及使用解析
一、NL2SQL技术概述
-
定义与需求背景:NL2SQL(Natural Language to SQL),也叫text2SQL,旨在将自然语言查询转换为可执行SQL语句,满足人们通过自然语言操作数据库的需求,应用于智能客服、报表生成、信息检索等场景。由于单纯的RAG技术无法让大模型生成SQL与数据库交互,因此需要大模型微调。
- 该任务是在已知数据库的表名、列名其从属关系(这些统称为数据库的Schema)的前提下,将人类的自然语言问句(Question)转化为对应的数据库查询SQL语句。
- 该任务是在已知数据库的表名、列名其从属关系(这些统称为数据库的Schema)的前提下,将人类的自然语言问句(Question)转化为对应的数据库查询SQL语句。
-
大模型微调必备条件:进行大模型微调需要具备三个关键要素,即有合适的大模型、对应领域的专业数据以及相关的资源或框架。
二、寻找数据源
-
国外数据源 - Hugging Face:可登录Hugging Face网站,在搜索框输入“text2SQL”等相关领域数据名称进行搜索。以“bird_text_to_sql”为例,点击进入后,通过数据名片可查看简单数据样例,点击数据块能看到数据量(如1.53k),并可选择直接下载,支持pandas等方式。
中文镜像源网址:https://hf-mirror.com/
3. 国内数据源 - ModelScope:与Hugging Face用法类似,在ModelScope社区点击数据集,输入“text2SQL”,它会优先展示中文相关数据集。部分数据集可能没有数据卡片,需下载后查看详细信息,下载方式包括直接点击下载到本地电脑,或通过git、SDK等方式选择数据集下载 。
-
国内数据源 - 其他社区:摩乐社区也可作为数据源参考,其数据量相对较小,但可作为补充数据源,社区汉化较好。
-
大学与企业合作的数据源
- 英文系列 - WikiSQL:属于单领域数据源,包含80654个自然语言问题和77840个SQL语句,SQL语句形式简单,不包含排序等复杂操作。数据在GitHub上,需下载“data.tar.bz2”压缩包,解压后包含“dev.db”“dev.jsonl”“dev.tables.jsonl”等文件。
- “dev.jsonl”中的“phase”表示数据收集阶段,“question”代表输入问题,“sql”包含查询相关信息,通过“column_index”“operator_index”“condition”组成的三元组来拆解SQL查询,“table_id”用于关联表格,“dev.tables.jsonl”中的“header”表示表结构,“rows”表示数据行。
- 英文系列 - WikiSQL:属于单领域数据源,包含80654个自然语言问题和77840个SQL语句,SQL语句形式简单,不包含排序等复杂操作。数据在GitHub上,需下载“data.tar.bz2”压缩包,解压后包含“dev.db”“dev.jsonl”“dev.tables.jsonl”等文件。
文件名 | 文件类型 | 作用 | 举例 |
---|---|---|---|
dev.db | 数据库文件 | 存储实际数据内容和表结构等信息,用于执行生成的SQL语句来验证查询结果 | 假设我们有一个电商业务场景,dev.db 里存储了商品信息表、订单表等数据。当模型根据自然语言“查询2024年12月的订单数量”生成SQL语句后,可在该数据库中执行,查看查询结果是否符合预期 |
dev.jsonl | JSON Lines文件 | 每行是独立JSON对象,记录自然语言问题及对应的SQL查询信息等,为模型训练提供映射样本 | 比如其中一行JSON对象为{"phase": 1, "question": "哪些商品的价格大于500元?", "sql": {"conds": [[2, 1, "500"]], "sel": 1, "agg": 0}, "table_id": "1-12345"} ,这里question 是自然语言问题,sql 里的conds 表示查询条件,sel 和agg 分别是所选列索引和聚合运算符索引 |
dev.tables.jsonl | JSON Lines文件 | 存储数据库中各表详细结构信息,帮助将dev.jsonl 中conds 的column_index 与实际列名和属性对应 | 若dev.jsonl 中有个查询条件的column_index 为1,在dev.tables.jsonl 中找到对应表的结构信息,发现索引1对应的列名为product_price ,数据类型为float ,这样就能明确是基于“商品价格”列进行条件判断 |
- 英文系列 - Spider:由耶鲁大学提出,是多数据库、多表、单轮查询的Text to SQL数据集,也是业界公认难度较大的跨领域评测榜单,相应的SQL语句中包含了JOIN、GROUP BY、HAVING、嵌套等诸多SQL高级语法内容。同时,该数据集也根据相应SQL语句的复杂程度划分了不同的难度等级。分为简单、中等、困难、特别困难四个等级。数据集中的“db_id”代表数据库,“query”是查询语句,“query_toks”和“question_toks”是经过分词和编码处理后的文本表示,“query_toks_no_value”用于减少数值对模型训练和解析的干扰,“from”表示获取数据的表,“table_units”指定具体表,“conds”是查询条件,“select”表示选择的列或表达式,其复杂的数据嵌套结构需结合文档确定具体含义。
- 英文系列 - SParC:用于复杂、跨域、上下文相关(多轮)语义解析和Text-to-SQL任务,由4298个连贯问题序列组成,包含12k +个自然语言问题到SQL标注的Question - SQL对,通过用户与138个领域的200个复杂数据库交互获得。
- 英文系列 - CoSQL:跨域数据库CoSQL,由30k +轮次和10k +带注释的SQL查询组成。
- 英文系列 - KaggleDBQA:由华盛顿大学与微软联合创建,是真实数据集,包括跨8个数据库的272个示例,每个数据库平均有2.25个表,以真实世界数据源、自然问题创作环境和丰富领域知识的数据库文档闻名,有相关统计数据(如8.7% WHERE子句、73.5% VAL等)。
- 中文系列 - CHASE:由西安交通大学和微软等提出,是首个跨领域、多轮Text-to-SQL中文数据集,包含5459个多轮问题组成的列表和17940个<query, SQL>二元组。
- 中文系列 - BIRD-SQL:由香港大学和阿里巴巴提出,是大规模跨域数据集,包含超过12751个独特的问题SQL、95个大数据库,总大小为33.4GB,涵盖37个专业领域。其Mini-Dev版本从11个不同数据库中编译了500个高质量text2SQL对,支持MySQL和PostgreSQL格式。
- 中文系列 - DuSQL:百度针对跨域文本到SQL任务提出的大规模、实用中文数据集,包含200个数据库、813个表和23797个Question-SQL对。
- 中文系列 - TableQA:包含64891个问题和6000多个表的20311个唯一SQL查询。
三、数据处理与理解
- 数据格式差异:不同数据源的数据格式和结构差异较大,但关键在于理解数据集中与查询问题和期望SQL输出相关的部分。如WikiSQL和Spider数据集,虽然结构复杂,但核心是获取用户查询问题和对应的SQL输出,用于大模型微调。
- 数据验证:优质数据集不仅可用于模型训练,还可用于验证。像Spider数据集,通过其数据库文件(如“dev.db”)可验证生成的SQL结果是否正确,且很多数据集基于真实数据标记,具有较高价值。