自然语言转SQL 一个微调ChatGPT3.5的实例

背景

让非技术人员可以从数据库中提问,这是学术界和工业界多年来感兴趣的问题。最近,大型语言模型(LLM)技术(如GPT-4)的进展提高了所提出解决方案的准确性。然而,由于最先进的LLM尚未开放进行微调,因此最近在这一领域的研究集中在创建能够在不修改基础LLM的情况下实现复杂的自然语言到SQL(NL-to-SQL)场景的检索增强生成(RAG)算法。

上周,OpenAI开放了GPT-3.5-turbo供微调使用。在本文中,我们将微调自己的NL-to-SQL模型,并将其性能与最先进的RAG方法进行比较。我们将使用耶鲁大学的Spider数据集作为测试基准。

以下是来自Spider数据集的两个示例:样例。通过简单的处理,我们可以从这个数据集获得以下训练数据:

准备训练数据集

对于微调GPT-3.5-Turbo,首先要做的是创建和上传训练数据集。由于GPT-3.5-Turbo是一个ChatModel,因此此数据集必须使用以下格式,并被上传为JSONL文件。

Spider数据集有一个包含2147个问题/SQL对的测试集,1034个问题/SQL对的开发集和7000个问题/SQL对的训练集。我们将从Spider训练集中构建我们的微调数据集,使用上述结构。

创建训练数据集

一个NL-to-SQL任务的定义如下:给定一个问题和数据库,确定一个SQL查询,当对数据库执行该查询时,返回一个结果集,可以回答这个问题。对于如何更好地提示LLMs执行此任务,研究人员探索了各种方法,并普遍认为提示需要包括指令组件、Data Schema的详细信息、关于数据内容、一组任务特定的演示以及实际的问题。

给定ChatModel训练数据的格式,上述元素必须在以下三个提示中呈现:

让我们看看如何为我们的NL-to-SQL训练数据集创建每个提示。

准备 system_prompt

创建system_prompt是这个任务中最复杂的部分。至少,system_prompt需要包括:

  1. 系统指令

  2. Data Schema

  3. 数据内容

此外,对于任何实际的用例,如果有大量的表,则训练集中的样本还应该训练模型选择正确的表格用于SQL查询(即执行模式链接)。

准备 系统指令

对于指令,我们使用了以下标准提示:

Data Schema

对于Data Schema,文献中有许多提出的格式,但没有明确的共识,哪种格式表现最佳。我们发现以下是Data Schema的最佳表示方式:

数据内容

经过多次实验,我们发现以下模板在最佳的训练模型数据内容方面表现最好:

数据库内容中的一个重要元素是如何识别分类(低基数)列。区分低基数和高基数列的阈值取决于要微调的大型语言模型(LLM)的上下文窗口大小。给定GPT-3.5-turbo的4096令牌上下文窗口,我们确定20个令牌是低基数和高基数列之间适当的阈值。

模式链接

为了为我们训练集创建正确的system_prompt,需要以这样的方式提供样本,以便训练模型在数据库上正确执行模式链接。为此,我们采用了以下启发式方法:对于每个单独的NL <> SQL样本,我们除了正确的表之外,还随机选择了数据库中的其他表,直到达到4000个令牌的上下文窗口限制为止。为了减少位置信息的影响,我们进一步随机化了表的顺序。简而言之,每个system_prompt包括相关表的模式和内容与其他不相关的表混合在一起,帮助训练模型选择查询的正确表。

现在,我们将所有这些放在一起,构建我们的system_prompt。

对于来自Spider的以下示例:

system_prompt将是

user_prompt

用户提示很简单,每个Spider样本的用户问题。例如:

assistant_prompt

助理提示也很简单,包含了来自Spider的相关SQL查询和找到正确列和正确表的推理步骤。为了构建推理步骤,我们只需提取在SQL查询中使用的表和列。例如:

最终的数据格式

提交训练集进行微调

一旦我们创建了JSONL文件(可以在这里ipfs_here找到一个小样本),下一步是使用以下命令将创建的文件上传到OpenAI:

上传文件后,可以使用以下命令检查上传的状态:

结果应该类似于:

当状态变为已处理时(类似于下面的示例),您可以将文件用于微调:

现在,我们准备开始微调作业。可以使用以下python代码创建一个微调作业:

微调过程的持续时间将根据微调数据集的大小而有所不同。微调有一个最大令牌限制,设置为50000000个令牌。因此,在使用Spider数据集时,我们将样本数量从7000个减少到5750个,并进行总共2个时期的微调。

您可以使用以下命令检查微调作业的状态:

结果应类似于:

 

 

模型性能

DIN-SQL是一种用于自然语言到SQL转换的模型,它在处理Spider数据集上取得了最新的研究成果。DIN-SQL代表"Denoising-inductive SQL generation",该模型结合了去噪自编码器和归纳式学习的方法,使用GPT-4作为生成器模型来生成SQL查询语句。DIN-SQL使用了各种高级提示技术,包括少量示例提示、思路链提示和分解提示,以提高其性能和准确度。该模型具有较高的准确性和效率,但在成本和处理时间方面可能较高。

我们将微调模型的性能与未经微调的GPT3.5-Turbo和DIN-SQL + GPT-4(Spider的当前最先进方法)进行了基准测试,以获得零-shot性能。

结果如下

微调的G-3.5-Turbo的性能与之前的方法相比进的提示技术,包括少量提示、思维链提示和分解提示)保持一致,这是当前最先进的方法。

关键是,与DIN-SQL + GPT-4方法相比,微调模型显著降低了成本和处理时间。下表提供了每个来自Spider基准的问题的不同模型之间的大致成本和速度。

不同模型每个问题的成本和速度(来自Spider基准)

如上所示,与DIN-SQL与GPT-4相比,微调的GPT-3.5-Turbo模型的成本降低了30倍,速度提高了12倍

结论

通过投入时间和金钱来构建训练数据集,可以在准确性上与最先进的方法相匹配,同时速度提高12倍,成本降低30倍。如果,针对具体的业务做针对性的微调准确性应该可以进一步提高。


参考:

https://medium.com/dataherald/fine-tuning-gpt-3-5-turbo-for-natural-language-to-sql-4445c1d37f7c