【Text2SQL 論文】DIN-SQL:分解任務 + 自我糾正 + in-context 讓 LLM 完成 Text2SQL

論文:DIN-SQL: Decomposed In-Context Learning of Text-to-SQL with Self-Correction

????

NeurIPS 2023, arXiv:2304.11015

Code: Few-shot-NL2SQL-with-prompting | GitHub

文章目錄

    • 一、論文速讀
      • 1.1 Schema Linking Module
      • 1.2 Classification & Decomposition Module
      • 1.3 SQL Generation Module
        • 1.3.1 EASY 類型
        • 1.3.2 NON-NESTED 類型
        • 1.3.3 NESTED 類型
      • 1.4 Self-correction Module
    • 二、Error cases 分析
    • 三、總結

一、論文速讀

這篇論文通過對 LLM 做 prompt 來實現 Text2SQL,過程中通過 prompt 讓 LLM 分解任務來降低難度,每個子任務通過 in-context learning 讓 LLM 來完成,并在完成 SQL 生成后,通過 self-correction 來檢查和糾正可能有錯誤的 SQL。最終,在執行精確度指標上超越了現有的 SOTA 模型。

生成 SQL 被分成四個階段:

  1. Schema Linking:輸入 NL query 和 DB schema,找出與 query 相關的 tables、columns 以及不同表之間的外鍵關系
  2. Classification & Decomposition:將 query 分成了三種不同的難度:EASY、NON-NESTED、NESTED
  3. SQL Generation:根據不同類型的 query,按照不同的策略來生成對應的 SQL
  4. Self-correction:通過 prompt 來讓 LLM 檢查和糾正可能錯誤的 SQL

在這里插入圖片描述

1.1 Schema Linking Module

這個 module 輸入 NL query 和 DB 的 schema 信息,輸出的是將 query 鏈接到 DB 中的一些信息,具體來說輸出就是:

  1. table 和 columns 的名稱:找到 query 中涉及到的 DB 的 table 和 columns 的名稱
  2. 條件值:從查詢中提取出用于條件過濾的值,比如在查詢“Find the departments with a budget greater than 500”中,需要提取出條件值“500”。
  3. 外鍵關系的確定:如果查詢涉及到多個表,需要確定它們之間的關系,如通過外鍵連接。

下面是使用 in-context learning + CoT 來讓 LLM 做 schema-linking 的示例:

在這里插入圖片描述

demostration 的一個示例如下:

Table advisor, columns = [*,s_ID,i_ID]
Table classroom, columns = [*,building,room_number,capacity]
Table course, columns = [*,course_id,title,dept_name,credits]
Table department, columns = [*,dept_name,building,budget]
Table instructor, columns = [*,ID,name,dept_name,salary]
Table prereq, columns = [*,course_id,prereq_id]
Table section, columns = [*,course_id,sec_id,semester,year,building,room_number,time_slot_id]
Table student, columns = [*,ID,name,dept_name,tot_cred]
Table takes, columns = [*,ID,course_id,sec_id,semester,year,grade]
Table teaches, columns = [*,ID,course_id,sec_id,semester,year]
Table time_slot, columns = [*,time_slot_id,day,start_hr,start_min,end_hr,end_min]
Foreign_keys = [course.dept_name = department.dept_name,instructor.dept_name = department.dept_name,section.building = classroom.building,section.room_number = classroom.room_number,section.course_id = course.course_id,teaches.ID = instructor.ID,teaches.course_id = section.course_id,teaches.sec_id = section.sec_id,teaches.semester = section.semester,teaches.year = section.year,student.dept_name = department.dept_name,takes.ID = student.ID,takes.course_id = section.course_id,takes.sec_id = section.sec_id,takes.semester = section.semester,takes.year = section.year,advisor.s_ID = student.ID,advisor.i_ID = instructor.ID,prereq.prereq_id = course.course_id,prereq.course_id = course.course_id]
Q: "Find the buildings which have rooms with capacity more than 50."
A: Let’s think step by step. In the question "Find the buildings which have rooms with capacity more than 50.", we are asked:
"the buildings which have rooms" so we need column = [classroom.capacity]
"rooms with capacity" so we need column = [classroom.building]
Based on the columns and tables, we need these Foreign_keys = [].
Based on the tables, columns, and Foreign_keys, The set of possible cell values are = [50]. So the Schema_links are:
Schema_links: [classroom.building,classroom.capacity,50]

如下面代碼所示,schema linking 的結果就是從 GPT 的響應中解析出 Schema_links: 這個字符串后面的內容:

在這里插入圖片描述

1.2 Classification & Decomposition Module

這一步將 query 分成三種不同的復雜度的類:

  • EASY:沒有 JOIN 和 NESTING 的單表查詢
  • NON-NESTED:需要 JOIN 但不需要子查詢的查詢
  • NESTED:可以包含 JOIN、sub-query 和 set opr

下面是一個該 module 的示例:

在這里插入圖片描述

這部分代碼如下:

在這里插入圖片描述

1.3 SQL Generation Module

這一個 module 根據 query 的復雜度類型,使用不同的策略來生成 SQL。

1.3.1 EASY 類型

對于 EASY 類型的 question,不需要中間步驟,只需要少量提示就足夠了,下面是一個 exemplar:

Q: "Find the buildings which have rooms with capacity more than 50."
Schema_links: [classroom.building,classroom.capacity,50]
SQL: SELECT DISTINCT building FROM classroom WHERE capacity  >  50

即要求 LLM 根據 question 和 schema links 輸出 SQL。

1.3.2 NON-NESTED 類型

對于 NON-NESTED 類型的 question,啟發 LLM 去思考從而生成 SQL,下面是一個 exemplar:

Q: "Find the total budgets of the Marketing or Finance department."
Schema_links: [department.budget,department.dept_name,Marketing,Finance]
A: Let’s think step by step. For creating the SQL for the given question, we need to join these tables = []. First, create an intermediate representation, then use it to construct the SQL query.
Intermediate_representation: select sum(department.budget) from department  where  department.dept_name = \"Marketing\"  or  department.dept_name = \"Finance\"
SQL: SELECT sum(budget) FROM department WHERE dept_name  =  'Marketing' OR dept_name  =  'Finance'

也就是輸入 question 和 schema links,然后加一句 Let's think step by step 啟發 LLM 思考,從而得到 SQL。

1.3.3 NESTED 類型

在 “Classification & Decomposition Module” 模塊中,除了為其復雜度分類,還會為 NESTED 類型的 user question 生成 sub-question,如下圖:

在這里插入圖片描述

然后,這里的 sub-questions 會被傳入 SQL Generation Module 的 prompt 中用于解決 NESTED 類型的 SQL 生成。下面是一個 exemplar:

Q: "Find the title of courses that have two prerequisites?"
Schema_links: [course.title,course.course_id = prereq.course_id]
A: Let's think step by step. "Find the title of courses that have two prerequisites?" can be solved by knowing the answer to the following sub-question "What are the titles for courses with two prerequisites?".
The SQL query for the sub-question "What are the titles for courses with two prerequisites?" is SELECT T1.title FROM course AS T1 JOIN prereq AS T2 ON T1.course_id  =  T2.course_id GROUP BY T2.course_id HAVING count(*)  =  2
So, the answer to the question "Find the title of courses that have two prerequisites?" is =
Intermediate_representation: select course.title from course  where  count ( prereq.* )  = 2  group by prereq.course_id
SQL: SELECT T1.title FROM course AS T1 JOIN prereq AS T2 ON T1.course_id  =  T2.course_id GROUP BY T2.course_id HAVING count(*)  =  2

exemplar 的 prompt 的組成如下:

在這里插入圖片描述

可以看到,這就是輸入 question、sub-questions、schema links 來生成 SQL。

1.4 Self-correction Module

這一模塊的目的是通過 prompt 讓 LLM 來檢查和糾正生成的 SQL 中可能的錯誤。這里的 prompt 如下:

在這里插入圖片描述

這里的 prompt 讓 LLM 多關注自己在生成 SQL 時容易犯的錯。

二、Error cases 分析

論文對 error cases 做了分析,總結了如下 LLM 容易出的錯:

  • Schema linking:這類是犯錯最多的情況,指的是 model 錯誤地識別出 question 中提到的 column names、table names 或者 entities。
  • JOIN:第二大類情況,指的是 model 不能識別出所有需要的 tables 以及正確地將這些 tables 連接起來的外鍵。
  • GROUP BY:在生成 GROUP BY 子句時,可能會遺漏或者選錯列
  • Queries with nesting and set operations:模型不能識別出 nested structure 或者不能檢測出正確的 nesting 或 set 操作
  • Invalid SQL:一部分 SQL 有語法錯誤且不能執行
  • Miscellaneous:還有其他亂七八糟的原因,比如缺少 predicate、缺少或冗余 DISTINCT、DESC 等關鍵字

這些容易犯的錯,都會在 self-correction module 被多關注來檢查和糾正。

三、總結

本論文設計的 prompt 以及思路讓 LLM 在解決 Text2SQL 任務上有了不錯的表現,產生了與最先進的微調方法相當甚至更優的結果。

但是,本文的思路需要多輪與 LLM 交互,從而產生了巨大的花費和延遲,論文給出,在使用 GPT4 響應 Spider 數據集中 question 時表現出大約 60s 的延遲。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/20009.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/20009.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/20009.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【每日刷題】Day52

【每日刷題】Day52 🥕個人主頁:開敲🍉 🔥所屬專欄:每日刷題🍍 🌼文章目錄🌼 1. 2965. 找出缺失和重復的數字 - 力扣(LeetCode) 2. 350. 兩個數組的交集 II …

kaggle競賽系列基于圖像對水稻分類代碼案例

目錄 依賴環境 代碼 導入依賴包 定義數據集路徑: 創建訓練集、驗證集和測試集的文件夾: 代碼的作用: 設置新的數據集路徑與類別名稱 代碼的作用: 定義數據預處理和增強變換: 代碼的作用: 定義數…

【源碼】多語言H5聊天室/thinkphp多國語言即時通訊/H5聊天室源碼/在線聊天/全開源

多語言聊天室系統,可當即時通訊用,系統默認無需注冊即可進入群聊天,全開源 【海外聊天室】多語言H5聊天室/thinkphp多國語言即時通訊/H5聊天室源碼/在線聊天/全開源 - 吾愛資源網

每日5題Day13 - LeetCode 61 - 65

每一步向前都是向自己的夢想更近一步,堅持不懈,勇往直前! 第一題:61. 旋轉鏈表 - 力扣(LeetCode) /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;…

STM32學習和實踐筆記(32):電容觸摸按鍵實驗

1.電容觸摸按鍵原理介紹 觸摸按鍵與傳統的機械按鍵相比,不僅美觀而且耐用、壽命長,它顛覆了傳統意義上的機械按鍵控制,只要輕輕觸摸,就可以實現按鍵開關的控制、量化調節甚至方向控制。觸摸按鍵已廣泛應用于手機、DVD、洗衣機等消…

宿舍管理系統帶文檔java項目基于springboot+vue的宿舍管理系統

文章目錄 宿舍管理系統一、項目演示二、項目介紹三、八千字項目文檔四、部分功能截圖五、部分代碼展示六、底部獲取項目源碼和8000字論文參考(9.9¥帶走) 宿舍管理系統 一、項目演示 宿舍管理系統 二、項目介紹 基于springbootvue的前后端分…

MVC、MVP 和 MVVM 架構總結

MVC、MVP 和 MVVM 是常見的軟件架構模式,主要用于組織應用程序的結構,特別是在用戶界面和業務邏輯之間進行分離。以下是對它們的詳細解釋,包括它們的差異、優缺點。 MVC(Model-View-Controller) 結構 Model&#xf…

C++的繼承(十一):私有繼承和受保護的繼承

但凡用過C的人都知道&#xff1a;私有繼承的成員在派生類里均為私有&#xff0c;受保護的繼承公有和受保護的成員在派生類里為受保護。另外C不對私有繼承和受保護的繼承的派生類指針自動轉化為基礎類。 #include <stdio.h> struct X {int a;X():a(9) {}int sqare() {ret…

5.nginx平滑升級

nginx平滑升級 一、nginx平滑升級1、下載新版本的安裝包2、以之前的安裝參數來編譯新版本軟件3、將新版本的nginx拷貝到安裝目錄4、啟動新版本進程5、平緩關閉舊工作進程6、清理舊版本的nginx 一、nginx平滑升級 USR2 啟動新版本進程 WINCH 平緩關閉舊工作進程 1、下載新版本…

分層注入的設計模式-上下層文件相互包含解決辦法

現象&#xff1a;上下層文件相互包含 寫代碼時&#xff0c;會不會遇到&#xff0c;業務層內容要在底層硬件程序里寫&#xff0c; 例如&#xff1a;一個外部按鍵&#xff0c;按鍵中斷要觸發一個應用層業務。 業務就要寫道IO中斷里&#xff0c;這個代碼就要用到上層一些函數和變…

在長窗口時代,RAG技術是否仍然必要?

自從谷歌推出 Gemini 1.5 Pro&#xff0c;行業內部對于 RAG 的討論就不絕于耳。 Gemini 1.5 Pro 的性能確實令人矚目。根據谷歌公布的技術文檔&#xff0c;該系統能夠穩定處理長達 100 token 的內容&#xff0c;相當于一小時的視頻、十一小時的音頻、超過三萬行的代碼或七十萬…

【VTKExamples::Utilities】第十七期 ZBuffer

很高興在雪易的CSDN遇見你 VTK技術愛好者 QQ:870202403 公眾號:VTK忠粉 前言 本文分享VTK樣例ZBuffer,并解析接口vtkWindowToImageFilter,希望對各位小伙伴有所幫助! 感謝各位小伙伴的點贊+關注,小易會繼續努力分享,一起進步! 你的點贊就是我的動力(^U^)ノ…

24 _ 分層和合成機制:為什么CSS動畫比JavaScript高效?

在上一篇文章中我們分析了CSS和JavaScript是如何影響到DOM樹生成的&#xff0c;今天我們繼續沿著渲染流水線向下分析&#xff0c;來聊聊DOM樹之后所發生的事情。 在前面《05 | 渲染流程&#xff08;上&#xff09;&#xff1a;HTML、CSS和JavaScript文件&#xff0c;是如何變成…

linux下can-utils的使用以及can接口的配置(以ubuntu20.04為例)

linux下can-utils的使用以及can接口的配置&#xff08;以ubuntu20.04為例&#xff09; can-utils是什么 can-utils 是一套用于Linux操作系統的開源工具&#xff0c;專門用來處理與CAN&#xff08;Controller Area Network&#xff09;總線相關的任務。CAN總線廣泛應用于汽車和…

C語言文件操作:打開關閉,讀寫

程序文件 源程序文件&#xff08;后綴為.c&#xff09; 目標文件&#xff08;Windows環境后綴為.obj&#xff09; 可執行文件&#xff08;Windows環境后綴為.exe&#xff09; fputc FILE* pf fopen("test.txt","w");if (pf NULL){printf("%s\n"…

深入理解Qt計算器應用的構建過程

新書上架~&#x1f447;全國包郵奧~ python實用小工具開發教程http://pythontoolsteach.com/3 歡迎關注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目錄 一、數字按鈕的信號與槽函數連接 二、運算符按鈕的信號與槽函數連接 三、特殊按鈕的信號與…

紅外超聲波雷達測距(water)

文章目錄 一 RS-232二 RS485三 Modbus四 stm32多路超聲波測距4.1 設計方案4.2 代碼 參考資料總結 實驗要求 一. 采用stm32F103和HC-SR04超聲波模塊&#xff0c; 使用標準庫或HAL庫 定時器中斷&#xff0c;完成1或2路的超聲波障礙物測距功能。 1&#xff09;測試數據包含噪聲&am…

Bezier Python 用法:深入探索與實用指南

Bezier Python 用法&#xff1a;深入探索與實用指南 在數字圖形學和計算機編程中&#xff0c;貝塞爾曲線&#xff08;Bezier Curves&#xff09;是一種重要的參數曲線&#xff0c;被廣泛應用于二維圖形應用程序中&#xff0c;如字體輪廓、矢量圖形和動畫等。Python作為一種功能…

EukRep:區分真核和原核序列

https://github.com/patrickwest/EukRep 安裝 conda create -y -n eukrep-env -c bioconda scikit-learn0.19.2 eukrep mamba install -c conda-forge numpy1.19.5 使用 EukRep -i <Sequences in Fasta format> -o <Eukaryote sequence output fasta file>

【Linux】線程ID

大致草稿—————————— 思維導圖 學習目標 一、線程ID的理解 1.1 引出對tid的理解 我們先來創建一個線程復習一下線程的函數&#xff1a; pthread_t tid; // 創建一個線程 pthread_create(&tid, nullptr, threadrun, (void*)"thread-1"); // 打印出…