??LLM逐渐成为了Text-to-SQL任务中的新范式。但过去由于缺乏较为系统的benchmark,人们难以设计有效、高效和经济的基于LLM的Text-to-SQL解决方案。为了应对这一挑战,本文首先对现有的prompt工程方法(包括问题表示、示例选择和示例组织)进行了系统而广泛的比较,并根据这些实验结果阐述了它们的优缺点。基于这些发现,作者的团队提出了一种新的集成解决方案, 称为DAIL-SQL,该解决方案以86.6%的执行准确率刷新了Spider排行榜,并设置了新的标准。作者的团队强调了prompt工程中的token efficiency,并在此指标下比较了先前的研究。此外,作者的团队还研究了开源LLM在上下文学习中的应用,并通过特定任务的监督微调进一步提高了它们的性能。他们探讨了开源LLM在Text-to-SQL方面的潜力,以及特定于任务的监督微调的优点和缺点。
??论文中给出了主流的五种问题表示方法。
??Basic Prompt是最基础的问题表示,连Instruction都不包含,它主要由三部分组成:
??①table schemas;
??②natural language question prefixed by "Q: ";
??③response prefix "A: SELECT ";
??论文中给出了一个例子:
??Text Representation Prompt是在Basic Prompt的基础上取消了问答前缀,在开头增加了Instruction,进行了简单的任务描述来引导LLM完成任务,示例如下:
??这个问题表示方法出现在OpenAI官方关于Text-to-SQL任务的demo。相比 Text Representation Prompt ,它多了一条规则指示,“Complete sqlite SQL query only and with no explanation”,并且除了response的前缀,其他信息都用"#"注释。示例为:
?? Code Representation Prompt的思路较为不同,它用SQL的语法来全面地描述Database,也就是使用"CREAT TABLE" SQLs,涵盖了列的类型、主键、外键等信息,其余信息(如自然语言问题)都包在注释格式里,例子如下:
??Alpaca SFT Prompt是针对有监督微调的LLM设计的。它的Prompt主要哦有三部分:Instruction(任务描述加自然语言问题)Input(数据库模式)和Response(生成回答的提示前缀),文本基于Markdown的语法,示例如下:
??对于上述的几种表示方法,论文中用一张表列出了它们的执行准确率,并讨论了它们在INS(Instruction)、RI(Rule Implication)、FK(Foreign Key)这些 Promp 组成成分上的区别。
??论文中,作者和他的团队主要研究的是跨域的Text-to-SQL任务,总结了四种示例选择的方法。
??这个方法是要选择k个和目标问题最为相似的问题。首先,使用预训练的语言模型对示例库Q中的问题和目标问题做embedding,然后预定义一个距离度量(例如欧几里得距离或负余弦相似度),应用于每个示例-目标对。最后,利用 KNN 算法从 Q 中选择与目标问题最相似的k个问题对应的示例。
??对于跨域的Text-to-SQL任务,文本中会含有大量的某领域特有的信息,为了消除这些信息带来的负面影响,可以把所有问题中的表名称、列名称和值都替换为mask token ,然后再计算embedding后的问题相似度。
??在这个方法中,关注的相似度是SQL查询语句的相似度。第一步是使用一个初始模型,基于目标问题和数据库生成SQL查询语句,用这个语句来近似目标希望得到的SQL查询语句。第二步是根据关键词,将生成的Query编码成二进制的离散语法向量。最后,同时基于SQL查询语句的相似性和示例的多样性来选择k个示例。
??
F
I
?
O
FI\ _O
FI?O?指的是在组织示例时,使用和目标问题的问题表示一样的表示方法,将原本的response前缀(“SELECT” token)换成了完整的SQL语句。在罗列完所有示例后,就描述目标问题。例子如图所示:
??这个组织方法仅仅使用一段前缀的说明和各个示例的SQL查询语句,目的是在有限token数量内给出尽量多的示例,但是会造成信息缺失的不良影响,示例如下:
??基于对这些已有的方法的比较和分析,作者和他的团队提出了一种新的Text-to-SQL方法,称为DAIL-SQL。首先摆出论文中对于上下文学习在Text-to-SQL任务中的目标:
??
max
?
Q
′
,
σ
P
M
(
s
?
∣
σ
(
q
,
D
,
Q
′
)
)
\max _{Q^{\prime}, \sigma} \quad \mathbb{P}_{\mathcal{M}}\left(s^{*} \mid \sigma\left(q, \mathcal{D}, Q^{\prime}\right)\right)
maxQ′,σ?PM?(s?∣σ(q,D,Q′))
??
?s.t.????
∣
Q
′
∣
=
k
?and?
Q
′
?
Q
,?
\text { s.t.\ \ \ \ }\left|Q^{\prime}\right|=k \text { and } Q^{\prime} \subset Q \text {, }
?s.t.????∣Q′∣=k?and?Q′?Q,?
??其中,
Q
=
{
(
q
i
,
s
i
,
D
i
)
}
Q=\left\{\left(q_{i}, s_{i}, \mathcal{D}_{i}\right)\right\}
Q={(qi?,si?,Di?)},是一个由示例(自然语言问题
q
i
q_i
qi?和对应的SQL查询语句
s
i
s_i
si?)和数据库组成的三元组的集合,
M
\mathcal{M}
M是我们使用的LLM,
σ
\sigma
σ函数代表着我们选择的问题表示
q
q
q、数据库
D
\mathcal{D}
D和从
Q
Q
Q中挑选出来的k个示例选出的k个示例
Q
′
Q^{\prime}
Q′。也就是说,我们需要通过上下文学习的方法让LLM生成正确的SQL查询语句
s
?
s^{*}
s?的可能性最大。
??在示例选择方面,论文提出了结合
M
Q
S
?
_
S
MQS \ \_S
MQS?_S方法和
Q
R
S
?
_
S
QRS\ \_S
QRS?_S方法的DAIL Selection((
D
A
I
L
?
S
DAIL\ _S
DAIL?S?),同时关注问题和查询语句的相似度。
??首先,把目标问题
q
q
q和候选集
Q
Q
Q中的示例问题
q
i
q_i
qi?中的领域专有词汇都进行mask,然后embedding再计算欧几里得距离,进行相似度排序;同时,计算pre-predicted 的SQL查询语句
s
′
s^{\prime}
s′和候选集
Q
Q
Q中的示例
s
i
s_i
si?的相似度。然后,筛选出查询语句相似度大于预设阈值的示例,按照之前问题相似度排好的顺序取k个示例。
??在示例组织方面,论文结合了
F
I
?
O
FI\ _O
FI?O?和
S
O
?
O
SO\ _O
SO?O?两种方法的优点,提出了
D
A
I
L
?
O
DAIL\ _O
DAIL?O?组织方法,关键点如下:
(1)既包含自然语言问题,又包含对应的SQL查询语句;
(2)为了节省token以表示更多的示例,去除了对数据库模式的表示。
(1)关于问题表示,实验发现,外键和"无解释"的规则暗示都可能对Text-to-SQL任务有极大的益处,更多的规则暗示(Rule Implication)还有待探索;
(2)关于示例选择,实验发现,同时关注问题的相似度和查询语句的相似度是非常重要的。不过还存在查询语句相似度过低的情况,因为SQL查询语句的ground truth和用初始模型生成的查询语句存在较大差距。
(3)对于开源LLM,未经过微调的开源LLM的表现都逊色于OpenAI,且模型规模和模型表现呈正相关。不过,我们可以通过有监督微调来大大提升开源LLM在Text-to-SQL任务上的表现性能。但有一点需要注意,实验发现,经过微调后的LLM如果再使用上下文学习,反而会使精确匹配率和执行准确率下降。所以,微调后如何保留LLM的上下文学习能力有待探索。
??Text-to-SQL任务的评价方法主要包含两种,一个是精确匹配率(exact match ),另一个是执行准确率(execution accuracy)。精确匹配率指预测得到的SQL查询语句与正确的SQL查询语句在SELECT、WHERE等模块上的字符串完全匹配程度;执行准确率的正确执行是指在执行预测得到的SQL语句后,数据库能够返回正确答案。