2022 - Recent Advances in Text-to-SQL: A Survey of What We Have and What We Expect
文本到SQL的最新进展,包括数据集(第2节)和方法(第3节)。
https://arxiv.org/abs/2208.10099v1
Spider: 一个跨域的复杂 text2sql 数据集,包含了 10,181 条自然语言问句、分布在200 个独立数据库中的 5,693 条 SQL,内容覆盖了 138 个不同的领域。
WikiSQL: 一个大型的语义解析数据集,由 80,654 个自然语句表述和 24,241 张表格的 sql 标注构成。WikiSQL 中每一个问句的查询范围仅限于同一张表,不包含排序、分组、子查询等复杂操作。
CHASE: 一个跨领域多轮交互 text2sql 中文数据集,包含 5459 个多轮问题组成的列表,一共 17,940 个
更多参考https://github.com/eosphoros-ai/Awesome-Text2SQL/blob/main/README.zh.md
大型跨领域数据集(如WikiSQL和Spider)旨在更好地评估深度神经模型。WikiSQL使用从维基百科提取的表格,并让标注人员重述生成的问题,相比其他数据集,WikiSQL规模更大,总共包含80,654个自然表达式。然而,WikiSQL只包含简单的SQL查询,并且每个SQL查询仅查询一个表。
Spider包含200个数据库,每个数据库平均有5个表格,以测试模型在复杂的未见过的SQL查询上的性能以及其在新领域的泛化能力。此外,研究人员还扩展了Spider以研究他们感兴趣的各种问题。
此外,研究人员还在不同语言中构建了几个大规模的文本到SQL数据集,如CSpider(中文)、TableQA(中文)、DuSQL(中文)、ViText2SQL(越南文)和PortugueseSpider(葡萄牙文)。鉴于人工翻译比机器翻译更准确,这些数据集主要由人工专家根据英语Spider数据集进行注释,可以作为多语言文本到SQL研究的潜在资源。
在文本转SQL的研究中,广泛采用了数据增强方法。数据增强可以帮助文本转SQL模型处理复杂或未见过的问题,同时也可以在少量监督数据的情况下达到最先进的效果,并且对不同类型的问题具有鲁棒性。常见的数据增强技术包括改写问题和填充预定义模板以增加数据的多样性。
数据增强的质量对模型的性能至关重要,低质量的数据可能会影响模型的表现。为了提高数据增强的质量,研究人员采用了各种方法。例如,可以使用自然语言生成模型生成自然语言表述,然后使用语义解析器将生成的自然语言转换为SQL查询。还可以使用分层的SQL-to-question生成过程来获取高质量的数据。为了增加数据的多样性,可以在SQL-to-text模型中引入潜变量来鼓励问题的多样性。还可以通过简化和压缩问题来模拟终端用户的会话式查询行为。
在SQL查询方面的复杂性上,模型在较短的SQL查询上的表现要优于较长的SQL查询,这表明一般而言较短的SQL查询更容易。
在自然语言表达的复杂性方面,没有定量的衡量指标来衡量表达的难度。直观上,当面对用户提出的更长问题时,模型的性能可能会下降。然而,较长的句子中所传达的信息可能更完整,而较短的句子可能存在歧义。此外,无论是在短句还是长句中,都可能存在使模型困惑的领域特定短语
2022 - A Survey on Text-to-SQL Parsing: Concepts, Methods, and Future Directions
Text-to-SQL解析的概念、方法和未来方向。
https://arxiv.org/abs/2208.13629
用于评估单轮T2S设置的评估指标有两种,即准确匹配率(EM)和执行准确率(EX)。对于多轮T2S设置,常用的评估指标是问题匹配率(QM)和交互匹配率(IM)
2.2.1 单轮T2S评估
准确匹配率(EM)(不包括值)通过比较真实的SQL查询和预测的SQL查询来计算。真实和预测的查询都被解析成具有以下SQL子句的规范化数据结构:SELECT • GROUP BY • WHERE • ORDER BY • 关键字(包括所有SQL关键字,但不包括列名和运算符)。
当且仅当预测的查询的所有SQL子句均正确时,才将预测的SQL查询视为正确。
执行准确率(EX)(包括值)通过比较在测试集中随附的数据库内容上执行的真实SQL查询和预测的SQL查询的输出结果来计算。我们只有在执行的预测SQL查询ˆV和真实的SQL查询V的结果相同时,才将预测的查询视为正确。
为了避免在有限大小的数据库上执行SQL时产生误报和漏报,测试套件的执行准确性扩展到每个模式的多个数据库实例。具体来说,测试套件从随机生成的数据库中提炼出一个小型数据库,以实现高代码覆盖率。通过这种方式,我们可以提供语义准确性的最佳近似。 举个例子来理解这个过程:假设我们的目标是测试一个用于管理学生信息的数据库系统,其中包含学生的姓名、年龄和所在班级等信息。为了测试这个系统的准确性,我们需要执行一系列的SQL查询,例如查询年龄大于18岁的学生。由于数据库的大小有限,我们无法覆盖所有可能的查询条件和情况。 为了解决这个问题,测试套件会生成多个随机的数据库实例,每个数据库实例包含不同的学生数据。然后,测试套件会从这些数据库实例中提取一部分数据,创建一个小型的测试数据库。这个小型数据库包含了不同的学生年龄、班级和其他信息,以覆盖尽可能多的查询情况。 通过这种方法,测试套件可以提供更准确的测试结果,避免了由于数据库大小有限而导致的误报和漏报情况。这样,我们可以更好地评估数据库系统的语义准确性。
2.2.2 多轮T2S评估
在多轮设置中,共有P个问题序列,每个序列包含O个回合,总共有M = P × O个问题。
问题匹配率(QM)问题匹配率是基于所有问题的EM分数来计算的。仅当所有预测的SQL子句都正确时,每个问题的值才为1。我们首先计算每个问题的EM分数如下:
然后计算QM:
相互匹配率(IM)相互匹配率是基于所有交互(问题序列)的EM分数来计算的。每个交互的分数仅当交互中的所有问题都正确时为1。
一种典型的神经文本到SQL方法通常基于序列到序列(Seq2Seq)模型,其中一个编码器用于捕捉自然语言问题的语义,生成一个实值向量,一个解码器基于编码的问题表示逐个生成SQL查询标记。根据编码器和解码器的不同,将下游的文本到SQL解析方法分为几个主要的类别。论文详细描述了每个类别的文本到SQL解析方法。 编码器的第一个目标是学习输入表示,同时表示自然语言问题和表模式。编码器的第二个目标是进行结构建模,因为文本到SQL解析任务在原则上是一个高度结构化的任务。 输入表示学习方法可以分为基于LSTM的方法和基于Transformer的方法。基于LSTM的方法在学习上下文化的自然语言问题和表模式表示方面取得了显著的成功。基于Transformer的方法在自然语言处理任务中取得了最先进的性能。 结构建模任务要求将自然语言问题和表模式编码为具有强大表达能力的表示。为了解决这个挑战,图形方法最适合表达文本到SQL解析任务中的复杂结构。最近提出了一些基于图的方法来推理自然语言问题和模式实体,并模型化复杂的输入表示。这些方法将自然语言问题令牌和模式项视为多类型节点,并且节点之间的结构关系(边)可以预先定义以表达不同的模式内关系、问题-模式关系和问题内关系。
预训练语言模型( PLMs )已被证明在增强文本到SQL的解析方面具有强大的能力,并产生了令人印象深刻的性能,这得益于大规模语料库中丰富的知识。
预训练数据构建时的自然语言问句标注
基于采样的方法:这类方法通过从现有的文本-表格对中进行采样来生成自然语言问题。它们可以从维基百科等大规模文本资源中提取文本-表格对,并使用这些对来生成问题。采样方法可以通过随机选择表格和从中提取信息来构造问题。这种方法的优点是可以利用现成的数据资源,但可能存在数据偏差和噪音。
基于模板的方法:这类方法使用预定义的模板或规则来生成自然语言问题。它们可以根据表格的结构和内容,以及SQL操作和数据库模式的实体提及来构建问题-SQL模板。通过应用这些模板,可以自动生成大量的问题-SQL对。这种方法的优点是可以根据特定的规则和模板生成问题,但可能受限于模板的多样性和灵活性。
基于生成的方法:这类方法使用文本生成模型根据输入的实体序列生成自然语言问题。它们可以使用跨领域的神经模型,根据表格模式和实体序列生成问题。另外,一些方法使用生成模型,如T5模型和BART模型,根据逻辑形式生成自然语言问题。这种方法的优点是可以根据输入的实体序列生成灵活多样的问题。
在Text-to-SQL任务中,SQL注释的应用可以帮助生成更准确和多样化的SQL查询。SQL注释方法:
逻辑扰动:逻辑扰动方法通过按照手动调整的规则对SQL查询进行随机逻辑扰动,从而增加SQL查询的数量。具体而言,逻辑扰动方法根据手动调整的规则对给定的SQL查询进行扰动,包括逻辑移位(生成与原始查询逻辑上不同的问题和逻辑形式)、短语和数字变化(修改逻辑形式中指定的数值和短语)以及实体插入、交换和删除(忽略逻辑形式中的实体提及,插入新的实体或交换逻辑形式中的任意两个实体)。通过对逻辑形式进行扰动,可以自动生成更多的SQL查询。逻辑形式的结构规律使得逻辑扰动的过程可控,扰动后的逻辑形式可以通过语法检查器和解析器进行验证,而且可以在给定原始问题-SQL对的情况下,通过轻微修改来获得生成的SQL查询的相应问题。
SQL模板实例化:SQL模板实例化方法使用现有的模板或自定义的同步上下文无关文法(SCFG)来自动生成SQL查询。这类方法根据给定的SQL模板,选择表格的标题和单元格值来填充模板。例如,一些研究使用SUQALL数据集中定义的SQL语法的产生规则进行SQL注释,而GAZP则通过SQL语法和类型化插槽替换来创建粗略模板,并通过新的数据库内容填充模板。GRAPPA则根据Spider中的示例学习,并设计了一个新的SCFG,然后应用于大量现有的表格以生成新的SQL查询。SQL模板实例化方法通常依赖于有限的模板,难以生成具有新组合的多样化SQL查询。
分层合成流水线:分层合成流水线方法与基于手工规则和模板合成新SQL查询的方法不同,它们基于大规模预训练的语言模型(PLMs)。这类方法使用预训练的文本生成模型(如T5),将从表格模式中采样的实体序列映射到自然语言问题,然后应用学习到的语义解析器将生成的自然语言问题转化为相应的SQL查询。这种分层合成流水线方法易于实现,并且由于使用了大规模的PLMs,能够获得多样性和覆盖范围广的数据合成。
编码
文本数据编码
文本编码可以根据自然语言处理中的单词编码分为动态和静态类型。一些方法使用GloVe [89](embedding)来初始化每个输入项的单词嵌入,通过查找嵌入字典来进行编码,例如RATSQL [12]和LGESQL [14]。然而,静态嵌入方法仍然存在一些限制。静态方法都无法解决多义问题,并且学到的特征受到预定义窗口大小的限制。随着预训练语言模型的发展,一些研究尝试使用预训练的BERT [11]作为编码器来对文本数据进行编码,获得上下文感知的单词级表示。其中,许多方法(例如TABERT [18]、TAPAS [19]、MATE [90]、STRUG [83])使用预训练的BERT [11]作为编码器,并在训练过程中更新BERT [11]的参数。GRAPPA [20]使用ROBERTA [51]作为编码器。TAPEX [88]同时利用BART [91]的编码器和解码器,而GAP [92]仅使用BART的编码器。
表格数据编码
与文本数据不同,表格数据以二维结构分布。在表格预训练方法中,需要先将二维表格数据转换为线性化的一维序列输入,然后将表格数据输入到语言模型中。常见的序列化方法是以逐行方式将表格数据展开为一系列标记的序列,然后将问题标记与表格标记连接起来进行表格预训练,例如TAPAS [19]、MATE [90]和TABLEFORMER [93]。TABERT [18]提出了内容快照来编码与输入话语最相关的表格内容子集。该策略与垂直注意机制相结合,共享不同行中单元格表示之间的信息。还有一些研究(例如STRUG [83]、GRAPPA [20]和UnifiedSKG [94])仅将表格的标题作为输入,而不考虑数据单元格。虽然NLP模型通常将一维序列作为输入,但对于表格数据来说,位置编码对于帮助神经模型更好地捕捉结构信息至关重要。大多数先前的预训练方法(如TABERT [18]、GRAPPA [20]和TAPEX [88])在展开的表格序列上探索了全局位置编码策略。然而,除了一维的顺序位置,表格还具有由关键的二维和层次信息组成的结构化列和行。TAPAS [19]和MATE [90]等工作根据列/行ID编码行和列内容。TABLEFORMER [93]根据单元格是否属于同一列/行和列标题来决定,而不考虑表格中列和行的绝对顺序信息。
在文本到SQL解析的预训练中,有几种主要的预训练目标。
遮蔽语言模型(Masked Language Modeling, MLM):采用不同变体的MLM来引导语言模型学习自然语言和表格数据的表示。主要包括恢复损坏的自然语言句子、恢复损坏的表格标题或单元格值,以及恢复损坏的自然语言句子和表格中的标记。预训练模型通过随机遮蔽一部分输入标记,然后预测被遮蔽的标记,并通过最小化原始遮蔽标记和预测遮蔽标记之间的交叉熵损失来计算MLM损失。
模式链接(Schema Linking):模式链接是文本到SQL解析中的关键组成部分,用于学习NL问题和给定表格之间的对齐关系。模式链接旨在识别NL问题中的列、表和条件值的引用。预训练目标通过学习NL问题和表格之间的相关性来建模模式链接信息。其中一些目标包括预测列名是否出现在SQL查询中,预测在给定列上应该执行的操作,以及对齐NL问题中的标记和表格中的列。
SQL执行器(SQL Executor):SQL执行器模拟了对结构化表格执行SQL查询的过程。在预训练中,通过训练神经模型来执行SQL查询并输出正确结果,以使模型对SQL查询和表格有深入的理解。
SQL生成(SQL Generation):将NL问题翻译为可以在给定表格上执行的SQL查询是文本到SQL解析的目标之一。预训练中的SQL生成目标旨在生成特定位置的SQL关键字或列名,而不仅仅是预测列是否被提及。
上下文建模(Context Modeling):上下文建模是针对上下文相关的文本到SQL解析的预训练方法。其中一个代表性的预训练方法设计了一个转换上下文开关(Turn Contextual Switch, TCS)目标,通过预测两个连续用户发言之间的上下文切换标签来建模上下文流。这有助于模型理解上下文之间的复杂交互。
2023.08 - Text-to-SQL Empowered by Large Language Models: A Benchmark Evaluation
阿里团队名为DAIL-SQL的新的综合解决方案。使用开源LLM对比OpenAI LLM。文档比较了几种prompt engineering方法,探索高效的提示工程。提出了一种新的Text - to - SQL提示工程方法,命名为DAIL - SQL,该方法以86.6 %的执行准确率刷新了Spider排行榜中的最佳性能。
https://arxiv.org/abs/2308.15363
具体而言,DAIL 首先在目标问题和候选集合Q中的示例问题中屏蔽领域特定词汇。然后,它根据屏蔽后的和的嵌入之间的欧氏距离对候选示例进行排名。同时,它计算了预测的SQL查询′和Q中的之间的查询相似度。最后,选择准则根据问题相似度对排序后的候选项进行优先级排序,其中查询相似度大于预定义阈值。通过这种方式,选择出的前个示例在问题和查询方面具有良好的相似性。DAIL - SQL使用CR P(listing4)作为问句表示,从问句和查询中根据信息选择示例,并将它们组织起来,以保持问句到SQL的映射
比较三个LLMs(Language Model as an SQL Query Translator)的平均性能
看起来openai案例在自家模型都表现不错,在text-davinci上效果和CRp差不多
它们在zero-shot场景中更具优势
外键信息对LLMs的执行准确性有显著提升
在llama和llama2中ASp(listing4)和CRp(listing5)表现不错
CR 下,对于GPT和Textdavinci均有提升
与OpenAI LLM不同的是,经过微调的LLMs无法从上下文示例中学习。经过微调的LLMs不能从示例中学习,并且添加更多示例也没有帮助。这可能是因为LLM过度拟合了zero-shot提示,导致示例无用。
目前 T2S 的做法大致分为两种,
一种是用现有的大模型来直接生成,例如 ChatGPT、GPT-4 模型,但是对于一些公司来说,数据是属于保密资产,这种方式相当于将自己公司的数据信息透漏给大模型,属于数据泄露行为
另一种方式是利用开源的大模型做 finetune,比如 codellama 来做微调,这个也是目前我们在做的
我们在 Text2SQL 上面的应用主要包括两个阶段,第一阶段是利用 LLM 理解请求,通过请求去生成结构化的 SQL;下一个阶段是在生成的 SQL 上自动化的查询数据库,返回结果,然后利用 LLM 对结果生成总结,提供分析。
db-gpt的prompt
支持qlora&lora官方案例在CodeLlama-13b-Instruct-hf上达到78.9执行准确率,https://github.com/eosphoros-ai/DB-GPT-Hub
db-gpt-hub生成的训练数据⬇️
官方的实验环境tips:基于一台带有 A100(40G) 的显卡服务器,总训练时长 12h 左右。如果你的机器资源不够,可以优先考虑缩小参数
gradient_accumulation_steps
的取值,另外可以考虑用 QLoRA 的方式微调(训练脚本dbgpt_hub/scripts/train_sft.sh
中增加--quantization_bit 4
),从我们的经验看,QLoRA 在 8 个 epoch 时和 LoRA 微调的结果相差不大。
1 Train
"current_steps": 1850, "total_steps": 4328, "loss": 0.0251
"loss": 0.0195, "step": 2000
2 Predict
3 Evaluation
500轮
2000轮
构建数据信息表的 schema,利用 LLM 生成 embedding
我们根据用户描述的 text,让预训练的 codellama 生成 embedding,通过 embedding 检索的方式,选出 top1 数据表,这个过程属于先验过滤阶段。
数据表的 schema 设计非常重要,需要描述清楚这个表它的主体信息以及表中重要字段和字段含义。
prompt 构建,生成 SQL
这部分我认为最重要的还是如何去合理构建 prompt,让 LLM 去理解你的真实意图,生成标准的 SQL。
一是 prompt 的开头需要定义构建,二是 prompt 整体结构以及结构中数据表的信息也需要涵盖进去,这里我们 prompt 的开头首先定义 LLM 的工作目的是生成 SQL,通过我们根据第一部分返回的 top1 数据表,解析数据表中的信息,加入到 prompt 中,以此来构建完成的 prompt。
1)开头 prompt 定义:
2)数据表 prompt 定义:
3)In-context-prompt:如果想强化 prompt,可以增加一些正样本 “问答” 式的结构,让 LLM 去学习理解,最终生成更理想的结果
prompt 的构建对最终结果的影响非常重要,构建一个完美的 prompt 可能已经成功了一半。
通过以上的 prompt 构建,我们就可以给 LLM 让模型生成最终的 SQL 结果。