PVLDB 2025 · 論文導讀

OmniSQL

不靠人工標註,用四步驟「漸進式管線」自動合成 250 萬筆 text-to-SQL 訓練資料;只有 7B 的開源模型就追平甚至超越 GPT-4o 與 DeepSeek-V3。

Data Synthesis SynSQL-2.5M SQL-to-Question Chain-of-Thought Web Tables Qwen2.5-Coder · LoRA Spider · BIRD · 9 benchmarks

Haoyang Li, Shang Wu, Xiaokang Zhang, Xinmei Huang, Jing Zhang, Fuxin Jiang, Shuai Wang, Tieying Zhang, Jianjun Chen, Rui Shi, Hong Chen, Cuiping Li · 中國人民大學 + ByteDance · arXiv:2503.02240 · github.com/RUCKBReasoning/OmniSQL

SECTION 01

問題定義 — 微調模型「考過試卻不會做事」

Text-to-SQL 把自然語言問句翻成可執行 SQL,讓非專家也能查資料庫。LLM 時代有兩條路線:prompting 與 fine-tuning,但兩者在真實場景都有硬傷。OmniSQL 主張:用「大規模、多樣、高品質」的合成資料去微調開源模型,才能同時解決成本、隱私與泛化。

兩種主流範式各自的痛點

Prompting-based

靠精心設計的 prompt 呼叫強大的閉源 LLM(GPT-4 等)。缺點:使用成本高、資料隱私疑慮、行為難以控制,且高度依賴 API。

Fine-tuning-based

在 Spider / BIRD 等既有資料集上微調。缺點:公開資料涵蓋面太窄,泛化到複雜或專業領域時崩盤

關鍵觀察(泛化崩盤的證據):把 Qwen2.5-Coder-7B-Instruct 在 Spider + BIRD 訓練集上微調,它在同分佈的 dev set 表現很好,但在 out-of-domain 的 ScienceBenchmark / EHRSQL 只剩 43.8% / 31.4% 執行準確率 —— 反而是 zero-shot 的 GPT-4-Turbo 拿到 59.2% / 43.1%。微調「過擬合」到了既有 benchmark 的分佈。

為什麼不直接擴增既有資料?

過去的 data augmentation 多半是「貼著既有資料集的分佈」去長新樣本,導致多樣性、品質、可擴展性都受限;不少方法還要人工設計複雜的模板或文法,難以規模化。OmniSQL 要的是一個同時滿足三個條件的框架:

Automatic 自動

幾乎不需要人工介入,全流程由 LLM 驅動。

Scalable 可擴展

能產生大規模、跨領域的多樣資料。

Realistic 真實

合成資料貼近真實使用者的需求與情境。

三大貢獻:(1) 一套自動且可擴展的 text-to-SQL 資料合成框架;(2) SynSQL-2.5M —— 第一個百萬級(254 萬筆)text-to-SQL 資料集,每筆都含 CoT 解題;(3) OmniSQL(7B/14B/32B)以遠少的參數量刷新開源 SOTA,並追平頂尖閉源模型。

SECTION 02

框架總覽 — 把難題拆成四個簡單步驟

核心難點是「自動化 + 可擴展」與「品質 + 多樣性」之間的矛盾。OmniSQL 的解法是一條漸進式管線(progressive pipeline):把合成任務解耦成四個彼此獨立、各自可控的子任務,每步都用相對小型的開源 LLM 就能完成。

Web Table TabLib 種子 ① Database 生成 + 結構增強 10.15 tbl · 7.3 col ② SQL Query 四級複雜度 simple→highly complex ③ NL Question 回譯 · 九種語氣 back-translation ④ CoT Solution step-by-step 推理 並修正錯誤 SQL <database, question, SQL query, CoT solution> 四元組
圖 1 · OmniSQL 的四步驟漸進式合成管線(依論文 Figure 1 重繪)

注意這條管線的方向是 「SQL → Question」(先有 SQL,再回譯成自然語言),而非反過來。原因:把 SQL 翻成自然語言,比把模糊的自然語言翻成精確 SQL 來得「更準確、歧義更低」,這保證了 <question, SQL> 配對的品質。

為了避免單一 LLM 的偏好造成風格偏差,論文在不同步驟用上多個開源模型家族分工:Llama3.1(8B/70B)、DeepSeek-Coder(6.7B/33B、V2-Lite)、Qwen2.5(7B–72B)、Qwen2.5-Coder(7B–32B),越大的模型分配越多合成工作量以確保品質。

SECTION 03

步驟一 — 用網路表格「長」出真實資料庫

真實企業資料庫因為敏感資訊而難以取得,但結構化的 web tables 卻在網路上俯拾即是。OmniSQL 的洞見:給 LLM 一張網路表格,請它推斷背後合理的商業情境,再設計一個能存放這些資料的關聯式資料庫。

兩階段:生成 + 增強

Table-driven database generation

給定一張 web table,prompt LLM 先想像表格背後的商業情境,再設計一個含多張關聯表的資料庫。每張表都帶 table 名稱、描述、欄名、欄型別、欄描述、主鍵,外加兩列範例資料;表與表之間用主鍵 / 外鍵串起來。表的數量 K 取自常態分佈 K ~ N(10, 4²),鼓勵生成較複雜的 schema。

Database enhancement(結構增強)

LLM 第一次生成的 schema 常有兩個毛病:表太簡單(平均才 4 欄)、主鍵 / 外鍵不完整 —— 這是 LLM 的「捷徑學習」傾向。於是再加一步增強:請 LLM 為每張表補上相關欄位、補齊缺漏的主 / 外鍵關係。

增強的量化效果:初版資料庫平均 9.15 表 / 4.86 欄;增強後變成 10.15 表 / 7.3 欄,達到貼近真實世界的複雜度。所有資料庫都用 SQLite 部署管理。

為什麼相信 LLM 能生出好 schema?論文分析 StarCoder 的預訓練資料,找到 975,420 個 .sql 檔,其中 42% 至少含一個 CREATE TABLE 敘述 —— LLM 在預訓練階段就大量見過 schema 定義。相較之下,GitSchemas / SchemaPile 從 GitHub 抽 DDL,可擴展性受限於高品質 SQL 檔的稀缺;WikiDBs 從 Wikidata 拼表,又有「把不相關的表硬連在一起」的一致性風險。

實際 prompt(節錄自 repo)

資料庫合成 prompt 要 LLM 一次做三件事:判斷領域、構思企業級情境、輸出 JSON schema;並特別要求加入「15–50 欄的超寬表」。以下節錄自 data_synthesis/database_synthesis/prompt_templates/schema_prompt.txt

**Task Overview:**
Given a table in Markdown format, your task is to complete the following three tasks:

## Task 1
Analyze the table's header and rows to briefly summarize its domain.
The output domain should be surrounded by [START_DOMAIN] and [END_DOMAIN].

## Task 2
Based on the table, propose a complex, enterprise-level, real-world
business scenario ... surrounded by [START_SCENARIO] and [END_SCENARIO].

## Task 3
Create a comprehensive database schema in json format ...
The schema for each table should comprise: table_name, table_description,
column_names, column_types, column_descriptions, primary_key, sample_rows.
... establish and define the foreign_keys ...
3. **Ultra-Wide Tables**: Incorporate ultra-wide tables ... 15-50 columns ...
SECTION 04

步驟二 — 複雜度可控的 SQL 生成

直接叫 LLM 寫 SQL 會出現複雜度失衡:小模型只會寫簡單查詢、大模型又愛寫超複雜的。OmniSQL 的解法是明確定義四級複雜度,每次隨機抽一級、要求 LLM 對齊該級別。

四級複雜度(依 repo 的判準)

Simple

只查單表、不允許 join。

Moderate

含 join(INNER / LEFT / CROSS…)、較複雜的 WHERE(IN / BETWEEN / LIKE)。

Complex

巢狀子查詢、self-join、window functions、CTE、複雜 WHERE/HAVING。

Highly Complex

多個 CTE、遞迴 CTE、進階 window / 分析函式組合運用。

除了複雜度,prompt 還塞進幾個關鍵元件來確保查詢「有意義又真實」:

後處理:把雜訊濾掉

生成後做品質控管:(1) 用規則濾掉非 SELECT 查詢,並在合成資料庫上實際執行,剔除語法錯誤或逾時的;(2) 抽取 SQL 模板(只遮掉值),每個模板只留一條,確保多樣性。例如 ... WHERE age > 18... WHERE age > 55 同模板,只保留一條。

SQL 合成 prompt 本體很精簡(節錄自 sql_synthesis_prompt.txt):

**Task Overview**
Create an executable SQL query based on the provided information.

**Database Schema**  {schema_str}
{sql_function_prompt}
{db_value_prompt}

**SQL Query Complexity**
Ensure the SQL query matches the {complexity} level ... {criterion}

**SQL Query Requirements**
1. Use the syntax specific to the {db_engine} database engine.
2. Incorporate advanced functions if appropriate, but ... not mandatory.
3. Address real-world data analysis needs. Avoid trivial ... queries.
4. (Very important) Ensure the final SQL query selects {column_count} columns.

**Answer**  Let's proceed step by step.
SECTION 05

步驟三 — 九種語氣的問題回譯

把 SQL 回譯成自然語言問句時,OmniSQL 同時追求「語意準確」與「語言多樣」。真實使用者問問題的方式千變萬化 —— 從正式明確到含糊隱喻,若訓練資料只有一種腔調,模型遇到同義詞替換或改寫就會崩。

九種語言風格

清楚表意(6 種)

formal、colloquial、imperative、interrogative、descriptive、concise —— 意圖清楚,只是語氣不同。

需要推理(2 種)

vague、metaphorical —— 用模糊詞或比喻,需額外的 external knowledge 才能解讀;LLM 會一併合成這份知識。

多輪對話(1 種)

conversational —— 模擬使用者逐步澄清意圖的多輪 <User> / <Assistant> 對話。

同一條 SQL、四種腔調(取自 repo 的 style 定義):

Formal:Find all students older than 18 years and return their home addresses.

Colloquial:Hey! Could you help me find all the students who are over 18? I'd love to know their names and where they live.

Vague:What are the names and addresses of those older students?
(External Knowledge:'older students' refers to age ≥ 18.)

Metaphorical:Find the names and addresses of those who have reached adulthood.
(External Knowledge:'reached adulthood' refers to age ≥ 18.)

語意一致性選擇器(Semantic Consistency Selector)

每條 SQL 會生成多個候選問句。為了挑出語意最準的那個,用 Sentence Transformers(all-mpnet-base-v2)把候選嵌入向量,計算每個候選與其他候選的平均餘弦相似度,選最接近語意中心的那條。直覺:語意正確的問句會彼此靠近,離群的往往是翻錯的。

selected = argmaxi ( 1/(N-1) · Σj≠i cos( emb(qi), emb(qj) ) ) q:候選問句;emb:all-mpnet-base-v2 句向量。選平均相似度最高 = 最靠近語意中心者。
SECTION 06

步驟四 — CoT 解題(順手修正錯誤 SQL)

為了銜接「問題」與「SQL」之間的鴻溝,OmniSQL 為每個 <database, question, SQL> 三元組生成一段 chain-of-thought 解題,明確寫出從問句推導到 SQL 的步驟。這不只提升可解釋性,更提供高品質的訓練訊號。

典型的 CoT 會:先分析問題要什麼 → 找出相關的表 / 欄 / 過濾條件 → 一步步組裝 join、filter、aggregation、grouping,最後吐出完整 SQL。

意外收穫 —— CoT 會自我修正:論文發現 CoT 生出的 SQL 有時跟原始 SQL 不一樣,而且通常更貼合問題。因為原始三元組偶有小瑕疵(多選欄位、錯的 join path),CoT 的逐步推理過程讓 LLM 能在解題時抓到並修掉這些錯。

關鍵設計:CoT prompt 把原始 SQL 當成「同事給的參考解」,並明說它「可能對也可能錯」、要 LLM 別在答案裡提到它。這巧妙地讓 LLM 願意推翻錯誤的參考解。節錄自 cot_synthesis_prompt_template.txt

You are a senior data analyst specializing in SQL. Your task is to
translate a natural language question into an executable SQLite query,
providing a detailed reasoning trace.

You will also receive a reference solution from a colleague, which
may or may not be correct. ... you are asked not to mention the
reference solution in any form. The reference solution might include:
1. Unnecessary table and column selections.
2. Incorrect or excessive joins.
3. Misalignment with the question.
4. Opportunities for simplification.

[Database Schema]: {schema}
[Natural Language Question]: {question}
[Reference Solution]: ```sql {sql} ```
Provide your step-by-step text-to-SQL solution here.

可靠性:多數決。每個三元組生成多個候選 CoT,依其 SQL 的執行結果分組,從票數最多的群組裡選最終 CoT。另一項驗證:抽 5,000 筆「CoT 前後執行結果不同」的案例,請 GPT-4o 評判哪個 SQL 更貼合問題 —— 4,699 / 5,000(93.98%)偏好 CoT 之後的版本,證實這一步顯著提升資料品質。

SECTION 07

SynSQL-2.5M — 第一個百萬級資料集

把上述管線跑起來,就得到 SynSQL-2.5M:2,544,390 筆 <database, question, SQL, CoT> 四元組,橫跨 16,583 個合成資料庫、各種真實領域(社群情緒分析、商品庫存、電影分析、星系形態分析…)。種子來自 TabLib 取樣的約 132 萬張網路表格,經語言 / 大小 / 去重 / 語意四道過濾後留下 19,935 張,最終成功展開成 16,583 個結構完整的資料庫。

2.54M

text-to-SQL 樣本

16,583

合成資料庫

2.19M

unique SQL skeletons

100%

附 CoT 解題(首見)

Table 1 · 各資料集總體統計(† WikiSQL 每庫單表;* BIRD 測試集不可得故無法計算 unique SQL)
DatasetSource# Example# Unique SQL# DBStylesKnowledgeCoT
WikiSQLHuman+Template80,65480,25726,531†
SpiderHuman10,1814,489200
BIRDHuman12,751–*95
ScienceBenchmarkLLM+Human+Tmpl5,0313,6523
EHRSQLHuman+Template20,10818,2532
SynSQL-2.5MLLM-Gen2,544,3902,412,91516,583
Table 2 · 資料庫複雜度(每庫平均;DE = database enhancement)
Dataset# DB#Tbl/DB#Col/DB#PK/DB#FK/DB
WikiSQL26,5311.006.341.000.00
Spider2005.1126.824.704.79
BIRD*957.6454.566.716.58
SynSQL-2.5M (w/o DE)16,5839.1544.479.158.56
SynSQL-2.5M16,58310.1574.0710.149.61
Table 3 · SQL 統計(節錄;Agg.=aggregations、Func.=functions)
Dataset#Tables#Joins#Func.#Tokens#Subq.#Window#CTEs#Uniq Skeleton
Spider1.520.480.5114.85604002,136
BIRD*1.980.940.6724.758431094,596
EHRSQL3.600.622.6341.6217,9893,20702,447
SynSQL-2.5M4.001.751.4957.05612,64733,9161,073,4832,190,988

SynSQL 的 SQL 平均 1.75 joins/query(Spider 0.48、BIRD 0.94),約 40% 的查詢用到 CTE,涵蓋 83 種引擎函式、超過 219 萬種 unique skeleton —— 在複雜度與多樣性上都明顯勝過人工資料集。

品質評估:贏過人工標註的 BIRD

GPT-4o as Judge

從四面向(資料庫 / 問題 / SQL / 整體樣本)各細項用 excellent–poor 評分並加權。各抽 1,000 筆與 BIRD 比較,SynSQL-2.5M 幾乎所有準則都勝過 BIRD

人類專家評估(1,000 筆)

三位資工背景的資深研究生做 pass/fail:96% 資料庫真實且結構完整、97% 問題有意義、89% SQL 適當、86% 整體樣本完全正確 —— 屬高品質「銀標」資料。

SECTION 08

OmniSQL — 模型與訓練

用 SynSQL-2.5M 加上 Spider / BIRD 的人工資料,微調出 7B / 14B / 32B 三種規模的 OmniSQL,基座是 Qwen2.5-Coder-Instruct 系列。

輸入 / 輸出怎麼組

輸入=資料庫 schema(格式化為 CREATE TABLE 敘述)+自然語言問題。每個欄位再以註解附上三種輔助資訊:欄位描述、代表值(每欄取兩個值)、與問題相關的值。輸出=CoT 解題(含逐步推理與最終 SQL)。由於 Spider / BIRD 只有黃金 SQL 沒有 CoT,論文用步驟四的技術替它們補上 CoT。

Loss = − E(x,y)∼D [ Σt log Pθ( yt | x, y<t ) ] 標準的條件式 next-token prediction:x 輸入(schema+問題)、y 輸出(CoT 解題)。

訓練細節

SECTION 09

主結果 — 7B 開源模型打贏 GPT-4o

在 9 個資料集上評估(標準 3 + 領域 3 + 強健性 3),指標為執行準確率 EX 與 test-suite 準確率 TS。「Gre」= greedy decoding,「Maj」= 取樣 8 個再依執行結果多數決。重點:OmniSQL 在單步推理、單一模型設定下評估,不與多 agent 框架直接比較。

Table 4(節錄)· 9 個資料集的平均準確率(%)。粗體 = 各規模組最佳
LLM規模Avg (Gre)Avg (Maj)
GPT-4o-mini閉源56.258.0
GPT-4-Turbo閉源59.460.0
GPT-4o閉源58.959.9
Qwen2.5-Coder-7B-Instruct~7B52.858.4
OmniSQL-7B7B61.263.1
Qwen2.5-Coder-14B-Instruct14B59.361.1
OmniSQL-14B14B62.263.9
Qwen2.5-Coder-32B-Instruct32B60.863.1
Qwen2.5-72B-Instruct72B58.560.7
Meta-Llama-3.1-70B-Instruct70B57.659.2
DeepSeek-V3 (MoE)671B59.960.7
OmniSQL-32B32B63.264.8

一句話:就算只有 7B,OmniSQL-7B 的平均(61.2 Gre / 63.1 Maj)就已經超過 GPT-4o(58.9 / 59.9)與 DeepSeek-V3 671B(59.9 / 60.7)。OmniSQL-32B 更以 63.2 / 64.8 拿下全表最佳。

逐 benchmark 拆解(greedy decoding)

Table 4(節錄)· 三種規模 OmniSQL vs 基座 Qwen2.5-Coder,greedy 各資料集(%)
ModelSpider devSpider testBIRD devSpider2.0-SQLiteScienceEHRSQLDKSynReal
Qwen2.5-Coder-7B73.482.250.91.545.224.367.563.166.7
OmniSQL-7B81.287.963.910.450.234.976.169.776.2
Qwen2.5-Coder-14B78.186.661.55.952.231.673.668.276.2
OmniSQL-14B81.488.364.210.456.939.972.969.076.4
Qwen2.5-Coder-32B77.787.564.55.954.836.478.369.972.4
OmniSQL-32B80.987.664.511.957.242.476.169.778.1

標準 benchmark

OmniSQL-7B 在 Spider test 達 87.9%(greedy),勝過排行榜最佳公開法 DAIL-SQL+GPT-4+SC(86.6%)1.3%。多數決下三種規模分別到 88.9 / 88.3 / 89.8%。BIRD dev 上 OmniSQL-32B 達 67.0%(Maj),逼近微調 GPT-4o 的 Distillery(67.2%)。

領域泛化

最難的 Spider2.0-SQLite:7B 級 baseline 只有 0.7–3.7%,OmniSQL-7B 卻有 10.4%。EHRSQL(醫療)上 OmniSQL-32B 拿 46.8%(Maj),超過 GPT-4o(45.5%)

強健性

Spider-Syn / Spider-Realistic(同義詞替換)大多勝過 baseline。唯獨 Spider-DK(隱含領域知識)14B/32B 略遜基座 —— 詳見限制一節。

有趣的是:部分開源模型(如 Qwen2.5-Coder-32B、Llama-3.1-70B)在標準資料集上反而贏過閉源模型,但一到領域資料集優勢就消失 —— 因為它們很可能在預訓練 / 微調時吃過 Spider / BIRD 的訓練集。OmniSQL 則在標準與領域 benchmark 上都保持穩定領先。

SECTION 10

Ablation — 拆開看每個設計的貢獻

論文用 Qwen2.5-Coder-7B 當基座做了多組消融,全部 greedy decoding。

Table 5 · 合成資料 / CoT 的消融(%,greedy;FT = fine-tuning)
設定Spider devSpider testBIRDSpider2.0ScienceEHRSQLDKSynReal
Qwen2.5-Coder-7B(基座)73.482.250.91.545.224.367.563.166.7
FT w/ SynSQL-2.5M74.683.559.99.648.537.271.661.670.3
FT w/ CoT-enhanced Spider+BIRD80.386.659.65.949.526.072.070.076.4
FT w/ original Spider+BIRD76.980.755.13.043.831.465.865.971.9
+ 兩者合併 (OmniSQL-7B)81.287.963.910.450.234.976.169.776.2

合成資料的價值

只用 SynSQL-2.5M 微調,相對基座在 BIRD +9.0%、EHRSQL +12.9%。把 SynSQL 從訓練組移除(只留 CoT-enhanced Spider+BIRD),七個資料集一致下滑 —— 它補上了人工資料的涵蓋缺口。

CoT 的價值

比較「CoT-enhanced Spider+BIRD」與「original Spider+BIRD」,移除 CoT 幾乎在所有資料集都掉分。CoT 同時帶來「強化推理」與「修正錯標」兩種增益。

資料規模

用 20%→100% 子集各訓一 epoch,準確率隨資料量單調上升,且到 100% 仍未飽和 —— 暗示更多資料還能再漲。

對比既有 data augmentation 方法

Table 6 · 合成資料帶來的增益對比(%)。† 在 Spider dev 用 EX 指標
MethodSpider w/oSpider w/ΔBIRD w/oBIRD w/Δ
DT-Fixup + Syn†74.676.1+1.5
T5-3B + PICARD + Syn†79.381.4+2.1
Sense-13B79.482.9+3.551.652.9+1.3
OmniSQL-7B (greedy)76.981.2+4.355.163.9+8.8

同樣用 LLM 合成的 Sense 在 BIRD 只帶來 +1.3%,OmniSQL 的管線卻帶來 +8.8% —— 「SQL→Question + CoT 修正」的解耦設計,品質明顯更高。

SECTION 11

限制與啟示

論文相當誠實地標出幾個邊界,也指出可延伸的方向。

限制 1 — 隱含領域知識(Spider-DK):OmniSQL-14B/32B 在 Spider-DK 反而輸給基座。因為 Spider-DK 需要常識 / 隱含知識,而基座在海量語料上的底子更厚。啟示:可新增一種「融入常識知識」的語言風格來補強。

限制 2 — 只測單步、單模型:OmniSQL 刻意隔離出「單一 LLM、單步推理」的核心能力,與 CHASE-SQL、Alpha-SQL 等多階段多 agent 框架直接比較。換言之,加上 schema linking、SQL revision、SQL selection 等技巧後還有上行空間。

限制 3 — 以 SQLite 為預設方言:框架原則上可生成 PostgreSQL / MySQL / BigQuery 等主流方言(LLM 預訓練多半見過),但本研究為了對齊經典 benchmark 而以 SQLite 為主。跨方言的實證仍待補。

定位:銀標而非金標。人工評估顯示整體樣本 86% 完全正確 —— 屬高品質「silver-standard」資料,足以用於訓練,但非零錯誤。規模化帶來的訊號量,蓋過了殘餘雜訊。

三個值得記住的設計巧思

方向選 SQL→Question

回譯比正向翻譯更準、歧義更低,從源頭鎖住配對品質。

把原 SQL 當「參考解」

明說「可能有錯、別提它」,讓 CoT 敢於推翻並修正 —— 93.98% 案例變更好。

解耦 → 用小模型

四個簡單子任務各自交給開源小模型,擺脫對昂貴閉源 LLM 的依賴,才談得上百萬級規模。

資料集、三種規模模型與完整合成 / 訓練 / 評估程式碼皆已開源(SynSQL-2.5M 採 Apache 2.0)。對想自建 text-to-SQL 訓練資料的人來說,這四步驟管線是一份可直接照抄的食譜。