AI知识库

53AI知识库

学习大模型的前沿技术与行业应用场景


文本到 SQL 模型 - 从基础到高级
发布日期:2024-12-03 19:57:02 浏览次数: 1588 来源:坍缩的奇点


 

文本到 SQL 模型目前正在弥合人类语言和数据库查询之间的差距,使数据比以往任何时候都更容易访问。当被问到“有史以来比赛次数最多的 5 个联赛的名称是什么,每个联赛进行了多少场比赛?”时,基于 LLM 的系统会将您的问题转换为完美的 SQL 查询,检索您需要的准确信息

尽管超过一半的开发人员使用 SQL,但只有大约三分之一的人真正理解它。文本到 SQL 模型可以帮助任何人(即使是没有技术背景的人)像专家一样访问和使用数据。

什么是文本到 SQL 模型?

文本到 SQL 模型允许用户通过简单提问从数据库中检索特定信息。它将用户的自然语言问题转换为可以在数据库中执行的 SQL 查询。

文本到 SQL 模型使用基于大型语言模型的系统,该系统将用户问题和相应的数据库模式作为输入并生成 SQL 查询作为输出。

文本到SQL系统为数据库创建了一个用户友好的界面,使非专家也可以访问它并改善人机交互。

文本到 SQL 如何工作?

文本到 SQL 的实现涉及三个主要方面。首先,系统需要理解用户的问题和意图。它应该能够掌握问题的含义和上下文,以生成相关的 SQL 查询。其次,系统需要理解数据库的结构,包括表和列,这样它就知道在哪里查找用户要求的信息。最后,系统需要生成可以在数据库中执行的实际 SQL 查询,以检索所需的答案。

虽然文本转 SQL 系统取得了重大进展,但仍存在一些挑战。研究人员正在积极探索深度学习方法来应对这些挑战,并使文本转 SQL 模型对用户更易于访问和可靠。

使文本转 SQL 发挥作用的挑战

实现文本到 SQL 系统会面临很多技术挑战。让我们来看看其中一些挑战:

处理语言复杂性和模糊性:

自然语言问题很难准确解释。它们通常包含复杂的语言结构,例如嵌套子句和共指,这使得将它们映射到相应的 SQL 查询非常困难。除此之外,自然语言本质上是模棱两可的,这意味着对于单个用户问题,可能会有多种有效的解释。克服这些挑战需要对语言有深刻的理解,并具备理解上下文和扎实领域知识的能力。

理解和表示数据库模式:

为了生成精确的 SQL 查询,文本转 SQL 系统需要完全掌握数据库的结构。这包括了解表名、列名以及不同表之间的关系。但是,数据库架构可能很复杂,并且在不同的领域可能有很大差异。找到有效的方法来表示和编码此架构信息,以便文本转 SQL 模型可以有效地使用它并非易事。

处理罕见且复杂的 SQL 操作:

某些 SQL 查询涉及罕见或复杂的操作和语法,例如嵌套子查询、外连接和窗口函数。这些操作在训练数据中并不常见,因此文本转 SQL 系统很难为它们生成准确的查询。设计能够处理各种 SQL 操作(包括不太常见且更复杂的操作)的模型非常重要。

跨不同领域进行推广:

文本转 SQL 系统在将所学知识应用到新的数据库场景和领域时,往往会遇到困难。在特定领域训练的模型在面对其他领域的问题时可能表现不佳。这是因为不同的领域有不同的词汇、数据库架构和问题模式。寻找开发能够以最少的领域特定训练或微调有效推广到新领域的系统的方法是一项重大挑战。这些挑战凸显了创建强大且多功能的文本转 SQL 系统的复杂性。研究人员和开发人员一直在努力克服这些障碍,以使文本转 SQL 更可靠,更易于广泛的用户和数据库场景使用。

文本到 SQL 的演变:从规则到语言模型

文本转 SQL 领域已经取得了长足进步,经历了巨大的变革过程。让我们仔细看看它这些年来是如何演变的。

基于规则的方法:

早期,文本到 SQL 系统严重依赖基于规则的方法。这些方法涉及创建手动规则和启发式方法,以将自然语言问题映射到 SQL 查询。虽然它们在简单领域取得了成功,但它们缺乏处理复杂和多样化问题的灵活性和能力。参考文献 — [^2]、[^3] 和 [^4]

基于深度学习的方法:

随着深度神经网络的出现,文本到 SQL 系统开始利用序列到序列模型和编码器-解码器结构(如 LSTM 和变换器)。这些模型经过训练,可以从自然语言输入生成 SQL 查询。RYANSQL [^5] 引入了中间表示法和基于草图的槽填充等技术,以处理复杂问题并改进跨域泛化。此外,研究人员还探索使用图神经网络来捕捉数据库模式中元素之间的关系。

预训练语言模型 (PLM):

预训练语言模型改变了文本到 SQL 的格局。这些模型(如 BERT 和 RoBERTa)在大量语言数据上进行了预训练,使它们能够深入理解语言和语义。研究人员在文本到 SQL 数据集上对这些 PLM 进行了微调,利用它们的语义理解来生成准确的 SQL 查询 [^7]。另一项研究重点是将架构信息合并到 PLM 中,以增强它们对数据库结构的理解 [^6]。

大型语言模型(LLM):

大型语言模型 (LLM)(例如 GPT 系列)最近因其生成流畅文本的能力而备受关注,这引发了人们对将其用于文本到 SQL 任务的兴趣。研究人员已经探索了诸如专有模型的快速工程和在文本到 SQL 数据集上微调开源 LLM 等技术。该领域仍处于新兴阶段,人们正在不断努力增强 LLM 的推理能力、整合特定领域的知识并改进微调策略。随着技术的不断进步,基于 LLM 的文本到 SQL 系统有望变得更加强大,并可在各个领域使用。

基于LLM的文本到SQL方法:

基于 LLM 的文本到 SQL 方法基本上有两种类型

  1. 1. 情境学习(ICL)(提示工程)

  2. 2. 微调(FT)

情境学习(ICL)

情境学习是一种不针对某项任务进行明确训练的模型,而是通过查看提示本身中的示例或指令来学习执行任务的方法。

基于 LLM 的文本到 SQL 生成的公式

为了理解这是如何运作的,让我们分解一下这个公式:

  • • Q - 用户以自然语言提出的问题。例如,“总销售额排名前 5 位的客户有哪些?”

  • • S — 数据库模式和内容,可分解为 S = ⟨C, T , K⟩,C — 列(例如,客户姓名、销售数据),T —表(例如,,customerssales,K:外部知识,例如外键关系或领域知识,可帮助模型了解数据库的结构以及表之间的关系。

  • • I — 任务说明,指导 LLM 执行什么操作(例如,生成 SQL 查询)。

  • • f(·|θ) — 具有冻结参数(θ)的 LLM,这意味着它使用其预先存在的知识和模式来生成结果,而不会在此过程中改变其内部权重。

在这种情况下,LLM根据问题 Q 、模式 S 和任务指令 I 生成 SQL 查询 Y

用于文本到 SQL 任务的 ICL 方法:

已经开发了各种方法来提高 ICL 框架内 LLM 生成的 SQL 查询的准确性。这些方法可以分为五类:

  1. 1. 简单提示(Trivial Prompt):这是最简单的方法,其中模型用一个简单的问题和模式提示,并且它会尝试生成 SQL,而无需任何额外的处理或指导。

  2. 2. 分解(Decomposition):将复杂的 SQL 查询分解为更小、更易于处理的任务。例如,如果 SQL 查询涉及多个子查询或连接,则可以引导模型分别生成每个部分。

  3. 3. 提示优化(Prompt Optimization):这涉及对提示本身的结构进行微调,例如调整措辞、添加示例或重组输入,以使模型更有可能产生正确的 SQL 查询。

  4. 4. 推理增强(Reasoning Enhancement):这些方法增加了推理层,帮助 LLM 理解创建准确 SQL 查询所需的逻辑步骤。例如,引导模型逐步思考不同表之间的关系。

  5. 5. 执行细化(Execution Refinement):生成 SQL 查询后,可能会进一步细化或分阶段执行以确保正确性。这可能涉及验证输出或根据查询的执行结果进行微调。

每个类别都代表一种提高 LLM 将自然语言转换为精确 SQL 查询的效率的方法,从而确保文本到 SQL 应用程序具有更好的性能。

1. Trivial Prompt

大型语言模型 (LLM) 经过大量数据训练,用途广泛,几乎无需额外训练即可处理各种任务,这被称为零样本或少样本提示。这些功能使 LLM 在实际应用中非常有效。在我们的研究中,我们将简单的提示方法(没有复杂的框架)归类为简单提示(也称为原始提示工程)。

为了解释其工作原理,使用 LLM 从自然语言生成 SQL 查询的过程可以用以下公式表示:

  • • I:任务指令(例如,“生成 SQL 查询”),

  • • S:数据库模式(表和列),

  • • Q:用户的问题(例如,“销量排名前五的产品是什么?”)。

通过组合这三个元素(IS 和 Q),可以提示 LLM 生成适当的 SQL 查询。

零样本提示

在零样本提示中,LLM 无需事先看到任何具体示例即可解决文本到 SQL 的任务。

例如,[^8] 等研究评估了不同的 LLM 在生成 SQL 查询时使用零样本提示的表现。结果强调提示设计至关重要。有时添加有关数据库的更多详细信息实际上会降低准确性。例如,当研究人员分析 ChatGPT 在零样本文本到 SQL 任务中的表现时,他们发现它通常优于专门为代码生成设计的旧式 LLM。

提示设计的一个关键方面是包含特定于数据库的知识,例如主键和外键,它们连接数据库中的不同表。事实上,集成外键和简单规则指令的提示通常会产生更清晰、更简洁的结果。

由于影响性能的结构和元素各不相同,因此为基于 LLM 的文本到 SQL 系统设计理想的提示仍然具有挑战性。最近的工作 [^9] 侧重于创建具有前缀、中缀和后缀的标准化模板以增强一致性。开源 LLM(尤其是针对代码优化的 LLM)在零样本文本到 SQL 任务中表现出色,这表明有效的提示设计可以减少大量微调的需要。

少量提示

少量提示是一种在研究和实际应用中广泛使用的技术,已被证明可以提高大型语言模型 (LLM) 的性能。它的工作原理是向模型提供一些示例来指导其响应,使其更有可能生成准确的输出。

在文本到 SQL 任务的上下文中,小样本方法通过添加这些示例实例来扩展提示的基本结构,表示为:

Pn: n 次学习的少样本输入提示,其中 n 是提供的示例数。

Fi: 每个示例由一个模式 Si、一个用户问题 Qi 和一个对应的正确 SQL 查询 Yi 组成。这些示例帮助模型理解如何将自然语言问题转换为 SQL 查询。

少量提示对于文本到 SQL 的转换有何作用?

通过向模型展示以前如何解决类似任务,少样本提示可以利用现实世界的示例来提高性能。这种技术对于文本到 SQL 等任务特别有效,在这些任务中,将自然语言问题转换为 SQL 查询可能很复杂。实证研究表明,少样本提示通常优于零样本提示,因为零样本提示不会为模型提供任何可供学习的示例。

如何选择和优化小样本提示?

研究人员研究了多种方法来选择最佳的少量样本进行提示:

一些研究,如[^10],提供了一个详细的示例(一次提示)来触发模型,而其他研究则研究需要多少个示例才能达到最佳性能。

研究人员还对选择策略进行了比较,例如使用随机抽样与根据示例和手头任务之间的相似性选择示例。[^11] 等研究表明,与随机选择相比,选择示例的更周到的策略(例如找到高度相似或多样化的示例)可以提高性能。

一些研究人员,例如在[^12]中,研究了如何根据难度级别选择示例,并将随机示例选择与基于任务挑战性的更有针对性的策略进行了比较。

2.Decomposition:分解复杂问题以生成更好的 SQL

在文本到 SQL 系统中处理复杂任务的一种有效方法是将具有挑战性的用户问题分解(Decomposition)为更简单的子问题或组件。通过降低整体复杂性,大型语言模型 (LLM) 可以更轻松地生成准确的 SQL 查询。分解方法主要有两种类型:

  1. 1. 子任务分解:这种方法将整个文本到 SQL 的过程分解为更小、更易于管理的子任务,例如模式链接(将用户问题连接到数据库元素)或域分类(识别查询的主题领域)。这些子任务有助于指导模型生成正确的 SQL 查询。

  2. 2. 子问题分解:在此方法中,用户的问题被拆分成多个较小的子问题。每个子问题都单独解决,生成部分 SQL 查询,然后将其组合成最终的 SQL 查询。

分解方法:

围绕分解思想,已经设计了许多先进的模型。以下是一些值得注意的模型:

DIN-SQL [^19]:该方法使用四模块方法来分解该过程。首先,它将用户问题链接到数据库模式。接下来,它将问题分解为子问题并对其难度进行分类。然后,它生成 SQL 查询,最后,自我纠正模块检查并修复输出中的任何错误。通过同时考虑子任务和子问题分解,DIN-SQL 确保了更彻底和准确的 SQL 生成过程。

Coder-Reviewer Framework[^20]:该模型采用了不同的方法,使用了两个组件。编码员生成 SQL 查询,审阅者评估并排名所生成查询的质量。这有助于确保所选的 SQL 查询最有可能成功,从而提高整体准确性。

Chain-of-Thought and Least-to-Most Prompting:这些技术在 QDecomp 等模型中实现,专注于将原始复杂问题分解为较小的推理步骤。提示模型将问题分解为一系列更简单的任务,引导其完成每个推理阶段,然后生成最终的 SQL 查询。

多代理和基于工作流的方法

MAC-SQL[^13]:该框架使用多代理系统,其中不同的代理(选择器、分解器和精炼器)协同工作。选择器选择相关的数据库表,分解器将问题分解为较小的子问题,精炼器通过纠正任何错误来改进最终的 SQL 查询。

DEA-SQL:这种基于工作流的模型通过将 SQL 生成过程分为几个阶段来增强 LLM 的解决问题能力。这些阶段包括确定必要的信息、对问题进行分类、自我纠正错误,甚至主动从过去的错误中学习。通过分别处理每个阶段,DEA-SQL 可以生成更精确的 SQL 查询。

结构感知和元方法

  • • SGU-SQL:此方法利用用户问题和数据库的结构,将它们表示为图形。这些图形有助于在问题和数据库之间建立联系,从而实现更准确的 SQL 生成。

  • • MetaSQL:MetaSQL 遵循三个阶段的过程。首先,使用元数据指导模型,对问题进行语义分解。然后,生成候选 SQL 查询,最后,排名系统选择最佳查询。

  • • PET-SQL:该框架分为两阶段,首先会根据详细的提示,指导模型生成初步的 SQL 查询(PreSQL),在此基础上细化模式链接,最后生成最终的 SQL 查询(FinSQL),使用多个模型来确保最终输出的结果与执行结果一致且准确。

3.及时优化:

现成的 LLM 生成 SQL 的有效性取决于输入提示的制作水平。研究人员发现,各种因素(例如小样本示例的质量和组织、这些示例与用户问题的相似程度以及外部知识的整合)都会显著影响结果。这导致了优化提示的新策略,以充分利用 LLM。

增强提示的关键策略

1. 模式增强和知识整合

DESEM 框架:此方法专注于通过屏蔽特定领域的术语同时保留意图来“去语义化”用户问题。它根据问题意图和架构相关性检索相关示例,指导 LLM 生成更准确的 SQL 查询。

QDecomp 框架:此方法将复杂问题分解为与特定表和列相关的子问题。它使用基于难度的抽样来选择具有挑战性的少数样本示例,从而增强 LLM 的理解力和性能。

2.采样和相似性技术:

SD+SA+Voting Strategy:研究人员将语义相似性与多样性聚类(使用 k-means)相结合,以选择多样化的少样本示例。然后,他们利用模式知识丰富提示,以提供更深层次的背景信息。

C3 框架[^18]:通过将问题和数据库模式作为输入,C3 删除不相关的信息并生成更清晰的提示,从而得到更精确的 SQL 输出。

3.检索增强和混合方法:

Sample-Aware Prompting:此方法简化原始问题,提取其核心结构,并根据骨架相似性从数据库中检索相关示例。然后使用这些检索到的样本来丰富少样本上下文。

ODIS 框架:通过将域外示例与域内合成数据相结合,ODIS 选择不同的示例来创建可以在不同查询中很好地概括的稳健的少量提示。

4.在小样本示例中平衡质量和数量:

DAIL-SQL:此方法解决了选择高质量少样本示例的挑战。它屏蔽特定领域的单词,按相似性对候选示例进行排序,并使用 SQL 预测来确保问题和答案之间的一致性,从而对示例进行精细选择。

ACT-SQL:ACT-SQL 不依赖于静态示例,而是根据相似度得分动态地选择示例,使得提示更能适应不同的用户问题。

4.推理增强:

大型语言模型 (LLM) 在各种推理任务中都表现出强大的能力,包括常识推理、符号推理和算术推理。在文本到 SQL的背景下,当模型需要处理数值、同义词或需要逻辑思维的复杂问题时,推理就变得至关重要。为了提高 LLM 在文本到 SQL 任务中的性能,研究人员正专注于推理增强提示技术,帮助 LLM 更有效地处理复杂查询并生成准确的 SQL。

思路链(CoT)提示:

CoT 提示涉及引导模型完成一系列逻辑推理步骤,鼓励其逐步思考,然后得出结论。在文本到 SQL 中,这可能涉及将问题分解为各个组成部分并逐一解决。虽然这种策略在其他推理任务中非常有效,但它在 SQL 生成中表现出好坏参半的结果,使其成为一个活跃的研究领域。

ACT-SQL

ACT-SQL[^15] 通过自动生成 CoT 示例来解决此问题。它将原始问题分解,链接相关的数据库列,并根据这些关系构建提示以指导 SQL 生成。

QDecomp 框架

该框架通过将 SQL 查询的每个部分映射到逻辑推理步骤来扩展 CoT 提示。它使用自然语言模板来解释每个部分,然后按正确的执行顺序排列这些步骤。这种结构化推理有助于 LLM 提高 SQL 生成的准确性。

Least-to-Most Prompting

该方法将复杂问题分解为更简单的子问题,并按顺序解决它们。然而,研究表明,虽然这种方法在其他领域很有用,但由于处理详细推理步骤时的错误传播,它可能对文本到 SQL 任务不那么有效。

思维程序(PoT)提示

PoT 旨在增强LLM 中的算术推理,尤其是在涉及数值运算的 SQL 生成任务中。它将 Python 代码集成到推理过程中,允许模型同时生成 SQL 查询和 Python 代码,从而确保在复杂数据集中获得更准确的结果。SQL-CRAFT 框架在此基础上构建,强制使用 Python 增强推理来改进 SQL 查询生成。

Self-Consistency

此策略利用了这样一种理念:解决复杂问题的方法有很多种,但所有方法都应该得出相同的正确答案。在文本转 SQL 中,自一致性涉及生成多个 SQL 查询,并使用执行反馈选择最一致的查询(即针对数据库测试查询并挑选出性能最佳的查询)。此方法可减少错误并增加生成正确 SQL 查询的可能性。

一种相关方法,SD+SA+Voting 框架,通过消除产生错误的 SQL 查询并根据数据库的反馈选择获得最多投票的查询来改进这一点[^17]。

Tool-Enhanced SQL Generation

通过集成外部工具来扩展LLM功能是另一项近期的创新。FUXI 框架使用专门设计的工具来协助模型生成 SQL,通过将推理过程扩展到 LLM 的内部功能之外,增强了其处理更复杂任务的能力。

5. 执行细化

使用大型语言模型 (LLM) 生成 SQL 查询时,最终目标是创建不仅能成功运行,还能检索正确信息以回答用户查询的 SQL。但是,由于 SQL 语法和数据库环境的复杂性,第一次尝试就生成完美的 SQL 具有挑战性。这就是执行细化的作用所在。它是一种通过利用执行反馈来提高 SQL 准确性的技术,允许 LLM 根据数据库交互的结果细化或重新生成 SQL 查询。

结合执行反馈进行 SQL 细化

生成初始 SQL 查询后,该查询将在目标数据库中执行。执行可能会返回错误或提供结果。然后,此反馈将用于第二轮提示,允许 LLM 改进或重新生成 SQL 查询。通过上下文学习,模型从此反馈中学习并改进原始 SQL,从而提高其准确性。此循环持续进行,直到 SQL 查询正确并与数据库的结构一致。

基于执行的选择策略

LLM 不会只优化一个 SQL 查询,而是会生成多个 SQL 候选。每个 SQL 查询都在数据库中执行,然后分析结果。根据这些结果,采用选择策略(如自洽或多数表决)来选择最准确的 SQL 查询。这种方法可确保所选查询符合条件并检索正确的信息。

使用执行细化的框架

MRC-EXEC:该框架将自然语言转换为代码,并执行每个 SQL 查询,以选择具有最小执行结果贝叶斯风险的查询,确保所选 SQL 最可靠。

LEVER:LEVER 使用验证器通过分析 SQL 查询的执行结果来评估其正确性。它使用 SQL 生成和执行的组合来过滤掉不正确的查询,只留下最准确的查询。

自我调试

这种方法教会 LLM 调试自己的 SQL 查询。该模型识别生成的 SQL 中的错误,并根据执行反馈优化查询,所有这些都无需人工干预。它甚至用自然语言解释错误和更正,随着时间的推移提高其自我纠正能力。




53AI,企业落地应用大模型首选服务商

产品:大模型应用平台+智能体定制开发+落地咨询服务

承诺:先做场景POC验证,看到效果再签署服务协议。零风险落地应用大模型,已交付160+中大型企业

联系我们

售前咨询
186 6662 7370
预约演示
185 8882 0121

微信扫码

与创始人交个朋友

回到顶部

 
扫码咨询