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的业务流程下,能更好地适配体量较大的数据查询场景。

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

相关推荐
wangqiaowq1 天前
windows下nginx的安装
linux·服务器·前端
星星也在雾里1 天前
PgBouncer 解决 PostgreSQL 连接数超限 + 可视化监控
数据库·postgresql
cen__y1 天前
Linux12(Git01)
linux·运维·服务器·c语言·开发语言·git
雨辰AI1 天前
SpringBoot3 + 人大金仓读写分离 + 分库分表 + 集群高可用 全栈实战
java·数据库·mysql·政务
长城20241 天前
关于MySql的ONLY_FULL_GROUP_BY问题
数据库·mysql·聚合列
常常有1 天前
MySQL 底层执行原理:输入SQL语句到两阶段提交
数据库·sql·mysql
Mr. zhihao1 天前
深入解析redis基本数据结构
数据结构·数据库·redis
m0_748839491 天前
利用天正暖通CAD快速掌握风管数量统计的方法
数据库
随身数智备忘录1 天前
什么是设备管理体系?设备管理体系包含哪些核心模块?
网络·数据库·人工智能
189228048611 天前
NY352固态MT29F32T08GWLBHD6-24QJ:B
大数据·服务器·人工智能·科技·缓存