Text-to-SQL方法研究

news/2024/12/22 0:01:50/

有关Text-to-SQL实现细节,可以查阅我的另一篇文章text-to-sql将自然语言转换为数据库查询语句

1、面临的挑战

  • 自然语言问题往往包含复杂的语言结构,如嵌套语句、倒装句和省略等,很难准确映射到SQL查询上。此外,自然语言本身就存在歧义,一个问题可能有多种解读。消除歧义需要深入的语言理解能力以及融入上下文和领域知识。

  • 要生成正确的SQL查询,文本到SQL系统需要全面理解数据库模式,包括表名、列名以及表之间的关系。但不同领域的数据库模式差异很大。如何以一种能被文本到SQL模型有效利用的方式来表示和编码数据库模式信息是一个挑战。

  • 一些SQL查询涉及罕见或复杂的操作,如嵌套子查询、外连接和等。这些操作在训练数据中出现频率低,给文本到SQL模型的准确生成带来挑战。

2、最新进展

针对这些挑战,整理将大语言模型应用于文本到SQL任务的最新进展:

最新的研究聚焦于如何进一步增强大语言模型在文本到SQL任务中的表现,可以有如下几个方面。

  • 1.优化输入到大语言模型的提示,引导其更好地理解用户意图。这包括精心设计少样本示例、对输入进行归纳和分解等。

  • 2.改进大语言模型生成SQL的推理过程。将复杂问题分解成步骤化的子问题,减少信息丢失,同时引入一致性检验避免逻辑谬误。

  • 3.利用数据库反馈来提炼SQL。通过将生成的SQL在实际数据库中执行,获得准确性反馈,并将其再输入给语言模型修正SQL,形成闭环学习。

3、基于上下文学习的Text-to-SQL方法

基于上下文学习的Text-to-SQL方法利用大语言模型强大的少样本学习能力,通过设计提示prompt使模型直接生成SQL,而无需微调模型参数。可以将这类方法进一步细分为以下5类:

  1. 平凡提示

  • 普通的平凡提示

平凡提示是指直接使用问题和数据库DDL作为提示,让语言模型直接生成SQL。

示例:

问题:新疆有几所小学

数据库DDL:

create table if not exists sch_school

(...

)

  • 平凡的少样本提示

平凡的少样本提示则是在此基础上添加一些示例

问题1:山大附属小学各年级女生的平均年龄是多少? SQL1:SELECT sch_student_class_semester.class_grade, AVG(DATEDIFF(CURDATE(), birthday) xxx

问题2:查询市中区实验小学每个年级的人数

SQL2:SELECT sc.class_grade, COUNT(sscs.student_id)\nfrom sch_class sc xxx

问题3:新疆有几所小学

数据库DDL:

create table if not exists sch_school

(...

)

     2. 任务分解

任务分解方法通过将Text-to-SQL任务分解为多个子任务或步骤,降低任务复杂度。这就好比将一个复杂的数学题分解为多个简单的小问题。具体来说,分解方法可以分为子任务分解和子问题分解。子任务分解会将Text-to-SQL分解为模式连接(schema linking)、分类、SQL生成等子任务。而子问题分解则是将用户问题分解为多个子问题,然后分别生成对应的SQL子句再组合。

     3. 提示优化

提示优化构造更高质量的少样本示例,从而提升模型性能。关键点:选择与当前问题更相似或更有代表性的示例作为提示,可以让模型更好地理解任务。

示例:DAIL-SQL,论文中先对问题中的领域特定词进行掩码,然后基于嵌入式欧氏距离对候选示例进行排序,同时还考虑了候选SQL的相似度,最终选择兼顾问题和SQL相似度的高质量示例。

     4. 推理增强

推理增强方法旨在进一步提升模型在Text-to-SQL任务中的推理和逻辑能力。代表性的方法包括思维链(Chain-of-Thoughts)和最小优先(Least-to-Most)提示等。

思维链提示引导模型进行逐步推理,将推理过程外显化。

最小优先提示则是先将问题分解为子问题,然后逐步求解

     5. 执行细化

执行细化方法利用SQL执行反馈来提升模型生成的准确性。其基本思路是:先让模型生成候选SQL,然后在数据库中执行,根据执行结果(如报错信息)来提示模型纠错和细化生成的SQL。

示例:DIN-SQL,论文中自我纠错模块就是让模型根据数据库反馈迭代优化生成的SQL。

     6. 后处理

1)自纠错机制。如生成的sql让模型纠错,检查有无错误,如语法错误等

2)投票。大模型生成sql不稳定,通过多轮投票稳定结果

3)直接执行。根据执行结果纠错,再返回sql

4、基于微调的Text-to-SQL方法

与基于上下文学习的方法不同,基于微调的方法通过在Text-to-SQL数据集上微调预训练语言模型的参数,让模型习得从自然语言问题生成SQL的能力。我们没有用到此方法,这里就不做介绍了。

5、相关研究工作

介绍上文中提到的两篇text-to-sql解决方案的论文,分别是DAIL-SQL和DIN-SQL

1、DAIL-SQL (阿里)

论文的主要贡献

1)首选在目标问题q和候选集Q中的示例问题(sql-question对)中,屏蔽特定领域词汇,得到目标问题骨架和示例问题question骨架,通过embedding计算欧式距离并进行排序。

2)生成一个初步预测sql,去除sql中的表名,列名和value值,得到sql骨架;对示例问题(sql-question对)中的sql同样去除表名,列名和value值得到sql骨架;计算预测sql和示例sql之间的距离相似度。

3)选择标准优先考虑问题相似度排序的候选项,设定阈值进行控制。

  • 问题表示:选取代码展示方式,兼顾外键和规则信息

  • 上下文学习

选择:同时采用问题相似度和SQL相似度

组织:仅展示样例的问题-SQL对,保留问句和SQL的映射关系,并容纳更多样例

问题相似度:计算问题Embedding的距离作为相似度的度量

问题骨架相似度:将问题的表名、列名等信息去掉,计算剩下骨架的相似度,例如How many ___ are there ?

SQL相似度:先生成一个初步sql,在计算初步sql与所有sql间keyword的匹配程度计算相似度

展示添加的sql-question:问题+sql展示形式

                                                                   DAIL-SQL架构图

总结:DAIL-SQL本质是对sql-question对进行优化,以期能提供更准确的sql-question供大模型参考

2、DIN-SQL(商汤)

论文的主要贡献

  1. 通过任务分解提高基于LLM的文本到SQL模型的性能。

  2. 引入针对任务复杂度的自适应提示策略。

  3. 在提示的背景下解决模式链接挑战。

  4. 使用LLM进行自我纠错。

整体架构图: 将问题分解成更小的子问题,解决每个子问题,并使用这些解决方案来构建原始问题的解决方案。

总结:

  • DIN-SQL论文中将sql生成任务分成了三类,即

简单查询(无需join连接即可回答的单表查询)、

非嵌套复杂查询(需要join连接,单不需要子查询)、

嵌套复杂查询(需要join连接,需要子查询)

并分别设置了不同的prompt提示词,用于生成sql

  • 设置了自我校正模块,模型去修正一些小错误

DIN-SQL本质上是在提示词上进行优化。


http://www.ppmy.cn/news/1534354.html

相关文章

Windows环境下使用Docker配置MySQL数据库

用Docker配置数据库,无论是做开发,还是做生产部署,都非常的方便 它不需要单独安装数据库,也不用担心出现各种环境的配置问题。 本文将分享用Docker配置数据库的步骤,这里用MySQL举例。 其他的数据库如MSSQL&#xf…

深入探索 PyTorch 在机器学习中的应用

目录 PyTorch 概述安装 PyTorchPyTorch 的基本概念 张量自动微分 深度学习模型的构建 定义模型损失函数与优化器 训练模型在机器学习中的应用 图像分类自然语言处理强化学习 迁移学习PyTorch 的优势与局限性实际应用案例总结与展望 1. PyTorch 概述 PyTorch 是一个开源的深度…

有些硬盘录像机接入视频汇聚平台EasyCVR后通道不显示/显示不全,该如何处理?

EasyCVR视频监控汇聚管理平台是一款针对大中型项目设计的跨区域网络化视频监控集中管理平台。该平台不仅具备视频资源管理、设备管理、用户管理、运维管理和安全管理等功能,还支持多种主流标准协议,如GB28181、RTSP/Onvif、RTMP、部标JT808、GA/T 1400协…

城市空间设计对居民生活质量的影响:构建宜居城市的蓝图

在快节奏的现代生活中,城市不仅是经济活动的中心,更是人们生活、工作、休闲的综合载体。本文旨在深入探讨城市空间设计如何通过科学规划、人性化考量以及生态融合,为居民打造更加宜居、和谐的生活环境。 1. 促进社区互动与归属感 城市空间设…

JS测试框架——Jest

文章目录 安装yarn安装jestvscode支持jest的智能提示创建JS测试用例 安装yarn yarn是meta发布的一款取代npm的包管理工具。 npm install -g yarn查看yarn软件源 yarn config get registry换源 yarn config set registry https://registry.npmmirror.com恢复官方源 yarn co…

Qt/C++开源控件 自定义雷达控件

使用Qt框架创建一个简单的雷达图&#xff0c;包含动态扫描、目标点生成、刻度和方向标识。代码实现使用C编写&#xff0c;适合用作学习和扩展的基础。 1. 头文件与基本设置 #include "RadarWidget.h" #include <QPainter> #include <QPen> #include &…

用Python实现运筹学——Day 11: 线性规划的实际应用

一、学习内容 1. 不同领域中线性规划的经典应用场景 线性规划在多个领域中有广泛的应用&#xff0c;常见的应用领域包括&#xff1a; 生产计划与资源分配&#xff1a;用于优化生产调度、资源分配和生产线管理&#xff0c;最大化利润或最小化成本。物流与运输&#xff1a;解决…

IPv6常见问题解答

1. 怎么判断宽带是否支持IPv6&#xff1f; 有两种方式。①与宽带运营商确认线路是否支持IPv6&#xff1b;②电脑直连猫拨号&#xff0c;看电脑是否获取到IPv6地址。 2. 怎么判断IPv6线路是否支持前缀授权&#xff1f; 请致电宽带运营商确认。 3. 怎么判断路由器是否支持IPv…