SParC数据集介绍

导语

SParC是Text-to-SQL领域的一个多轮查询数据集。本篇博客将对该数据集论文和数据格式进行简要介绍。

SParC数据集概述

SParC是一个跨领域的多轮Text-to-SQL数据集。它包含有4298个问题轮次,大约有12k+的自然语言问句到SQL标注的Question-SQL对。这些问题来自于138个不同领域的200个复杂数据库。

SParC对研究者带来的挑战主要有以下三点:

  1. 这是一个多轮对话形式的Text-to-SQL解析,模型需要考虑复杂的上下文依赖关系;
  2. 由于对话的引入,使得数据集具有更大的语义多样性;
  3. 具有跨域特性,即验证和测试是在与训练集完全不同的数据库schema上进行,因而模型需要有足够强的泛化性能。

如下是一次完整的多轮对话示例。

如上图所示,数据库的简介记为 D 1 D_1 D1,简要介绍了这个数据库的信息,即是一个关于学生宿舍的数据库,包含有5个数据表。而这次交互的目的是 C 1 C_1 C1,即找到住在拥有电视机休息室的宿舍的学生的姓名。为了实现这个目标,一共进行了四次对话。用户的自然语言问句记为 Q Q Q,系统解析后的SQL语句记为 S S S。

下面将详细介绍一下SParC数据集的收集过程。

数据收集

SParC数据集的创建包括四个阶段:

  1. 选择交互目标;
  2. 提出问题;
  3. 进行SQL标注;
  4. 检查回顾。

选择交互目标

为了确保问题序列的主题相关性,SParC使用了Spider数据集(之前的一个单轮Text-to-SQL数据集)中的一些问题作为参考而制定了交互目标。每一系列问题都是围绕着这个最终的交互目标进行。这里SParC使用了Spider数据集中的中等、困难和非常困难的问题作为参考。并在交互过程中为了确保问题的多样性而添加了一些简单的问题。经过选择后,一共在200个数据库上制定了4437个交互目标。

提出问题

SParC共邀请了15个SQL经验的大学生来进行提问和标注。每个系列中的相邻问题之间有着如下四种主题关联:

  1. 约束更加细化:当前的问句和上一个问句相比,问了一个相同类型的实体但是有着不同的约束。比如,前一个问题问:"哪一个专业的学生人最少?;而当前的问题问:"那最受欢迎的专业呢?"
  2. 主题扩展:当前的问句询问上一个问句的同一个实体的另外的属性。例如,前一个问句问:"Anonymous Donor Hall的容量是多少?";而当前的问句问:"列出它所有的设施。"
  3. 属性转移:当前的问句询问另一个实体的相同属性。例如,前一个问句问:"告诉我那部叫做Double Down的电视剧的评分。";而当前的问题则是:"那Keepers(这部电视剧)呢?"
  4. 答案更加细化:当前的问句徐闻上一个问题的答案给出的实体中的某些子集的其他属性。例如,前一个问题是:"请列出所有不同的部门名称。";而现在的问句是"在统计部门的所有员工的平均薪资是多少?"

SQL标注

在进行完提问后,每个标注者都将对自己的问题进行SQL转化,并确保在相应数据库上执行得到正确的答案。

检查

最后,由英语为母语的标注者将问题进行检查,确保没有语法错误。

数据集统计和分析

SParC数据集的统计特性如下图,相比于ATIS(一个古老的用于航班订票的单数据库Text-to-SQL数据集)。SParC拥有更多的数据库和数据表,同时规模也更大。

同时,SParC对于SQL中的各种高级语法结构的使用也更加丰富。如下图所示,对于像ORDER,HAVING,SET,GROUP等SQL结构,ATIS几乎很少或者并不存在这样的结构。

数据集划分

SParC数据集的划分与SPider数据集保持了一致,即140个数据库训练,20个数据库验证,40个数据库进行测试。其数据规模见下图。

数据集格式介绍

该数据集的下载链接为Link

原始文件为zip文件,解压后可以看到由以下几个数据文件和数据库文件夹组成:

其中database文件夹中包含了这200个数据库的内容和schema信息。tables.json则包含了json格式的数据库schema信息。

这里以train.json中的第一个交互为例,分析样例数据。

json 复制代码
    {
        "database_id": "hospital_1", 
        "interaction": [
            {
                "query": "SELECT count(departmentID) FROM department GROUP BY departmentID", 
                "utterance_toks": [
                    "What", 
                    "is", 
                    "the", 
                    "number", 
                    "of", 
                    "employees", 
                    "in", 
                    "each", 
                    "department", 
                    "?"
                ], 
                "utterance": "What is the number of employees in each department?", 
                "sql": {
                    "orderBy": [], 
                    "from": {
                        "table_units": [
                            [
                                "table_unit", 
                                1
                            ]
                        ], 
                        "conds": []
                    }, 
                    "union": null, 
                    "except": null, 
                    "groupBy": [
                        [
                            0, 
                            5, 
                            false
                        ]
                    ], 
                    "limit": null, 
                    "intersect": null, 
                    "where": [], 
                    "having": [], 
                    "select": [
                        false, 
                        [
                            [
                                3, 
                                [
                                    0, 
                                    [
                                        0, 
                                        5, 
                                        false
                                    ], 
                                    null
                                ]
                            ]
                        ]
                    ]
                }
            }, 
            {
                "query": "SELECT name FROM department GROUP BY departmentID ORDER BY count(departmentID) DESC LIMIT 1;", 
                "utterance_toks": [
                    "Which", 
                    "department", 
                    "has", 
                    "the", 
                    "most", 
                    "employees", 
                    "?", 
                    "Give", 
                    "me", 
                    "the", 
                    "department", 
                    "name", 
                    "."
                ], 
                "utterance": "Which department has the most employees? Give me the department name.", 
                "sql": {
                    "orderBy": [
                        "desc", 
                        [
                            [
                                0, 
                                [
                                    3, 
                                    5, 
                                    false
                                ], 
                                null
                            ]
                        ]
                    ], 
                    "from": {
                        "table_units": [
                            [
                                "table_unit", 
                                1
                            ]
                        ], 
                        "conds": []
                    }, 
                    "union": null, 
                    "except": null, 
                    "groupBy": [
                        [
                            0, 
                            5, 
                            false
                        ]
                    ], 
                    "limit": 1, 
                    "intersect": null, 
                    "where": [], 
                    "having": [], 
                    "select": [
                        false, 
                        [
                            [
                                0, 
                                [
                                    0, 
                                    [
                                        0, 
                                        6, 
                                        false
                                    ], 
                                    null
                                ]
                            ]
                        ]
                    ]
                }
            }
        ], 
        "final": {
            "query": "SELECT name FROM department GROUP BY departmentID ORDER BY count(departmentID) DESC LIMIT 1;", 
            "utterance": "Find the department with the most employees."
        }
    }, 

这里首先声明了它所依赖的数据库是"hospital_1",本次交互一共有2轮对话,第一轮对话为:"What is the number of employees in each department?",然后第二轮对话为:"Find the department with the most employees."。最后的"final"字段声明了最后一轮也就是整个交互的最终目标。其中关于SQL语句的token和各种成分的关系则与Spider相同,详细可以参考这篇博客Spider数据集格式介绍

dev.json则是和train.json同样的格式。

另一个dev_gold.txt则是用于评价最终结果时所使用。

相关推荐
风铃喵游39 分钟前
让大模型调用MCP服务变得超级简单
前端·人工智能
旷世奇才李先生42 分钟前
Pillow 安装使用教程
深度学习·microsoft·pillow
booooooty1 小时前
基于Spring AI Alibaba的多智能体RAG应用
java·人工智能·spring·多智能体·rag·spring ai·ai alibaba
PyAIExplorer1 小时前
基于 OpenCV 的图像 ROI 切割实现
人工智能·opencv·计算机视觉
风口猪炒股指标1 小时前
技术分析、超短线打板模式与情绪周期理论,在市场共识的形成、分歧、瓦解过程中缘起性空的理解
人工智能·博弈论·群体博弈·人生哲学·自我引导觉醒
ai_xiaogui2 小时前
一键部署AI工具!用AIStarter快速安装ComfyUI与Stable Diffusion
人工智能·stable diffusion·部署ai工具·ai应用市场教程·sd快速部署·comfyui一键安装
聚客AI3 小时前
Embedding进化论:从Word2Vec到OpenAI三代模型技术跃迁
人工智能·llm·掘金·日新计划
weixin_387545643 小时前
深入解析 AI Gateway:新一代智能流量控制中枢
人工智能·gateway
聽雨2373 小时前
03每日简报20250705
人工智能·社交电子·娱乐·传媒·媒体
二川bro4 小时前
飞算智造JavaAI:智能编程革命——AI重构Java开发新范式
java·人工智能·重构