[Text2SQL]KeyInst: 通过关键指令来提升Text2SQL
在Text2SQL这个领域里,我们面对的核心问题其实挺直接的:怎么让模型写出来的SQL查询,不光是语法正确,更重要的是,它得能精准理解我们问的那个自然语言问题的意思。针对这个难题,
KeyInst(关键词指令)
![[Text2SQL]KeyInst: 通过关键指令来提升Text2SQL](http://m.haoling.cc/uploadfile/2026/0615/b929e75d9cdb2464ee56cd6517f4168f.webp)
具体来说,KeyInst的整合方式主要有两种思路:
- 先给问题生成一组KeyInst,然后再拿着这组指令去提示LLMs写SQL。一步一步来,思路清晰。
管道策略:
- 直接训练一个微调模型,让它在一个步骤里同时把KeyInst和SQL都搞出来。一步到位,效率优先。
单步策略:
方法
KeyInst的核心思想其实不复杂:它先去分析自然语言问题(也就是NLQ),理解你到底想干什么,然后把中间那些对生成目标SQL至关重要的关键词给提炼出来,作为明确的指导。而且重要的是,这个KeyInst不是现成死板的模板,它是为每个Text2SQL任务实时生成的。
为了支撑这个想法,文章从Spider训练集中精心准备了超过6,200个KeyInst示例,组成了一个专门的KeyInst集合。每个示例都包含数据库模式、问题、对应的SQL以及它的KeyInst。
每一个KeyInst又分两部分:问题分析和关键词建议。问题分析这部分,靠提示LLMs自动生成就行。而关键词建议,则来自于对SQL结构的解析——先把SQL里用到的所有关键词都识别出来,然后过滤掉那些不太核心的。这个过滤是有优先级的:最高优先级是
group by, ha ving, order by, limit, except, intersect, union, where
select, from
join, count, in
管道方法的KeyInst
管道方法采取的是两步走的策略。第一步,先为当前任务生成一个定制化的KeyInst;第二步,拿这个KeyInst去提示LLMs,让它来生成最终SQL查询。这两步分离,各自专注。
微调的KeyInst生成器
第一种生成KeyInst的方式,是微调一个专门的模型来做这个事。输入是数据库模式和问题,输出就是对应的KeyInst,目标就是通过监督微调,让模型的预测尽量贴近真实答案。用更技术的话说,就是最小化那个预测损失函数。这个微调好的模型,就叫
微调KeyInst生成器
KeyInst-FT
基于上下文学习的KeyInst生成器
另一种方式则是利用LLMs自身的能力——通过上下文学习(ICL)来生成KeyInst。从之前准备好的KeyInst集合里,挑几个最相似的例子(也就是演示样本),然后把这些例子和当前的问题、数据库模式拼在一起,形成一个少样本提示。这个提示指导LLMs,来生成当前问题对应的定制KeyInst,也就是
KeyInst-ICL
使用KeyInst生成SQL
等KeyInst生成好了,接下来的SQL生成反倒比较直接。把数据库模式、问题、以及刚生成的KeyInst这三者拼起来,形成一个零样本提示,喂给LLMs,它就能输出最终的SQL。公式上可以表示为:输入是模式、问题加上KeyInst,输出就是预期的SQL。
需要特别注意的是,KeyInst本身是一种非常灵活的增强指令。它的适配性很好,很容易就能整合到现有的各种Text2SQL提示方法里去。你只需要把KeyInst附加到其他方法的提示后面,就能显著提升性能。这种“搭积木”式的设计,让它的实用性非常强。
单步方法的KeyInst
与管道方法的两步走不同,单步方法选择了一条更快的路:微调一个模型,让它同时完成KeyInst和SQL的生成。模型在生成过程中,先产生KeyInst作为初始推理步骤,然后再生成SQL。这个微调过程,本质上是在让模型
内化
这种方法的输入和微调模型是一样的(模式和问题),但输出不同——输出包括KeyInst和SQL两部分。目标同样是优化损失函数,但这里的损失函数同时关注了KeyInst和SQL的预测准确性。它与常见Text2SQL微调模型的核心区别,就在于输出内容是结构化的,包含了推理链条。