随着LLM的出现,NL2SQL的性能得到了极大的提升,这显著降低了访问关系数据库的障碍,并支持各种商业应用。
本文提供了一个全面的NL2SQL技术综述,覆盖了整个生命周期,包括模型、数据、评估和错误分析四个方面。
全文概述:NL2SQL任务的全生命周期
NL2SQL问题与背景
对NL2SQL任务进行了定义,并介绍了人类执行NL2SQL任务的工作流程与关键挑战,并描述了基于语言模型发展的NL2SQL解决方案的演变。
NL2SQL任务定义
-
问题表述:NL2SQL,也称为Text-to-SQL,是将自然语言查询转换为可在关系数据库上执行的SQL查询的任务。目标是生成准确反映用户意图的SQL,确保执行后得到适当的结果。
在大型语言模型时代NL2SQL模块的概述
人类工作流程
-
理解自然语言查询:首先理解用户的意图,识别NL中的关键部分,例如实体或属性、时间上下文和特定条件。
-
链接数据库架构和检索内容:基于对NL的理解,检查数据库架构和内容,识别生成SQL所需的相关表、列和单元格值。
-
将NL意图转换为SQL:最后,根据对NL和数据库概念的理解,编写相应的SQL查询。
挑战
-
自然语言的不确定性:自然语言可能因歧义和不明确性而含有不确定性,例如词义歧义、句法歧义、信息不足和用户错误。
-
数据库的复杂性和数据的不完整性:数据库架构的复杂性和数据的庞大体量对NL2SQL任务的有效执行构成挑战,包括表之间的关系复杂性、列名的相似性、特定领域的架构变化以及大数据量和数据的不完整性。
-
从自然语言到SQL的转换:NL2SQL任务与高级编程语言到低级机器语言的编译不同,因为输入的NL和输出的SQL查询之间通常存在一对多的映射。
NL2SQL任务及其挑战的示例
NL2SQL解决方案的演变
-
基于规则的方法:早期研究主要集中在使用预定义规则或语义解析器来理解自然语言查询并将其转换为SQL查询。
-
基于神经网络的方法:为了解决基于规则的方法的局限性,研究者开始利用神经网络来解决NL2SQL任务,例如使用序列到序列模型或图神经网络。
-
基于预训练语言模型的方法:随着BERT和T5等预训练语言模型的出现,基于PLM的NL2SQL方法在多个基准数据集上取得了竞争性的性能。
-
大型语言模型时代:随着LLMs的出现,NL2SQL技术取得了显著进展,LLMs具有卓越的语言理解和新出现的能力,例如使用提示来执行NL2SQL任务。
从语言模型的角度来看NL2SQL解决方案的演变
NL2SQL的预处理策略
专注于在执行NL2SQL翻译过程中的预处理步骤,这些步骤对于识别相关表格和列(即架构链接)以及检索生成SQL所需的适当数据库内容或单元格值至关重要。此外,预处理通过添加特定领域的知识来丰富上下文,提高查询上下文的理解,并纠正错误以防止它们传播。
架构链接(Schema Linking)
-
目的:确定与给定自然语言查询相关的表格和列,确保在有限的输入内准确映射和处理关键信息,提高NL2SQL任务的性能。
-
方法分类:
-
基于字符串匹配的方法:使用相似性度量来识别NL文本和数据库架构元素(如表名和列名)之间的相关映射。
-
基于神经网络的方法:使用深度神经网络来匹配数据库架构和自然语言查询,有效解析语言和数据库结构之间的复杂语义关系。
-
基于上下文学习的方法:利用大型语言模型(如GPT-4)的强推理能力直接从NL查询中识别和链接相关的数据库架构组件。
-
数据库内容检索(Database Content Retrieval)
-
目的:通过文本搜索算法和数据库索引高效检索单元格值。
-
策略分类:
-
基于字符串匹配的方法:通过字符串匹配查找与给定NL查询相关的单元格值序列。
-
基于神经网络的方法:神经网络通过多层非线性变换学习复杂数据格式和语义表示,以捕获语义特征,缓解同义词问题。
-
索引策略:索引是提高数据库内容检索效率的关键方法,允许更快地访问相关单元格值。
-
额外信息获取(Additional Information Acquisition)
-
作用:额外信息(例如领域知识)在提高NL2SQL模型理解NL查询、执行架构链接和NL2SQL翻译方面发挥着重要作用。
-
应用:研究人员经常将额外信息作为文本输入(提示)的一部分,连同少数示例一起输入,以提高模型的理解和翻译质量。
NL2SQL翻译方法
深入探讨了使用语言模型进行NL2SQL翻译的方法。这些方法包括编码策略、解码策略和特定于任务的提示策略,以及如何利用中间表示来优化NL2SQL翻译过程。
基于设计选择的NL2SQL翻译方法分类
编码策略(Encoding Strategy)
编码策略涉及将自然语言和数据库架构转换为结构化格式,以便语言模型有效利用。这一转换对于将非结构化和半结构化数据转换为可用于生成SQL查询的格式至关重要。
-
顺序编码:将NL和数据库架构视为一系列标记。
-
基于图的编码:利用数据库的固有关系结构和输入数据的复杂相互依赖性。
-
独立编码:将NL的不同部分(如子句和条件)分别编码,然后在后期组合以生成最终的SQL。
编码策略的概述
解码策略(Decoding Strategy)
解码策略在NL2SQL翻译中扮演关键角色,负责将编码器生成的表示转换为目标SQL查询。
-
贪婪搜索解码:选择当前概率最高的标记作为输出。
-
束搜索解码:保留多个候选序列,探索更大的搜索空间。
-
约束感知增量解码:在解码过程中逐步添加约束,确保生成的SQL查询在语法上正确。
解码策略的概述
特定于任务的提示策略(Task-specific Prompt Strategy)
在大型语言模型时代,提示工程可以发挥LLMs的能力,并已被广泛应用于自然语言处理。
-
思维链:推动模型顺序思考和推理任务目标。
-
分解:将最终任务分解为多个子任务,分别进行推理。
中间表示(Intermediate Representation)
中间表示(IR)是NL查询和SQL查询之间的桥梁,它是一个结构化但灵活的语法,捕捉NL查询的基本组成部分和关系,而无需SQL的严格语法规则。
-
SQL-like 语法语言:将用户查询转换为中间的SQL-like表达式。
-
SQL-like 草图结构:构建草图规则,将NL映射到SQL-like框架中。
中间表示的示例
NL2SQL的后处理策略
描述了在NL2SQL模型生成SQL之后,如何通过后处理步骤来优化和改进生成的SQL查询,以更好地满足用户的期望。
SQL校正策略(SQL Correction Strategies)
-
目的:修正由模型生成的SQL中的语法错误。
-
方法:例如DIN-SQL提出的自我校正模块,通过不同的提示指导模型识别和纠正错误。
输出一致性(Output Consistency)
-
目的:提高模型输出的一致性。
-
方法:例如C3-SQL提出的自我一致性方法,通过采样多个不同的推理路径并选择最一致的答案来提高输出质量。
执行引导策略(Execution-Guided Strategies)
-
目的:使用SQL查询的执行结果来指导后续处理。
-
方法:如ZeroNL2SQL通过可执行性检查过程不断生成SQL查询,并反馈错误信息给LLMs以实现可执行查询。
N-best重排策略(N-best Rerankers Strategies)
-
目的:对原始模型生成的前n个结果进行重排序,通常使用更大的模型或结合额外的知识源。
-
方法:如Bertrand-dr使用BERT模型作为重排器来改进多个NL2SQL模型。
NL2SQL基准测试
详细介绍了用于评估NL2SQL系统性能的各种数据集,分析了它们的特点,并探讨了这些基准测试如何随着时间的推移而发展。数据集从早期的单一领域、简单SQL查询发展到跨领域、多轮对话和多语言挑战的复杂数据集。
NL2SQL基准测试的时间线
NL2SQL基准测试的统计数据
NL2SQL评估与错误分析
讨论了评估NL2SQL系统性能的方法和工具,并提出了一个错误分类体系来组织和分析NL2SQL过程中的SQL错误。
NL2SQL之360全景的概述
-
错误分类体系设计为两级:
-
错误定位(Error Localization):确定SQL中发生错误的具体部分。
-
错误原因(Cause of Error):理解模型在生成SQL时出错的原因。
-
根据分类统计的Din-SQL错误
推荐NL2SQL模块的数据驱动路线图和决策流程
https://arxiv.org/pdf/2408.05109
A Survey of NL2SQL with Large Language Models:Where are we, and where are we going?
NL2SQL Handbook: https://github.com/HKUSTDial/NL2SQL_Handbook