持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第28天,点击查看活动详情
导语
CoSQL是Text-to-SQL领域的一个对话形式的多轮查询数据集。相比于之前的多轮Text-to-SQL数据集SParC(参考:SParC数据集介绍),CoSQL数据集使用了Wizard-of-Oz的标注方式,数据集更加贴近真实应用场景,也更具挑战性。
CoSQL数据集概述
CoSQL数据集是为实际对话系统应用场景下设计的数据集,虽然 Sparc 数据集已经能够对多轮Text-to-SQL 问题进行一个很好的描述,但是仍然有一些不足之处。 比如一个完整的多轮text-to-sql系统应该能够做到下面几点:
- 检测用户的问题是否可以被系统回答
- 在可能的情况下把用户的问题转换成可以执行的SQL语句。
- 能够给用户一个可以理解和验证的反馈。
比如下面的图,在用户问了一个问题之后,在系统每次产生一个SQL语句之后,都会紧接着产生一个CONFIRM_SQL 类型的回复,告诉用户本次查询做了什么事情,方便用户进行确认。同时在检测到用户的问题不清楚时,会进行一个 CLARIFY 操作,和用户确认其具体需求是什么。
CoSQL 数据集的收集方式和 SParC 类似,都是基于Spider数据集,从Spider 数据集中收集了 medium, hard, extra hard 难度的SQL语句,然后再分别由用户和专家进行不同类型的标注和产生序列问题。
数据集对比
与其他Task-oriented dialog 数据集相比,CoSQL有着丰富的SQL语法元素和广泛的数据库。详细比较如下:
CoSQL 数据集的统计信息如下图所示,相比于Sparc 数据集,CoSQL 数据集每个对话序列的问题数更多,但是总的序列数量更少。 也就是说总体问题的问题更大一些,但是在数据量上并没有明显的优势。
CoSQL 包含的要素比较多,在论文中针对该数据集提出了三个子任务。
任务一:SQL状态跟踪
和Sparc数据集上的任务一样,根据本轮的问题和之前的所有轮次的问题,生成本轮的SQL语句。 采用的baseline和评价指标都和SParC数据集完全一样。从实验结果来看,两个baseline 在 Sparc 数据集上的结果都是更低的, CoSQL 数据集难度更大。
任务二:从SQL和SQL查询结果中生成回复
如下图所示,在每一轮中,都需要对生成的的SQL和查询结果生成一个文字描述给用户进行确认。所以这个任务本质上是一个Text-to-SQL 任务的反向任务,SQL-To-Text,但又不同于SQL-to-Text翻译回问句,这里是翻译成一个描述的陈述句。评价指标为BLUE和人工打分。
任务三:用户对话行为预测
每一轮用户的语句都是代表着不同的行为的,针对用户不同的行为系统也需要去采用不同的回复方式。比如上面的图,用户会有 inform_sql (可以直接产生SQL语句), ambiguous(需要进一步确认才能产生SQL语句) 等。评价指标为分类准确率。分类类别见上图。 三个任务分别的Leaderboard(yale-lily.github.io/cosql) 如下:
任务一 Leaderboard
任务二、三 Leaderboard
整体而言,还是多论的Text-to-SQL任务更受关注,目前在QEM、IEM榜上最好的模型时STAR模型,QEX、IEX榜单上最好的模型时RASAT+PICARD模型。
数据集格式介绍
该数据集的下载链接为Link。
原始文件为zip文件,解压后可以看到由以下几个数据文件和数据库文件夹组成:
其中database文件夹中包含了这200个数据库的内容和schema信息。tables.json则包含了json格式的数据库schema信息。
三个任务的数据文件分布包含在
- sql_state_tracking(任务一)
- system_response_generation(任务二)
- user_intent_prediction(任务三)
SQL State Tracking
SQL State Tracking任务即传统意义上的多轮Text-to-SQL任务。
该文件夹中包括有该任务的训练、验证集文件和验证集的gold SQL组成的txt文本。下面以一个例子展开说明其中的字段:
{
"final": {
"utterance": "How many car models are produced by each maker? List the count and the maker full name.",
"query": "SELECT Count(*) , T2.FullName , T2.id FROM MODEL_LIST AS T1 JOIN CAR_MAKERS AS T2 ON T1.Maker = T2.Id GROUP BY T2.id;"
},
"database_id": "car_1",
"interaction": [
{
"utterance": "How many car models are produced by each maker? List the count and the maker full name.",
"utterance_toks": [
"How",
"many",
……
"."
],
"query": "SELECT Count ( * ) , T2.FullName FROM MODEL_LIST AS T1 JOIN CAR_MAKERS AS T2 ON T1.Maker = T2.Id GROUP BY T2.id",
"query_toks_no_value": [
"select",
"count",
……
"id"
],
"sql": {
"from": {
……
},
"select": [
……
],
"where": [],
"groupBy": [
[
0,
6,
false
]
],
"having": [],
"orderBy": [],
"limit": null,
"intersect": null,
"union": null,
"except": null
}
},
{
"utterance": "Which models are the most popular?",
……
},
{
"utterance": "Which companies have three or more models?",
……
}
]
},
可以看到,其主要数据字段有:
- final:最终交互的目标和对应的SQL语句;
- database_id:所依赖的数据库id;
- interaction:所有轮次的交互信息组成的列表(列表中元素的顺序即为交互历史的顺序),其中每一个元素为一轮次的交互信息,其主要包括:
- utterance:当前轮次的问题
- utterance_toks:当前问题的token列表
- query:当前轮次问题对应的SQL语句
- query_toks_no_value:当前轮次问题对应的SQL语句中不包括value的token列表
- sql:形式化拆解后的SQL语句,即SQL各个子部分如WHERE,SELECT部分的信息
System Response Generation
同样的,该文件夹中包括有该任务的训练、验证集文件和验证集的gold sentence组成的txt文本。下面以一个例子展开说明其中的字段:
{
"database_id": "college_2",
"query": "SELECT avg ( salary ) FROM instructor",
"query_toks": [
"select",
"avg",
"(",
"salary",
")",
"from",
"instructor"
],
"results_raw": [
[
"avg(salary)"
],
[
77600.18819999999
]
],
"response": "The average salary of all the instructors is 77600.18819999999.",
"response_toks": [
"The",
"average",
"salary",
"of",
"all",
"the",
"instructors",
"is",
"77600.18819999999",
"."
],
"results_map": {
"result0": "77600.18819999999"
},
"results_blank_res": "result0 ",
"query_w_results": "SELECT avg ( salary ) FROM instructor | 77600.18819999999 ",
"query_w_results_blank_res": "SELECT avg ( salary ) FROM instructor | result0 ",
"query_toks_w_results": [
"select",
"avg",
"(",
"salary",
")",
"from",
"instructor",
"77600.18819999999"
],
"query_toks_w_results_blank_res": [
"select",
"avg",
"(",
"salary",
")",
"from",
"instructor",
"result0"
],
"response_blank_res": "The average salary of all the instructors is result0 .",
"response_toks_blank_res": [
"The",
"average",
"salary",
"of",
"all",
"the",
"instructors",
"is",
"result0",
"."
]
},
其主要包含如下字段:
- database_id:所依赖的数据库id
- query:当前轮次的SQL语句
- query_toks:当前轮次的SQL语句的token列表
- results_raw:SQL语句执行得到的结果
- response:目标的系统回复
- response_toks:系统回复的token列表
- results_map:Response中填充的结果id映射
- results_blank_res:填充的results列表
- query_w_results:当前轮次的SQL语句(带有value)
- query_w_results_blank_res:当前轮次的SQL语句(不含value)
- query_toks_w_results:当前轮次的SQL语句(带有value)的token列表
- query_toks_w_results_blank_res:当前轮次SQL语句(value使用result代替)
- response_blank_res:使用result填充的回复
- response_toks_blank_res:使用result填充的回复的token列表