XiYan-SQL:一种基于多生成器集成策略的NL2SQL框架

19
0
0
2025-03-17

XiYan-SQL:一种基于多生成器集成策略的NL2SQL框架

摘要

为了应对大型语言模型(LLM)在自然语言到SQL任务中的性能挑战,我们提出了XiYan-SQL,这是一个采用多生成器集成策略的创新框架,旨在提升候选查询的生成质量。我们还引入了M-Schema,这是一种半结构化的模式表示方法,旨在增强对数据库结构的理解。为了提高生成候选SQL查询的质量和多样性,XiYan-SQL将上下文学习(ICL)的巨大潜力与监督微调的精确控制相结合。一方面,我们提出了一系列训练策略,通过微调模型生成高质量且具有多样化偏好的候选查询;另一方面,我们通过基于命名实体识别的示例选择方法实现了ICL方法,以避免对实体的过度关注。此外,优化器通过纠正逻辑或语法错误来优化每个候选查询。为了应对识别最佳候选查询的挑战,我们微调了一个选择模型,以区分候选SQL查询之间的细微差别。在多个方言数据集上的实验结果表明,XiYan-SQL在不同场景下具有强大的鲁棒性。总体而言,我们提出的XiYan-SQL在Bird基准测试中达到了75.63%的执行准确率,在Spider测试集上达到了89.65%,在SQL-Eval上达到了69.86%,在NL2GQL上达到了41.20%。该框架不仅提高了SQL查询的质量和多样性,还优于以往的方法。

关键词:大型语言模型(LLM)、文本到SQL、自然语言到SQL(NL2SQL)


1. 引言

通过自然语言到SQL(NL2SQL)技术将自然语言查询转换为结构化查询语言(SQL),是使复杂数据集更易于访问的重要进步。它极大地帮助了非专业人士和高级用户从庞大的数据存储库中提取有价值的信息。近年来,大型语言模型(LLMs)的发展显著提升了NL2SQL应用的效率和准确性。

基于LLM的NL2SQL解决方案通常有两种方法:提示工程(Prompt Engineering)和监督微调(Supervised Fine-Tuning, SFT)。提示工程通过优化提示来利用模型的内在能力,从而生成多样化的SQL查询。这种方法在使用零样本(zero-shot)或少样本提示(few-shot prompting)的NL2SQL任务中展现了良好的效果。这种类型的解决方案通常使用参数量巨大的闭源模型,例如GPT-4和Gemini 1.5,这些模型具有显著的潜力和强大的泛化能力。然而,大多数方法依赖于多路径生成,并通过自一致性(self-consistency)选择最佳选项,这导致了显著的推理开销。基于SFT的方法则试图在NL2SQL任务上微调参数量更小的模型,以生成更具可控性的SQL查询,例如CodeS。然而,由于参数量有限,这些方法在处理复杂的NL2SQL推理以及迁移到新领域数据库时面临挑战。

在本技术报告中,我们提出了XiYan-SQL,这是一个采用多生成器集成策略的新型NL2SQL框架,旨在增强候选查询的生成质量。XiYan-SQL结合了提示工程和SFT方法,以生成高质量和多样化的候选SQL查询。为了提升生成质量,我们利用SFT的高可控性,并采用多种训练策略对模型进行专门的微调,以生成具有不同偏好的候选查询。我们引入了一种两阶段多任务训练方法:首先激活模型的基本SQL生成能力,然后过渡到具有增强语义理解和多样化风格偏好的模型。为了提升生成候选的多样性和生成复杂SQL查询的能力,我们利用上下文学习(in-context learning)来提示LLM。我们提出通过用通用特殊标记掩盖命名实体来提取问题的骨架,并利用骨架相似性选择和组织有用的示例。随后,每个生成器后面都配备了一个优化器,根据执行结果或错误信息纠正逻辑或语法错误。最后,需要一个选择器来挑选最佳选项。现有的大多数工作依赖于自一致性,但最一致的结果并不总是正确的。因此,我们提出对模型进行微调,使其能够理解并识别候选查询之间的细微差别,并选择最终响应。

此外,为了增强LLM对数据库模式的理解,我们提出了一种新的模式表示方法——M-Schema。受MAC-SQL Schema的启发,M-Schema以半结构化的形式呈现数据库、表和列之间的层次结构。我们对MAC-SQL Schema进行了改进,增加了数据类型,使其更加紧凑和清晰。我们通过实验比较了不同模式表示方法对NL2SQL性能的影响。与DDL Schema和MAC-SQL Schema相比,使用M-Schema的LLM在性能上表现出显著优势。


2. 总体框架

本节介绍了所提出的XiYan-SQL框架,该框架由三个主要组件构成:1)模式链接(Schema Linking);2)候选生成(Candidate Generation);3)候选选择(Candidate Selection)。模式链接用于从大型数据库模式中选择相关列并检索值,帮助减少无关信息并聚焦于相关数据。随后,这些上下文信息被组织成M-Schema并输入到候选生成模块中,以生成潜在的候选SQL查询。这些候选查询通过自我优化过程进行精炼。最终,候选选择代理比较所有候选查询以确定最终的SQL查询。这一流程如图1所示。


3. M-Schema

为了让大型语言模型(LLM)理解数据库结构,需要在提示中提供数据库模式。我们提出了一种名为M-Schema的新颖表示方法。M-Schema以半结构化的形式展示了数据库、表和列之间的层次关系,并使用特定的标记进行标识:“【DB_ID】”用于标记数据库,“# Table”表示表,“【Foreign Keys】”表示外键。对于每个表,我们提供表名和描述(表描述可以省略)。表中的信息被转换为一个列表,其中每个条目是一个元组,表示列的详细信息。每一列包括列名、数据类型、列描述、主键标识符和示例值。此外,由于外键的重要性,也需要列出外键。

图2展示了使用DDL Schema、MAC-SQLSchema和M-Schema表示数据库的示例。数据定义语言(DDL)模式是最常用的表示方法。然而,它缺乏必要的表和列描述,以及示例值。因此,LLM在区分相似列时会遇到困难。M-Schema源自于MAC-SQL Schema,是一种更紧凑的表示方法。它与MAC-SQL Schema的主要区别在于列的表示,具体如下:

  • 数据类型:数据类型确保数据的正确结构和操作。MAC-SQL Schema缺乏数据类型规范,这可能导致生成的SQL查询在执行时出现错误结果。

  • 主键标记:我们增加了主键标记,以维护关系型数据库中表之间的关系。

  • 列描述:在MAC-SQL模式中,列描述是从列名派生的,而M-Schema通过连接数据库获取更详细的描述。

  • 值示例:我们将“值示例”标记简化为“Examples”,以减少冗余。我们还为值建立了新的显示规则,例如字符串长度和示例数量。

此外,我们还移除了MAC-SQL Schema中每列表示的前导空格。我们已经在GitHub上发布了如何连接数据库引擎并构建M-Schema表示的代码,并支持MySQL和PostgreSQL等常用数据库。


4. 模式链接(Schema Linking)

模式链接的作用是将自然语言查询中的引用与数据库模式中的元素(包括表、列和值)连接起来。我们的模式链接流程由两个模块组成:检索模块和列选择器。

4.1 检索模块

为了在数据库中搜索相似的值和列。首先,我们通过少量样本(few-shot)提示模型来识别问题中的关键词和实体。随后,我们使用列检索器来检索相关的列。基于关键词与列描述之间的语义相似性,我们为每个关键词检索出排名前k的列。为了提高效率,值检索器采用了基于局部敏感哈希(Locality Sensitive Hashing, LSH)和语义相似性的两阶段检索策略,以识别数据库中的相似值。最终选择的模式是列检索器和值检索器结果的并集。

4.2 列选择器

列选择器的目标是将表和列减少到生成SQL所需的最小化模式。在上一步中检索到的模式被组织成M-Schema并呈现给语言模型。然后,我们采用少量样本的方式提示语言模型评估每一列与用户查询的相关性,仅选择那些必要的列。



5. 候选生成

在候选生成阶段,我们使用多种生成器来生成高质量且多样化的SQL候选查询。一方面,我们采用了一系列训练策略来专门微调生成模型,目标是生成具有多样化语法风格的高精度SQL候选查询。另一方面,我们还引入了上下文学习(ICL)方法来增强SQL候选查询的多样性。我们的优化器(Refiner)进一步改进了生成的SQL查询。在以下部分中,我们将对每个模块进行简要介绍。

5.1 微调SQL生成器

微调SQL生成器的核心目标是生成高精度和多样化的SQL候选查询。为此,我们利用了微调模型在特定任务上的高度可控性,构建了一系列具有不同偏好的高精度模型。如图3所示,我们采用两阶段多任务训练方法对模型进行微调,包括基础语法训练和生成增强训练。通过这种训练方法,我们管道的中间和最终结果是一组具有各自优势的模型。

基础语法训练

基础语法训练专注于使用基本的单条SQL模式和语法对预训练模型进行微调。在这个阶段,用于训练的数据是与SQL方言无关的,涵盖了非常全面的基础语法,总共包含数万个样本。训练目标是开发一个基础模型,激活其SQL生成能力,并将其作为过渡到不同专业SQL任务的起点。

生成增强训练

在第一阶段训练完成后,我们转向生成增强训练,旨在增强模型对语义和语法样式的理解能力。在这个阶段,我们可以结合多种多任务数据和语法偏好数据来获得一个增强型模型。模型可以从多任务数据中受益,更好地理解问题与SQL查询之间的映射关系。具体来说,除了将问题转换为SQL查询的标准任务外,我们还设计了一个从SQL查询转换为问题的任务,其目标是基于提供的上下文信息和SQL查询推断出潜在的问题。我们还定义了一个从SQL查询到证据的任务,旨在根据上下文和SQL查询从一组候选中选择最相关的证据。此外,我们还引入了SQL查询的判别和再生任务,这些任务旨在根据执行反馈对SQL查询进行优化,以及其他相关任务。这一系列专业任务有效地增强了SQL查询与上下文信息之间的联系,从而提高了整体生成能力。模型可以从各种样式的模式和语法特征中受益,从而更好地生成多样化的SQL候选查询。我们利用不同的大型语言模型(LLM)以多种方式重新表述原始查询,而不改变其原始含义。这种方法有效地将样本数据扩展到不同的语法风格中,从而使模型在训练阶段能够从这种数据形式中学习。

由于SQL查询存在多种方言,我们可以在这一阶段分别处理每种方言,按照定义的管道进行操作。随后,我们可以选择为每种方言单独训练一个模型,或者联合训练一个多方言模型。在实际应用中,我们可以通过选择多任务数据和偏好数据的子集来微调目标模型,从而生成高质量的SQL候选查询。

5.2 ICL SQL生成器

基于上下文学习(ICL)的NL2SQL生成性能不仅取决于模型的内在能力,还取决于提供的示例。已有多种方法被提出用于检索有用的示例,例如掩码问题相似性(masked question similarity)和查询相似性(query similarity)。尽管掩码问题相似性排除了表名和列名的影响,但它仍然对实体敏感。基于查询相似性的方法需要一个初步模型来生成近似的SQL查询,因此初步模型的能力直接影响最终结果。

XiYan-SQL采用了一种基于用户问题和训练集中问题之间的骨架相似性的示例选择策略。首先使用NLTK的工具识别问题中的所有命名实体,然后将同一类型的命名实体替换为特殊标记。例如,“China”和“America”都被识别为国家,因此它们都被替换为“<country>”。其他实体(如枚举值)则被替换为列名。这种方法避免了对实体的过度关注,同时保留了实体的语义。随后,我们计算训练集和测试集中修改后问题的嵌入向量,并选择与目标问题最匹配的训练集中的前K个示例。

此外,我们注意到,仅操作单个表的SQL示例对于涉及多个表的SQL生成帮助有限。在选择SQL示例时,对于通过模式链接选择了两个或多个表的问题,我们只选择涉及多个表操作的SQL查询。根据表的数量和相似性阈值,每个问题最多使用5个示例。

对于Bird和Spider等基准测试,训练集和测试集的数据库不重复,因此在提示中展示示例的模式有助于模型更好地理解模式与SQL查询之间的关系。为了减少标记消耗和冗余列的干扰,每个选定的SQL示例仅提供最小化的列集合。

5.3 SQL优化器(SQL Refiner)

生成的候选SQL查询不可避免地会包含逻辑或语法错误。通过利用这些SQL查询的缺陷所提供的线索,我们可以在一定程度上进行修正。为此,我们采用了SQL优化器来优化生成的SQL查询。在实践中,基于与模式相关的上下文、生成的SQL查询以及执行结果(包括潜在的错误信息),我们使模型能够进行第二轮修正性生成。原始SQL查询和重新生成的SQL查询可以进一步提交给选择模型(如第6节所述)以进行最优选择,并且这个过程可以迭代执行。


6. 候选选择

基于模式链接和各种候选生成器,我们可以为给定问题生成一组候选查询。从候选池中选择正确且合理的SQL查询仍然是一个需要解决的挑战。大多数方法使用自一致性来选择在多个候选样本中出现最一致的SQL查询。然而,这种方法存在局限性:它无法处理没有任何查询一致的情况,而且即使是最一致的结果也不总是正确的。

为此,我们采用了一个选择模型来进行判断。我们测量SQL执行结果的一致性以对它们进行分组,从而能够从每个组中识别出不一致的样本以形成候选集。然后,我们利用选择模型基于提供的上下文信息和候选集选择最合理的候选查询。我们没有采用基于LLM的提示方法,而是专门微调了一个模型作为选择模型,以便更好地区分候选SQL查询之间的细微差别。为了与候选SQL查询的不同语法偏好保持一致,我们还在选择模型的训练数据上进行了刻意的释义处理。