PET-SQL:基于大模型的两阶段Text2SQL方法

一. 背景

论文: PET-SQL: A Prompt-Enhanced Two-Round Refinement of Text-to-SQL with Cross-consistency

二. 算法介绍

2.1 主要流程

PET-SQL这篇文章提出了一种创新的基于大型语言模型的Text2SQL方法,该方法将SQL生成过程分为两个不同的阶段。在第一阶段,系统利用了数据表的schema信息、数据表中的采样数据以及与问题相似的问答对,共同作用生成初步的SQL语句,称之为PreSQL。这一阶段的目标是快速生成一个接近目标的概要SQL。

随后,进入第二阶段,系统执行schema linking操作,这一过程通过智能过滤掉与当前问题不相关的schema信息,进一步提升SQL语句的准确性,从而生成最终的SQL语句,即FinSQL。这一阶段的优化确保了生成的SQL语句与用户查询的高相关性。

为了验证生成的SQL语句的正确性,论文中利用cross-consistency对其结果进行验证。即通过多个LLM对生成的多个候选SQL进行投票,以共识的方式决定生成的SQL是否正确。这种方法不仅提高了SQL生成的准确性,还增强了系统的可靠性。

第一部分: 生成preSQL

pet-sql 首先利用zero-shot prompt构建一个reference-enhanced representation。

这里的指令需要提醒LLM强调SQL生成时在保证正确性的前提下要考虑执行时间,以保障系统的性能:

"minimize SQL execution time while ensuring correctness"(图中第1行)

除了提供数据表的schema信息外,每个数据表采样了3条数据(图中第7-11行)

提供了数据表的外键信息(图中第12-15行),以更好的表示出不同表直接的链接关系。
除了zero-shot prompt外,作者考虑将与问题类似意图的question-SQL样例作为few-shot(如下图,将检索到的question-SQL放在zero-shot prompt前面)。

few-shot样例采用了论文参考文献9:A Case-Based Reasoning Framework for Adaptive Prompting in Cross-Domain Text-to-SQL提到的question de-semanticization方法。

具体来说,将问题里与特定数据表相关的token如表名、列名、数据取值等使用特殊token 替换得到问题骨架(问题骨架被认为是问题意图的表示)。将训练集中所有问题骨架和question-SQL存储起来作为检索池,对查询问题骨架化处理后使用向量化检索方式得到与查询问题最相似的top k question-SQL作为few shot。

第二部分: 对PreSQL进行筛选

根据第一阶段生成的PreSQL 内容,去掉与PreSQL中不相关的schema信息和外键信息,这个过程被称为schema linking (SL)(注:vanna 是通过向量检索方式来召回与问题最相关的schema,方法不一样,目的都是为了减少干扰信息)。

值得一提的是,这里的schema linking抽取和之前的DIN-SQL等schema linking抽取是有区别的,但本质上都是为了过滤掉干扰信息。

schema linking之后简化的zero-shot prompt如下图所示。

排序: 选出最优的SQL结果

观点: 作者认为self-consistency方法不是足够好的后处理方法,采取的是通过多个LLM来生成SQL的cross consistency策略,包括以下两种方法:

Naive voting across several LLMs:使用更强的LLM如GPT4生成PreSQL,第二阶段使用不同的低温度设置的LLM生成FinSQL。将所有FinSQL和PreSQL在数据库引擎上执行并获取结果,将生成多数结果的SQL作为最后的答案。

Fine-grained voting according to PreSQL complexity:在Naive voting 基础上考虑PreSQL的难易程度,按照难易程度进行分组投票。

2.2 心得体会

整体上PET-SQL的思路是很清晰的,在prompt的设计上加了基于相似度的few-shot示例,对于结果的提升还是比较明显的;其次在利用PreSQL->FinSQL->Ranking的业务流程下,能更好地适配体量较大的数据查询场景。

局限的点就是需要对利用多个大模型进行仲裁,这里的成本可能会相对较高。

相关推荐
小Mie不吃饭2 分钟前
FastAPI 小白教程:从入门级到实战(源码教程)
运维·服务器
爱奥尼欧1 小时前
【Linux 系统】基础IO——Linux中对文件的理解
linux·服务器·microsoft
时序数据说1 小时前
为什么时序数据库IoTDB选择Java作为开发语言
java·大数据·开发语言·数据库·物联网·时序数据库·iotdb
戒不掉的伤怀2 小时前
【Navicat 连接MySQL时出现错误1251:客户端不支持服务器请求的身份验证协议;请考虑升级MySQL客户端】
服务器·数据库·mysql
超喜欢下雨天2 小时前
服务器安装 ros2时遇到底层库依赖冲突的问题
linux·运维·服务器·ros2
cv高级工程师YKY2 小时前
服务器 - - QPS与TPS介绍
数据库
搬码临时工2 小时前
小企业如何搭建本地私有云服务器,并设置内部网络地址提供互联网访问
运维·服务器
nbsaas-boot2 小时前
高可扩展属性建模设计:架构师的全局思考与落地方案
数据库
old-six-programmer2 小时前
NAT 类型及 P2P 穿透
服务器·网络协议·webrtc·p2p·nat
爱上语文2 小时前
Redis基础(5):Redis的Java客户端
java·开发语言·数据库·redis·后端