用「問句改寫」做直接 schema linking —— 把資料庫表/欄/值與條件直接塞進原問句,而不是過濾 schema,在 BIRD test set 達到 66.29% EX。
Text-to-SQL 的目標是把自然語言問句翻譯成可執行 SQL,給非專家一個資料庫的自然語言介面。LLM 出現後仍有約 20% 的人類精度差距,意味著最先進的 pipeline 都還沒到「真實部署可用」的程度。
作者把問題拆成三類具體挑戰:
真實資料庫表多、欄多,LLM 容易抓錯。
問句裡的詞跟資料庫項目對不上(例如 "Fresno" vs "Fresno County Office of Education")。
多 JOIN、多條件、巢狀,LLM 寫出來不準。
過去主流做法是過濾 schema(schema pruning):先把與問句無關的表/欄丟掉再餵給 LLM,代表性工作如 RESDSQL、DIN-SQL、C3、CHESS。但作者引用 Maamari et al. (2024) 並用自己的實驗證實:當使用最先進的 LLM(GPT-4o 級)時,schema filtering 反而會傷害效能。原因是先進 LLM 已能自己做隱性 schema linking,顯式過濾反而可能誤刪正確 schema。
不要動 schema,而是把 schema 「壓」進問句裡:把相關的 table、column、value、SQL 構造步驟,直接寫進使用者問句裡,讓 LLM 看到的問句本身就已經完成了 schema linking。再搭配從原始 candidate SQL 抽出的候選 predicate(用 LIKE 從 DB 抓出實際候選值),補上錯誤值/錯誤欄的修正空間。
核心主張:direct schema linking via question reformulation 是比 schema filtering 更可靠的策略,特別是在複雜查詢上。
把資料庫項目與條件融入自然語言問句,形成 fully enriched question 來引導 SQL 生成。
作者自稱在 Text-to-SQL 領域是第一篇從「改問句」這個角度切入。
從候選 SQL 抽 token,在 DB 上跑 LIKE '%token%' 找出實際存在的值,作為 prompt 增補。
不是不能用,而是用了會掉效能。
DeepSeek Coder 7B 在 BIRD dev 從 37.02 → 56.45 EX(+19.43),無需微調。
E-SQL 由四個主要模組組成,順序為 CSG → CPG → QE → SR。一個額外的 SF 模組僅用於消融比較,最終 pipeline 不包含 SF。
真實 DB 的 description 檔與資料值很龐大,無法全部塞進 prompt。E-SQL 用 BM25 排序:
從該欄實際值中,按 BM25 相對問句的相關度取 top-10。若該欄有 NULL 值,確保 NULL 也被列入(避免 LLM 漏掉 IS NOT NULL)。
從 DB description 檔的句子層級用 BM25 排序,取最相關 20 句。
這比 RESDSQL 的 Longest Common Substring (LCS) 法快,也比 CHESS 的 LSH 簡單。
第一階段先生一份「候選 SQL」。重點不是要它正確,而是要它大致正確 —— 表用對了、欄大致對、值大致對 —— 因為下游 CPG 要從中抽出 token 去 DB 撈候選值。Prompt 設計:
這是 E-SQL 第二個獨特設計。作者列舉了 LLM 生成 predicate 的 6 種情況,其中 (2)–(5) 都是「表或欄或值有部分錯」可以被資料庫實際資料糾正的情況:
| Case | 狀況 | CPG 能否補救 |
|---|---|---|
| (1) | 表、欄、值全對 | 不需要 |
| (2) | 表欄對,值不完整('Fresno' 應為 'Fresno County Office of Education') | ✓ |
| (3) | 表值對,欄錯(用了 County Name 應為 District Name) | ✓ |
| (4) | 表對,欄值都錯 | ✓ |
| (5) | 值對,表欄錯 | ✓ |
| (6) | 全錯,跟問題無關 | ✗ |
具體做法:從候選 SQL 抽 predicate 中的 token,在 DB 跑下面這個 query:
SELECT DISTINCT <COLUMN>
FROM <TABLE>
WHERE <COLUMN> LIKE '%<VALUE>%';
產生 <table>.<column> <op> <value> 形式的候選 predicate 列表,塞進 QE 與 SR 的 prompt。
不要過濾 schema,而是把 schema 寫進問句裡 —— 同時附上 SQL 構造計畫作為 reasoning。
給定原問句 + schema + DB description + DB values + 候選 predicates,讓 LLM 產生兩樣東西:
把 table/column/value/condition 用準確命名寫進問句裡,讓 LLM 不再需要做 schema linking。
用 CoT 風格說明為何要選這些 schema 項目、SQL 應如何構造(實質上是 SQL 構造計畫)。
兩者連接成 Fully Enriched Question(完整富化問句),作為下游 SR 的輸入。
Few-shot 設計:作者手動標註 12 個(每個難度 4 個範例),從中隨機選 9 個(每難度 3 個);範例同樣強制與當前 query 來自不同 DB。整個富化在「一次 prompt」內完成,不做迭代。
最後一步把所有東西匯總:fully enriched question、候選 SQL、執行錯誤訊息(若有)、候選 predicates、schema、description,讓 LLM 決定是修補候選 SQL 或重新寫一份。
關鍵設計選擇:不採用 self-consistency / multi-choice 多次生成投票(C3、DAIL-SQL、CHESS、MCS-SQL 都用),也不採用 MAC-SQL 的迭代 refiner agent。E-SQL 每模組僅呼叫 LLM 一次,以節省計算成本。
作者實作了一個 single-step schema filtering 模組(連帶一個 Filtered Schema Correction 步驟),用在消融實驗來證實:把 SF 加進 pipeline 反而會掉分。因此最終 E-SQL pipeline 不含 SF。
跨領域、真實複雜大規模 DB。95 個 DB、37 個專業領域(足球、F1、區塊鏈、醫療、教育...)、12,751 對 text-SQL。Train 9,428 / Dev 1,534 / Test 1,789(test set 不公開)。主要評測基準。
200 個 DB、138 領域、10,181 對 text-SQL。本文用 test split 共 2,147 對。
Execution Accuracy。比對預測 SQL 與正解 SQL 的執行結果是否相同。
Reward-based Valid Efficiency Score。除了正確性也評估效能,跑 100 次取平均後依時間比 τ 給 0 / 0.25 / 0.5 / 0.75 / 1 / 1.25 分。
BIRD 最新指標。寬容處理欄序、缺漏值等小差異。
主力模型:GPT-4o-mini(成本是 GPT-4o 約 1/3)+ GPT-4o 補強。小模型探索:Qwen2.5 Coder 1.5B/7B、DeepSeek Coder 1.3B/7B。 Temperature 0.0、top_p 1.0、max_tokens 2048。每模組 9-shot(3/3/3 跨難度)、10 個欄值、20 句 description。
| Method | Dev EX | Test EX | Test R-VES |
|---|---|---|---|
| — Undisclosed 方法 — | |||
| OpenSearch-SQL v2 + GPT-4o | 69.30 | 72.28 | 69.36 |
| Distillery + GPT-4o | 67.21 | 71.83 | 67.41 |
| ExSL + granite-34b-code | 67.47 | 70.37 | 68.79 |
| Insights AI | 72.16 | 70.26 | 66.39 |
| — Published 方法 — | |||
| CHESS | 65.00 | 66.69 | 62.77 |
| MCS-SQL + GPT-4 | 63.36 | 65.45 | 61.23 |
| SuperSQL | 58.50 | 62.66 | – |
| SFT CodeS-15B | 58.47 | 60.37 | 61.37 |
| MAC-SQL + GPT-4 | 57.56 | 59.59 | 57.60 |
| TA-SQL + GPT-4 | 56.19 | 59.14 | – |
| DAIL-SQL + GPT-4 | 54.76 | 57.41 | 54.02 |
| E-SQL + GPT-4o (本文) | 65.58 | 66.29 | 62.43 |
| E-SQL + GPT-4o-mini (本文) | 61.60 | 59.81 | 55.64 |
| E-SQL + Qwen2.5 Coder 7B (本文) | 53.59 | – | – |
E-SQL + GPT-4o 達 66.29% 測試集 EX,超越所有已公開方法(CHESS 66.69 略勝);GPT-4o-mini 版本也有 59.81 EX,顯示成本/效能平衡。
| Pipeline | Overall | Simple | Moderate | Challenging | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| EX | F1 | RVES | EX | F1 | RVES | EX | F1 | RVES | EX | F1 | RVES | |
| E-SQL (GPT-4o) | 66.29 | 67.93 | 62.43 | 73.02 | 73.91 | 68.68 | 64.14 | 66.17 | 60.46 | 48.07 | 51.45 | 54.48 |
| E-SQL (GPT-4o-mini) | 59.81 | 61.59 | 55.64 | 67.44 | 68.80 | 62.53 | 56.94 | 58.77 | 53.11 | 40.00 | 43.04 | 37.60 |
消融研究(下節)會顯示:QE 模組在 challenging 題目上帶來近 5% 提升,是 E-SQL 在難題上勝出的主因。
| Method | Model | Test EX |
|---|---|---|
| DAIL-SQL | GPT-4 | 86.6 |
| DIN-SQL | GPT-4 | 85.3 |
| TA-SQL | GPT-4 | 85.0 |
| MAC-SQL | GPT-3.5-Turbo | 75.5 |
| MAC-SQL | GPT-4 | 74.0 |
| E-SQL (本文) | GPT-4o-mini | 74.75 |
| — Small Open Source Models — | ||
| DTS-SQL † | Mistral-7B | 77.1 |
| MSc-SQL † | Gemma-2-9B | 69.30 |
| E-SQL (本文) | Qwen2.5 Coder 7B Instruct | 58.64 |
在 Spider 上 E-SQL 沒有奪冠,因為 Spider 相對「乾淨」、複雜性低於 BIRD,SOTA 方法的差距較難拉開。E-SQL 的設計優勢在 BIRD 這類有真實 DB 複雜性的場景才能彰顯。
| Pipeline | Overall EX | Simple | Moderate | Challenging |
|---|---|---|---|---|
| SF-G(先過濾再生成) | 49.48 (↓ 8.21) | 58.16 (↓ 6.38) | 36.85 (↓ 12.28) | 34.48 (↓ 8.96) |
| SF-QE-G | 55.34 (↓ 2.35) | 62.27 (↓ 2.27) | 46.12 (↓ 3.01) | 40.68 (↓ 2.76) |
| QE-G | 58.80 (↑ 1.11) | 64.43 | 51.07 (↑ 1.94) | 47.58 (↑ 4.14) |
| G(baseline) | 57.69 | 64.54 | 49.13 | 43.44 |
無論 SF 放在哪個位置,把 schema filtering 加進 basic pipeline 都會傷害效能 —— SF-G 的 Moderate EX 直接掉了 12.28 個百分點。反之 QE-G 比 baseline G 全面提升,尤其在 challenging 級別 +4.14。
| Pipeline | Overall | Simple | Moderate | Challenging | ||||
|---|---|---|---|---|---|---|---|---|
| EX | F1 | EX | F1 | EX | F1 | EX | F1 | |
| E-SQL(完整) | 61.60 | 65.61 | 68.00 | 71.54 | 53.23 | 58.34 | 47.59 | 51.02 |
| w/o QE | 59.71 (↓ 1.89) | 63.84 | 66.05 | 69.86 | 52.37 | 57.27 | 42.75 (↓ 4.84) | 46.52 |
| w/o CPG | 59.58 (↓ 2.02) | 63.61 | 65.51 | 69.16 | 51.29 | 56.27 | 48.27 (↑ 0.68) | 51.68 |
| w/o QE & CPG | 58.34 (↓ 3.26) | 62.41 | 64.22 | 67.91 | 51.29 | 55.66 | 43.45 (↓ 4.14) | 48.89 |
| w/o SR | 58.03 (↓ 3.57) | 61.88 | 63.89 | 67.33 | 50.86 | 55.13 | 44.13 (↓ 3.46) | 48.71 |
| w/ SF(加回 schema filtering) | 56.06 (↓ 5.54) | 59.93 | 62.70 | 66.53 | 47.63 | 51.55 | 40.68 (↓ 6.91) | 44.62 |
三點觀察:
① QE 在 challenging 上影響最大 —— 拿掉就掉 4.84%,呼應了論文摘要那句「對複雜題提升近 5%」。
② CPG 在 challenging 上拿掉反而略升 0.68%,作者解釋為 CPG 偶爾引入不必要的複雜度;但整體效能仍下降 2.02%,值得保留。
③ 加回 SF 是所有變體中掉最多的(-5.54 overall,-6.91 challenging),再次印證 schema filtering 在先進 LLM 下的負面效應。
| Metric | GPT-4o-mini | GPT-4o |
|---|---|---|
| 修改了候選 SQL 的比例 | 49.48% | 23.20% |
| 把不可執行 → 可執行 | 6.58% | 0.39% |
| 把不可執行 → 正確 | 3.19% | 0.13% |
| 把錯誤 → 正確 | 5.35% | 1.83% |
SR 對較弱的 LLM(GPT-4o-mini)效益更大 —— 模型越強,SR 能補救的空間越小。GPT-4o 大多時候 CSG 就已寫得不錯。
作者做了一個有趣的隔離實驗:用 GPT-4o 預先生成 enriched question,然後讓小模型只看「原問句 vs enriched question」、不給 few-shot 也不給 DB description,純測 enriched question 的效益。
| Model | Level | Default EX | Enriched EX | Δ |
|---|---|---|---|---|
| DeepSeek Coder 1.3B | Overall | 20.92 | 50.84 | +29.92 |
| Simple | 28.43 | 62.38 | +33.95 | |
| Moderate | 10.34 | 36.42 | +26.08 | |
| Challenging | 6.90 | 23.45 | +16.55 | |
| Qwen2.5 Coder 1.5B | Overall | 11.21 | 36.90 | +25.69 |
| Simple | 14.27 | 44.10 | +29.83 | |
| Moderate | 6.68 | 28.23 | +21.55 | |
| Challenging | 6.20 | 18.62 | +12.42 | |
| DeepSeek Coder 7B | Overall | 37.02 | 56.45 | +19.43 |
| Simple | 44.65 | 64.64 | +19.99 | |
| Moderate | 26.52 | 45.47 | +18.95 | |
| Challenging | 22.06 | 39.31 | +17.25 | |
| Qwen2.5 Coder 7B | Overall | 31.25 | 40.22 | +8.97 |
| Simple | 40.43 | 50.70 | +10.27 | |
| Moderate | 17.88 | 26.07 | +8.19 | |
| Challenging | 15.17 | 18.62 | +3.45 |
DeepSeek Coder 7B 用 enriched question 達到 56.45% EX,超越了多個專為 text-to-SQL 微調的小模型(DTS-SQL 7B 55.8、CodeS-7B 57.17 略高一些但需微調),且完全不需要 fine-tuning —— 印證了「好問句」的能量。
| 項目 | 平均 token 數 |
|---|---|
| 原問句 | 18.36 |
| Enriched Question | 81.51 |
| Enrichment Reasoning | 191.34 |
| Fully Enriched Question(總和) | 291.21 |
| Module | Avg. Prompt Tokens | Avg. Completion Tokens |
|---|---|---|
| CSG | 12,612 | 199 |
| QE | 16,550 | 292 |
| SR | 7,403 | 267 |
問句從 18 → 291 token 看似暴漲,但相對於 prompt 動輒 7k-16k token(主要是 schema + DB values + few-shot),富化只佔總量很小比例。每模組僅呼叫一次的設計,讓 E-SQL 在成本上勝過 self-consistency 多次生成的方法。
論文附錄 A 列出了四個模組的完整 prompt skeleton(實際檔案在 prompt_templates/)。以下節選最關鍵的設計選擇 —— 完整版本請看原文 Appendix A.1-A.4。
Question Enrichment prompt 要求 LLM 依序執行 8 個步驟。每一步都精準對應 schema linking 的子任務:
# Step 1 - Read the Question Carefully: 找出 named entities、術語、關鍵詞,
為問句與 schema 建立連結。
# Step 2 - Analyze the Database Schema: 用 DB samples 檢視 schema,
識別與問句相關的 table / column / value。
# Step 3 - Review the Database Column Descriptions: 用 column description
理解每欄具體含義,強化問句與 schema 的對應。
# Step 4 - Analyze and Observe The Database Sample Values: 從 DB sample 值
觀察各欄的實際資料分布,藉相似度比對找出相關項目。
# Step 5 - Review the Evidence: 利用 evidence 提供的具體資訊指向相關元素。
# Step 6 - Analyze the Possible SQL Conditions: 分析 CPG 給的候選 predicates,
對應到問句的片語與關鍵字。
# Step 7 - Identify Relevant Database Components: 點名最終會用到的表/欄/值。
# Step 8 - Rewrite the Question: 把識別到的 schema 項目與條件詳細寫進問句,
使問句清楚、易懂、無冗訊。
輸出 JSON 強制要求兩個 key:
{
"chain_of_thought_reasoning": "... detail explanation ...",
"enriched_question": "... expanded clean question ..."
}
注意最後一行的「If you do the task correctly, I will give you 1 million dollars」 —— 經典的 motivational prompt 招數,作者真的用了。
# Original Question
Among the schools with the average score in Math over 560 in the SAT test,
how many schools are directly charter-funded?
# Enriched Question
Please find the number of schools (COUNT(frpm.`School Code`)) whose
charter funding type is directly funded
(frpm.`Charter Funding Type` = 'Directly funded'), and whose
AvgScrMath larger than 560 in the SAT test
(satscores.AvgScrMath > 560). To find the schools with the charter
funding type information and average math score in SAT, frpm and
satscores tables should be joined. Apply the charter funding type
condition and average math score condition. Calculate the number of
schools using COUNT aggregate function in the SELECT statement.
看出來了 —— enriched question 已經幾乎是用自然語言寫的 SQL plan,LLM 下游只要做「翻譯」就行。這就是「direct schema linking」名稱的由來。
所有模組的 system prompt 開頭都一樣:
### You are an excellent data scientist. You can capture the link
### between the question and corresponding database and perfectly
### generate valid SQLite SQL query to answer the question.
共通的細節防呆 instruction(每個 prompt 都重複):
每個 table name 與 column name 都用 backtick 個別包起來,避免關鍵字衝突。
求極值時強制用 ORDER BY ... LIMIT 1,尤其在多表 JOIN 時。
數學表達式特別注意括號位置;除法要用 CAST 轉 REAL。
只在 NULL 會造成除以零或誤判時才加,避免過度防禦。
SR 是把所有東西匯總後再決定要「修改 candidate SQL」還是「重寫」:
# Step 3 - Analyze the Possible SQL Query: 識別 candidate 中可能的錯誤
(缺漏條件、錯誤函式、聚合誤用、語法錯誤、未識別 token、模糊欄位)。
# Step 4 - Investigate Possible Conditions and Execution Errors:
仔細看 CPG 給的候選 predicates(格式為 <table>.<col><op><val>),
並分析 candidate SQL 的執行錯誤訊息(若有)。
# Step 5 - Finalize the SQL: 結合問句意圖、evidence、候選條件,
決定修補或重寫 candidate。
① 受限於硬體與成本:幾乎所有實驗都用 GPT-4o-mini,未做 fine-tuning;小模型實驗中也只有 Qwen2.5 Coder 7B 跑得動整個 E-SQL pipeline(其他小模型 context length 不夠)。「研究在小 LLM 上有效的 schema linking」是明確點名的未來方向。
② Dev / Test 表現不一致:GPT-4o 在 test 比 dev 好,但 GPT-4o-mini 反而 test 比 dev 差。BIRD test set 不公開,作者無法直接分析原因,也提到 LLM 多次跑會有變異。
③ Prompt 設計未充分探索:本文聚焦在 schema linking 與資料增補,沒有系統性比較不同 prompt 模板。作者把更多 prompt 設計、迭代式 question refinement 留給未來工作。
④ 沒做多次生成 / self-consistency:為了節省成本,每模組只跑一次,沒像 CHESS / MCS-SQL 那樣靠多次採樣投票。這是 trade-off,作者選擇了成本一邊。
E-SQL 把 schema linking 從「過濾無關項」翻轉成「把相關項寫進問句」,在 BIRD test set 達 66.29% EX,並證實在先進 LLM 時代schema filtering 反而有害 —— 為 Text-to-SQL 提供了一條成本可控、對複雜查詢特別有效的新路徑。