IT评测·应用市场-qidao123.com

标题: LLM驱动的NL2SQL方法论:近况、难点、优化 [打印本页]

作者: 老婆出轨    时间: 2024-11-28 17:34
标题: LLM驱动的NL2SQL方法论:近况、难点、优化
阅读原文
NL2SQL在大型语言模型(LLM)的支持下得到了广泛应用,为了对基于LLM的NL2SQL解决方案进行系统化研究,我们需要全面明白和实践,包括Prompt工程、指令微调(SFT)、Agent、RAG等技术方案。为深入研究NL2SQL提供一些参考和引导。
1. 什么是NL2SQL

简言之,Natural Language to SQL (NL2SQL) 是指将用户的天然语句转为可以实验的 SQL 语句。

2. 基于LLM的NL2SQL近况

Spider和BIRD是比力受欢迎的两个NL2SQL的benchmark。Spider包含了1万多个天然语言的问题和相干的SQL语句,以及用来运行这些SQL的200多个数据库,高出了100多个应用领域;BIRD相对于Spider更专注于学术研究,BIRD则更加考虑了真实应用中的数据库中信息的复杂性,且考虑了模型生成的SQL运行效率。BIRD也包含了约12000多个天然语言与SQL,涵盖了约37个专业领域的90多个数据库。
可以看到在Spider和BIRD上,GPT是远比开源模型结果要好的;在Spider榜单上,开源模型没有超过80分的,且在BIRD榜单上GPT也都没有超过60分。因此实现一个NL2SQL的模型简朴,但是在实际应用时它的体现却没有想象的那样好,当前AI模型输出SQL的正确性还远无法到达人类工程师的输出精度。


3. 难点简析

应用难:真实企业应用数据库的结构更复杂、分析逻辑更复杂、正确性和相应性能要求高。深度学习的AI模型预测本身就有置信度的问题,无法确保绝对可靠性,这一点在大语言模型依然存在,尤其是在NL2SQL任务上,天然语言表达本身具有歧义性,而SQL是一种正确编程语言。因此在实际应用中,大概会出现无法明白,或者错误明白的情况。比如,“谁是这个月最锋利的销售”,那么AI是明白成订单数量最多,照旧订单金额最大呢?输出的不确定性也是目前限制大模型在关键企业系统应用最大的障碍。

测评难:评估NL2SQL模型输出正确性很困难,既不能用SQL的实验结果来判断,也不能直接用SQL语句进行对比来判断。

那么大语言模型在应对这些问题时是否有很好的解决方案呢?遗憾的是,从当前的一些模型测试结果看,让大语言模型能够在这些场景下完全胜任,到达人类工程师的精度是不实际的。但是我们可以在几个方面考虑其优化,以实如今部门场景下的优先可用:
4. NL2SQL通用优化方案

4.1 提示词工程优化

随着LLM的发展,使用LLM进行NL2SQL已成为一种新的范式。在这一过程中,如何使用提示工程来发掘LLM的NL2SQL本领显得尤为重要。
在使用LLM完成NL2SQL这一任务时,提示工程的关键在于将天然语言问题与必要的数据库信息转化为适用于LLM的天然语言序列输入,即问题表示。同时,当允许输入一些样例以使用LLM的in-context learning本领时,还需要考虑如何选择样例以及如何将这些样例有机地构造到输入序列中。

在zero-shot场景中有五花八门的Prompt模版,这里展示现有文献中四个最具代表性的。别的,再展示一个在 Alpaca中使用的Prompt模板,因为它在监视式微调中非常受欢迎。下表总结了这五种方法:
问题表示INSRIFKLLMsEM                                                  B                                               S                                     P                                                      BS_P                           BSP​xx---                                                  T                                               R                                     P                                                      TR_P                           TRP​✓xxCode-Davinci-00269.0                                                  O                                               D                                     P                                                      OD_P                           ODP​✓✓xGPT-3.5-Turbo, GPT-470.1                                                  C                                               R                                     P                                                      CR_P                           CRP​✓x✓Code-Davinci-002, GPT-3.5-Turbo75.6                                                  A                                               S                                     P                                                      AS_P                           ASP​✓xx-- EX:SQL实验正确率、INS:指令(任务描述)、RI:规则信息(引导性语句,比如“仅输出SQL语句,无需表明”)、FK:外键(数据库的外键信息)
根本提示

根本提示(Basic Prompt)是一种简朴的Prompt模板,它由表模式、以 Q: 为前缀的天然语言问题、以及提示LLM生成SQL的相应前缀 A:SELECT 组成。之以是定名为根本提示,是因为它并未包含任何指令内容。

  1. Table table_name1, columns = [column1, column2, ...]
  2. ...
  3. Table table_name2, columns = [column1, column2, ...]
  4. Q: The question
  5. A: SELECT...(目标SQL)
复制代码
文本表示提示

文本表示法提示(Text Representation Prompt)相比于根本提示,它在提示的开头添加了引导LLM的指令。在零样本场景中,它能在 Spider-dev 上实现了69.0%的实验正确率。

  1. The Instruction(e.g. Given the following database schema: )
  2. Table table_name1, columns = [column1, column2, ...]
  3. ...
  4. Table table_name2, columns = [column1, column2, ...]
  5. Answer the following: The question...
  6. SELECT...(目标SQL)
复制代码
OpenAI范式提示

OpenAI树模提示(OpenAI Demostration Prompt)首次在OpenAI的官方NL2SQL演示中使用,它由指令、表模式和问题组成,此中所有信息都用“#”进行解释。与文本表示提示相比,OpenAI树模提示中的指令更具体,而且还有一条规则约束,“仅完成sqlite SQL查询,无需表明”。

  1. ### The Instruction
  2. # SQLite SQL tables, with their properties:
  3. #
  4. # table_name1(column1, column2, ...)
  5. # ...
  6. # table_name2(column1, column2, ...)
  7. #
  8. ### The question...
  9. SELECT...(目标SQL)
复制代码
代码表示提示

代码表示提示(Code Representation Prompt)是一种基于SQL语法实现NL2SQL任务的方式。具体来说,它直接将表创建语句“CREATE TABLE …”放到Prompt中。相较于其他的问题表示方法,代码表示提示的独特之处在于,它能够提供创建数据库所需的全面信息,比方列名、列类型、主键/外键等。在如许的表示方式下, Code-Davinci-002能够正确预测约75.6%的SQL。

  1. /* Given the following database schema: */
  2. CREATE TABLE table_name1(
  3.     column1 type primary key,
  4.     column2 type,
  5.     foreign key(column3) references table_name2(xxx)
  6. );
  7. CREATE TABLE table_name2(
  8.     column1 thpe primary key,
  9.     column2 type,
  10.     foreign key(column3) references table_name1(xxx)
  11. );
  12. /* Answer the following: The question...
  13. SELECT...(目标SQL)
复制代码
Alpace指令微调提示

Alpace指令微调提示(Alpaca SFT Prompt)是一种用于监视微调的提示方式,它引导LLM按照指示并根据Markdown格式上下文来完成任务。

  1. The description of the NL2SQL Task
  2. ### Instruction:
  3. Write a sql to answer the question "The question"
  4. ### Input:
  5. table_name1(column1, column2, ...)
  6. ...
  7. table_name2(column1, column2, ...)
  8. ### Response:
  9. SELECT...(目标SQL)
复制代码
以上问题表示方法使大型语言模型(LLM)能够通过zero-shot学习直接输出所需的SQL。然而,在NL2SQL任务中,LLM通过上下文学习可以体现更出色,而这只需要在问题表示中提供了少量示例即可。
In-Context 学习

在In-Context 学习中,NL2SQL 涉及两个子任务:选择最有资助的示例、将这些选定的示例构造到问题表示里面去,分别称作“示例选择(Example Selection)”和“示例构造(Example Organization)”。
示例选择

示例选择(Example Selection)在先前的研究中主要有以下几种策略: