当前位置: 首页 > news >正文

text2sql方法:NatSQL和DIN-SQL

NatSQL

NatSQL出自2021年9月的论文《Natural SQL: Making SQL Easier to Infer from Natural Language Specifications》(github),它是一种SQL 中间表征(SQL intermediate representation(IR))方法。

NatSQL作者认为Text2SQL的关键挑战是自然语言描述和其对应的SQL查询之间存在不匹配(mismatch),比如论文图1的SQL语句中的GROUP BY 和JOIN ON在自然语言描述问题中没有被提到。因为SQL是被设计成高效地查询关系数据库的,不是用来表示自然语言问题的含义。对不匹配的解决办法是使用中间表征。

在这里插入图片描述

NatSQL的主要语法如论文表1,其设计原则是简化SQL的结构并使其语法与自然语言描述接近:

  • 它只保留SQL中的SELECT, WHERE, ORDER BY 子句。 去掉了GROUP BY,HAVING, FROM, JOIN ON,集合操作符(INTERSECT,UNION,EXCEPT),子查询。
  • 大写斜体字符为SQL和NatSQL关键词,其他大写字符表示特殊的含义:‘TABLE_NAME’, ‘COLUMN_NAME’ 为数据库而定义的, ‘NUMBER’, ‘STRING’ 表示数据类型。
  • 除了被删除的SQL子句外,NatSQL和SQL的差别在表1中用下划线表示。NatSQL将被删除的子句的功能通过添加新的关键字以及允许where条件之前出现conjunct来实现。

在这里插入图片描述

论文图1用一个例子示意了NatSQL与其他几种中间表征方法,NatSQL与SemQL最像,论文认为它在如下方面提升了SemQL:

  • 相比SemQL对SQL语句的兼容范围更大;
  • 简化了带集合操作符(INTERSECT,UNION,EXCEPT)的查询语句结构;
  • 去掉了嵌套子查询;
  • 减少了需要预测的schema元素的个数;
  • 使用与SQL一样的关键字和句法,比SemQL可读性更好且更易扩展。

论文后续部分更详细介绍了这些细节,本笔记主要对NatSQL作一个基本了解,就不详细记录了。

注:NatSQL的github没有包括将SQL转换成NatSQL的代码(有几个issue(1, 2)都提到了这个问题)

DIN-SQL

DIN-SQL出自2023年4月的论文《DIN-SQL: Decomposed In-Context Learning of Text-to-SQL with Self-Correction》(github), 它将text2sql分解成多个子问题后,对每个子问题使用不同prompt让GPT-4生成最终的SQL语句。

论文先从Spider的训练数据集中采样了来自不同数据库的500个问题,分析使用few-shot prompt LLM生成的SQL与标准SQL不同的失败原因,并将失败原因分成如论文图1所示的6个类别。

在这里插入图片描述

在这里插入图片描述

鉴于用few-shot来prompt LLM进行text2sql时,LLM处理复杂查询时较容易出错。DIN-SQL将问题拆成更小的子问题。SQL查询是属于声明式的且可能的各个步骤及边界没有那么明显,所以直接使用很流行的COT方法来处理text2sql的效果没有像解决数学问题那么明显。但是写SQL查询的思考过程可以大致分为如下四步:

  1. 选择与查询相关的数据库表和数据列;
  2. 识别复杂查询的通用查询结构如group by, 嵌套语句, 多个join, set operations等;
  3. 如果有子组件可被识别的话,先定义这些子组件;
  4. 基于子问题的解决方法写出最后的查询。

基于上述思考过程,DIN-SQL将text2SQL任务分解成如论文图2所示的四个模块,并全部用prompt的方式来实现这四个模块,在prompt中使用的few-shot例子从基准数据集的训练集获得。

  1. schema linking;
  2. 问题分类和分解;
  3. SQL生成;
  4. 自我校正;

在这里插入图片描述

Schema Linking 模块:使用的prompt包括10个从Spider数据集随机选择的样例; 基于COT模板,prompt以"Let’s think step by step"开头。对于问题中与列名有关的mention,对应的列名和表名从给定的数据库schema中被提取出来;可能的实体或者数据取值也从问题中被提取出来,示意如论文图3a,完整prompt在附录(prompt里的描述为“# Find the schema_links for generating SQL queries for each question based on the database schema and Foreign keys.”,接着是数据表schema,再就是10个例子)。

问题分类和分解模块:将每一个问题分成三个类别:容易(easy),非嵌套复杂(non-nested complex),嵌套复杂(nested complex).

  • 容易类别:只涉及到单张表的查询,不需要join或嵌套;
  • 非嵌套复杂类别:包括join但不包括子查询的查询;
  • 嵌套复杂类别:包括join,子查询,集合操作(EXCEPT, UNION, INTERSECT)的查询

将每个问题分成不同的类别后,可以对不同的类别使用不同的prompt。论文图3b是一个示例,完整prompt在附录(prompt里的描述为“# For the given question, classify it as EASY, NON-NESTED, or NESTED based on nested queries and JOIN. if need nested queries: predict NESTED elif need JOIN and don’t need nested queries: predict NON-NESTED elif don’t need JOIN and don’t need nested queries: predict EASY”)

SQL生成模块:对第二步分类的三个类别使用不同的处理方式。

  • 容易类别:使用few-shot prompting, 每一个例子由 < Q j , S j , A j > <Q_j, S_j, A_j> <Qj,Sj,Aj>组成, Q j Q_j Qj是问题, S j S_j Sj是schema links, A j A_j Aj是SQL。

在这里插入图片描述

  • 非嵌套复杂类别:使用NatSQL作为中间表征(intermediate representation),few-shot prompting的每一个例子由 < Q j , S j , I j , A j > <Q_j, S_j, I_j, A_j> <Qj,Sj,Ij,Aj>组成, Q j Q_j Qj是问题, S j S_j Sj是schema links, i j i_j ij是问题和SQL的中间表征, A j A_j Aj是SQL。

在这里插入图片描述

  • 嵌套复杂类别:prompt被设计成让LLM先解决子查询,再用子查询生成最后的回答,few-shot例子格式为 < Q j , S j , < Q j 1 , A j 1 , … , Q j k , Q j k > , I j , A j > <Q_j, S_j,<Q_{j_1}, A_{j_1}, \ldots, Q_{j_k}, Q_{j_k}>, I_j, A_j> <Qj,Sj,<Qj1,Aj1,,Qjk,Qjk>,Ij,Aj>, k为子问题的个数, Q j i Q_{j_i} Qji A j i A_{j_i} Aji表示第i个子问题和第i个子SQL语句, 其他的符号与前面一致。

在这里插入图片描述

自我校正模块:由LLM生成的SQL有时会有缺失或者多余的关键字如DESC、DISTINCT等。所以DIN-SQL包括一个自我校验模块,采用zero-shot的形式,并且用两种不同的prompt来实现:

  • generic:要求模型识别和纠正"BUGGY SQL"中的错误;

在这里插入图片描述

  • gentle:不假定生成的SQL查询是有bug的,提供要注意哪些语句的提示让模型去检查潜在问题;
    在这里插入图片描述

论文发现对GPT-4使用gentle prompt的效率更高,而对CodeX模型使用generic prompt的效率更高。

DIN-SQL与few-shot prompt的失败类别对比如论文图4。

在这里插入图片描述

相关文章:

text2sql方法:NatSQL和DIN-SQL

NatSQL NatSQL出自2021年9月的论文《Natural SQL: Making SQL Easier to Infer from Natural Language Specifications》(github)&#xff0c;它是一种SQL 中间表征(SQL intermediate representation(IR))方法。 NatSQL作者认为Text2SQL的关键挑战是自然语言描述和其对应的SQ…...

【新闻转载】Storm-0501:勒索软件攻击扩展到混合云环境

icrosoft发出警告&#xff0c;勒索软件团伙Storm-0501近期调整了攻击策略&#xff0c;目前正将目标瞄准混合云环境&#xff0c;旨在全面破坏受害者的资产。 该威胁行为者自2021年首次露面&#xff0c;起初作为Sabbath勒索软件行动的分支。随后&#xff0c;他们开始分发来自Hive…...

RabbitMQ 队列之战:Classic 和 Quorum 的性能洞察

RabbitMQ 是一个功能强大且广泛使用的消息代理&#xff0c;它通过处理消息的传输、存储和交付来促进分布式应用程序之间的通信。作为消息代理&#xff0c;RabbitMQ 充当生产者&#xff08;发送消息的应用程序&#xff09;和使用者&#xff08;接收消息的应用程序&#xff09;之…...

Spring Boot 集成 MySQL 的详细指南

在现代软件开发中&#xff0c;Spring Boot 因其简单易用而成为构建 Java 应用程序的热门选择。结合 MySQL这一常用关系型数据库&#xff0c;开发者可以快速构建出功能完善的后端服务。本文将详细介绍如何将 Spring Boot 与 MySQL 集成&#xff0c;提供从环境搭建到代码实现的全…...

python格式化输入输出

以下是使用 format()、f-string 和百分号 % 运算符进行 Python 数据格式化输入输出的示例代码。 1. 使用 format() 方法进行格式化 # 使用 format() 方法格式化数据并输出到文件 name "Alice" age 25 score 92.5# 格式化字符串 formatted_string "Name: {…...

音视频入门基础:FLV专题(10)——Script Tag实例分析

一、引言 在《音视频入门基础&#xff1a;FLV专题&#xff08;9&#xff09;——Script Tag简介》中对FLV文件的Script Tag进行了简介。下面用一个具体的例子来对Script Tag进行分析。 二、Script Tag的Tag header实例分析 用notepad打开《音视频入门基础&#xff1a;FLV专题…...

国外问卷调查匠哥已经不带人了,但是还可以交流

国外问卷调查匠哥已经不带人了&#xff0c;但是还可以来和匠哥交流&#xff0c; 为啥不带人了呢&#xff1f; 从今年年初开始&#xff0c;匠哥在带学员的过程中发现&#xff1a; 跟往年同样的收费&#xff0c;同样的教学&#xff0c;甚至我付出的时间精力比以前还多&#xff…...

Linux 进程的基本概念及描述

目录 0.前言 1. 什么是进程 1.1 进程的定义与特性 1.2 进程与线程的区别 2.描述进程 2.1 PCB (进程控制块) 2.2 task_struct 3.查看进程 3.1 查看进程信息 3.1.1 /proc 文件系统 3.1.2 ps 命令 3.1.2 top 和 htop 命令 3.2 获取进程标识符 3.2.1使用命令获取PID 3.2.2 使用C语言…...

【C++】透过STL源代码深度剖析vector的底层

✨ Blog’s 主页: 白乐天_ξ( ✿&#xff1e;◡❛) &#x1f308; 个人Motto&#xff1a;他强任他强&#xff0c;清风拂山冈&#xff01; &#x1f525; 所属专栏&#xff1a;C深入学习笔记 &#x1f4ab; 欢迎来到我的学习笔记&#xff01; 参考博客&#xff1a;【C】透过STL源…...

ubuntu 开启root

sudo passwd root#输入以下命令来给root账户设置密码 sudo passwd -u root#启用root账户 su - root#要登录root账户 root 开启远程访问&#xff1a; 小心不要改到这里了&#xff1a;sudo nano /etc/ssh/ssh_config 而是&#xff1a;/etc/ssh/sshd_config sudo nano /etc/ssh…...

使用 Llama 3.1 和 Qdrant 构建多语言医疗保健聊天机器人的步骤

长话短说&#xff1a; 准备好深入研究&#xff1a; 矢量存储的复杂性以及如何利用 Qdrant 进行高效数据摄取。掌握 Qdrant 中的集合管理以获得最佳性能。释放上下文感知响应的相似性搜索的潜力。精心设计复杂的 LangChain 工作流程以增强聊天机器人的功能。将革命性的 Llama …...

【Linux-基础IO】如何理解Linux下一切皆文件磁盘的介绍

目录 如何理解Linux系统上一切皆文件 1.物理角度认识磁盘 2.对磁盘的存储进行逻辑抽象 磁盘寻址 3.磁盘中的寄存器 如何理解Linux系统上一切皆文件 计算机中包含大量外设&#xff0c;操作系统想要管理好这些外设&#xff0c;就必须对这些外设进行先描述再组织&#xff0c…...

Golang | Leetcode Golang题解之第436题寻找右区间

题目&#xff1a; 题解&#xff1a; func findRightInterval(intervals [][]int) []int {n : len(intervals)type pair struct{ x, i int }starts : make([]pair, n)ends : make([]pair, n)for i, p : range intervals {starts[i] pair{p[0], i}ends[i] pair{p[1], i}}sort.…...

微服务SpringSession解析部署使用全流程

目录 1、SpringSession简介 2、实现session共享的三种方式 1、修改Tomcat配置文件 2、Nginx负载均衡策略 3、redis统一存储 0、准备工作 1、本地服务添加依赖 2、修改本地服务配置文件 3、添加application.properties文件 4、添加nacos - redis配置 5、修改本地项目…...

自动驾驶 3DGS 学习笔记

目录 street_gaussians gsplat依赖项 运行报错&#xff1a; python>3.9 SGD: Street View Synthesis with Gaussian Splatting and Diffusion Prior 差分高斯光栅化 diff-gaussian-rasterization street_gaussians https://github.com/zju3dv/street_gaussians gsp…...

【C++笔试强训】如何成为算法糕手Day5

学习编程就得循环渐进&#xff0c;扎实基础&#xff0c;勿在浮沙筑高台 循环渐进Forward-CSDN博客 目录 循环渐进Forward-CSDN博客 第一题&#xff1a;游游的you 思路&#xff1a; 第二题&#xff1a;腐烂的苹果 思路&#xff1a; 第三题&#xff1a;孩子们的游戏 思路&…...

【Qt】无IDE的Gui程序快速开始

Qt安装 在 Windows 上安装 Qt 的步骤如下&#xff1a; 下载 Qt 安装程序 访问 Qt 的官方网站&#xff1a;Qt Downloads。点击“Download”按钮&#xff0c;下载 Qt Online Installer&#xff08;在线安装程序&#xff09;。 运行安装程序 双击下载的 QtInstaller.exe 文件…...

Python编码系列—Python备忘录模式:掌握对象状态保存与恢复技术

&#x1f31f;&#x1f31f; 欢迎来到我的技术小筑&#xff0c;一个专为技术探索者打造的交流空间。在这里&#xff0c;我们不仅分享代码的智慧&#xff0c;还探讨技术的深度与广度。无论您是资深开发者还是技术新手&#xff0c;这里都有一片属于您的天空。让我们在知识的海洋中…...

linux常用命令汇编(持续更新)

一、用户提示符 # root账号提示符 $ 普通用户提示符 二、关闭计算机 shutdown&#xff08;安全有序地关闭计算机&#xff09; 语法&#xff1a;shutdown [options] [time] [message] shutdown -h now #立即关机&#xff08;--halt/终止&#xff09; shutdown -r now #重…...

AI面试指南:AI工具总结评测,助力求职季

AI面试指南&#xff1a;AI工具总结评测&#xff0c;助力求职季 摘要&#xff1a; 在竞争激烈的AI领域秋招季&#xff0c;准备充分并借助高效工具是提升面试通过率的关键。本文主要介绍一些针对秋招的AI面试工具和学习资源&#xff0c;分为简历优化、面试助手、手撕代码练习三个…...

Zustand 状态管理库:极简而强大的解决方案

Zustand 是一个轻量级、快速和可扩展的状态管理库&#xff0c;特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...

Nuxt.js 中的路由配置详解

Nuxt.js 通过其内置的路由系统简化了应用的路由配置&#xff0c;使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...

2025 后端自学UNIAPP【项目实战:旅游项目】6、我的收藏页面

代码框架视图 1、先添加一个获取收藏景点的列表请求 【在文件my_api.js文件中添加】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口&#xff08;适配服务端返回 Token&#xff09; export const login async (code, avatar) > {const res await http…...

tree 树组件大数据卡顿问题优化

问题背景 项目中有用到树组件用来做文件目录&#xff0c;但是由于这个树组件的节点越来越多&#xff0c;导致页面在滚动这个树组件的时候浏览器就很容易卡死。这种问题基本上都是因为dom节点太多&#xff0c;导致的浏览器卡顿&#xff0c;这里很明显就需要用到虚拟列表的技术&…...

七、数据库的完整性

七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...

纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join

纯 Java 项目&#xff08;非 SpringBoot&#xff09;集成 Mybatis-Plus 和 Mybatis-Plus-Join 1、依赖1.1、依赖版本1.2、pom.xml 2、代码2.1、SqlSession 构造器2.2、MybatisPlus代码生成器2.3、获取 config.yml 配置2.3.1、config.yml2.3.2、项目配置类 2.4、ftl 模板2.4.1、…...

jmeter聚合报告中参数详解

sample、average、min、max、90%line、95%line,99%line、Error错误率、吞吐量Thoughput、KB/sec每秒传输的数据量 sample&#xff08;样本数&#xff09; 表示测试中发送的请求数量&#xff0c;即测试执行了多少次请求。 单位&#xff0c;以个或者次数表示。 示例&#xff1a;…...

R 语言科研绘图第 55 期 --- 网络图-聚类

在发表科研论文的过程中&#xff0c;科研绘图是必不可少的&#xff0c;一张好看的图形会是文章很大的加分项。 为了便于使用&#xff0c;本系列文章介绍的所有绘图都已收录到了 sciRplot 项目中&#xff0c;获取方式&#xff1a; R 语言科研绘图模板 --- sciRplothttps://mp.…...

Golang——7、包与接口详解

包与接口详解 1、Golang包详解1.1、Golang中包的定义和介绍1.2、Golang包管理工具go mod1.3、Golang中自定义包1.4、Golang中使用第三包1.5、init函数 2、接口详解2.1、接口的定义2.2、空接口2.3、类型断言2.4、结构体值接收者和指针接收者实现接口的区别2.5、一个结构体实现多…...

2025-05-08-deepseek本地化部署

title: 2025-05-08-deepseek 本地化部署 tags: 深度学习 程序开发 2025-05-08-deepseek 本地化部署 参考博客 本地部署 DeepSeek&#xff1a;小白也能轻松搞定&#xff01; 如何给本地部署的 DeepSeek 投喂数据&#xff0c;让他更懂你 [实验目的]&#xff1a;理解系统架构与原…...