論文:C3: Zero-shot Text-to-SQL with ChatGPT
????
arXiv:2307.07306,浙大
Code:C3SQL | GitHub
一、論文速讀
使用 ChatGPT 來解決 Text2SQL 任務時,few-shots ICL 的 setting 需要輸入大量的 tokens,這有點昂貴且可能實際不可行。因此,本文嘗試在 zero-shot 的 setting 下來解決 Text2SQL 問題。
本文提出了 C3 來基于 ChatGPT zero-shot 去做 Text2SQL,實現了 1000 tokens per query 下優于 fine-tuning-based methods。
二、C3
C3 由三個關鍵組件構成:Clear Prompts(CP)、Calibration with Hints(CH)、Consistency Output(CO),分別對應著模型輸入、模型偏差和模型輸出。
2.1 Clear Prompts 組件
Clear Prompts(CP)組件的目標是為 ChatGPT 解決 Text2SQL 任務構建一個有效的 prompt。它由兩部分組成:Clear Layout 和 Clear Context。
2.1.1 Clear Layout
在 Text2SQL 中,有兩種 prompt layout 的 styles:
- 類型 1:Complicated Layout:這種類型的 prompt 直接將 instruction、question 和 context 拼接起來,看起來較為雜亂,如下圖的 (a) 所示
- 類型 2:Clear Layout:這種類型的 prompt 使用一個明顯的分隔符將 instruction、question 和 context 分開,看起來更加清晰,如下圖的 (b) 所示
論文指出,從直覺和實驗上,都證明了 clear layout 能產生更好的表現。因此本文主要使用改進后的 clear layout。
但是,論文發現直接使用上圖的 (b) 作為 prompt 會在生成的 SQL 中產生冗余的 columns,為了解決這個問題,論文在 instruction 部分后面加了一句:and do not select extra columns that are not explicitly requested in the query。
2.1.2 Clear Context
論文指出,在 prompt context 中包含整個 db schema 會導致兩個問題:
- 在 prompt 引入過多的不相關 schema items 會讓 ChatGPT 生成 SQL 時增加不相關 items 的 likelihood。
- 使用完整的 db schema 會讓文本長度過大,導致不必要的 API tokens 開銷
為此,論文提出需要先進行 schema linking 以召回相關的 tables 和 columns,并只將相關的信息放入 prompt context 中。
本文提出了一個 ChatGPT-based zero-shot 的 schema linking 的方法,分成兩步:
- Table Recall:使用一個 prompt 讓 ChatGPT 召回相關 tables
- Column Recall:基于 table recall 的結果,使用 prompt 讓 ChatGPT 進一步召回相關 columns
Table Recall 的 prompt 示例如下:
Column Recall 的 prompt 示例如下:
2.2 Calibration with Hints 組件
論文通過分析生成的 SQL query,發現了幾個由于 ChatGPT 固有的 biases 造成的 errors:
- Bias 1:ChatGPT 在 output 中傾向于保守,SELECT 語句中經常出現與問題相關但不是必需的列。而且在涉及到數量問題時尤為明顯。比如下圖的左邊第一個問題,
COUNT(*)
僅用于排序,但 ChatGPT 在 SELECT 中也將其輸出了。 - Bias 2:ChatGPT 編寫 SQL 時傾向于使用 LEFT JOIN、OR、IN,但經常無法正確使用它們。這種 bias 通常會導致執行結果中出現額外的值。
為了校準這些 bias,論文使用一個單獨的組件來實施校準策略:Calibration with Hints(CH)。
論文通過將用于修正 Bias 的先驗知識注入到與 ChatGPt 的歷史對話中。在對話 history 中,我們讓 ChatGPT 認為自己是一個優秀的 SQL 編寫器,并引導它去遵循我們提出的 debias hints:
- Hint 1:針對第一個 bias,這里設計了一個 tip 去指導 ChatGPT 只選擇必要的 columns
- Hint 2:針對第二個 bias,這里設計了一個 tip 來防止 ChatGPT 濫用一些 SQL 關鍵字。如下圖所示,prompt 中直接要求 ChatGPT 盡量避免使用 LEFT JOIN、IN、OR,而使用 JOIN 和 INSERSECT,而且在適當時使用 DISTINCT 或 LIMIT,來避免重復的執行結果。
如下是一個示例:
2.3 Consistency Output 組件
由于 LLM 固有的隨機性,ChatGPT 的輸出是不穩定的。這里將 Text2SQL 也視為 reasoning 問題,于是使用 self-consistency 思想來提高效果。
論文提出了一個 execution-based self-consistency for Text2SQL 方法,封裝為這里的 Consistency Output(CO)組件,用于選擇 LLM 生成的 SQL。
這里的思想是,讓 LLM 通過多個推理路徑來生成多個 SQL answers,然后移除掉其中 execution error 的 SQL,并對剩余的 SQL 進行投票,從而選出最終的答案。
2.4 總結
C3 的整體框架如下:
三、實驗
論文在 Spider 數據集上使用 Execution Accuracy(EX)作為指標來測試。
整體上的實驗發現,C3 在 Spider 測試集上優于所有傳統的基于微調的方法,在 Spider 排行榜上排名第二。與 top-1 方法的 few-shots settings 的 DIN-SQL 相比,只使用了約 10% 的 token 數量,而且這里使用的 GPT-3.5 在成本上也低于 DIN-SQL 使用的 GPT-4。所以,C3 方法更加預算友好。
此外,論文還做了不少的消融實驗,總結了 error cases 的分析,具體可參考原論文。
四、總結
本文提出的 C3 基于 ChatGPT 實現了 zero-shot Text2SQL,并取得了 zero-shot 的最好性能。
C3 從模型輸入、模型偏差和模型輸出三個角度為基于 GPT 的 Text2SQL 提供了系統的處理方法。這些方法值得后面的研究來參考。