不靠人工標註,用四步驟「漸進式管線」自動合成 250 萬筆 text-to-SQL 訓練資料;只有 7B 的開源模型就追平甚至超越 GPT-4o 與 DeepSeek-V3。
Text-to-SQL 把自然語言問句翻成可執行 SQL,讓非專家也能查資料庫。LLM 時代有兩條路線:prompting 與 fine-tuning,但兩者在真實場景都有硬傷。OmniSQL 主張:用「大規模、多樣、高品質」的合成資料去微調開源模型,才能同時解決成本、隱私與泛化。
靠精心設計的 prompt 呼叫強大的閉源 LLM(GPT-4 等)。缺點:使用成本高、資料隱私疑慮、行為難以控制,且高度依賴 API。
在 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 要的是一個同時滿足三個條件的框架:
幾乎不需要人工介入,全流程由 LLM 驅動。
能產生大規模、跨領域的多樣資料。
合成資料貼近真實使用者的需求與情境。
三大貢獻:(1) 一套自動且可擴展的 text-to-SQL 資料合成框架;(2) SynSQL-2.5M —— 第一個百萬級(254 萬筆)text-to-SQL 資料集,每筆都含 CoT 解題;(3) OmniSQL(7B/14B/32B)以遠少的參數量刷新開源 SOTA,並追平頂尖閉源模型。
核心難點是「自動化 + 可擴展」與「品質 + 多樣性」之間的矛盾。OmniSQL 的解法是一條漸進式管線(progressive pipeline):把合成任務解耦成四個彼此獨立、各自可控的子任務,每步都用相對小型的開源 LLM 就能完成。
注意這條管線的方向是 「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),越大的模型分配越多合成工作量以確保品質。
真實企業資料庫因為敏感資訊而難以取得,但結構化的 web tables 卻在網路上俯拾即是。OmniSQL 的洞見:給 LLM 一張網路表格,請它推斷背後合理的商業情境,再設計一個能存放這些資料的關聯式資料庫。
給定一張 web table,prompt LLM 先想像表格背後的商業情境,再設計一個含多張關聯表的資料庫。每張表都帶 table 名稱、描述、欄名、欄型別、欄描述、主鍵,外加兩列範例資料;表與表之間用主鍵 / 外鍵串起來。表的數量 K 取自常態分佈 K ~ N(10, 4²),鼓勵生成較複雜的 schema。
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 要 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 ...
直接叫 LLM 寫 SQL 會出現複雜度失衡:小模型只會寫簡單查詢、大模型又愛寫超複雜的。OmniSQL 的解法是明確定義四級複雜度,每次隨機抽一級、要求 LLM 對齊該級別。
只查單表、不允許 join。
含 join(INNER / LEFT / CROSS…)、較複雜的 WHERE(IN / BETWEEN / LIKE)。
巢狀子查詢、self-join、window functions、CTE、複雜 WHERE/HAVING。
多個 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.
把 SQL 回譯成自然語言問句時,OmniSQL 同時追求「語意準確」與「語言多樣」。真實使用者問問題的方式千變萬化 —— 從正式明確到含糊隱喻,若訓練資料只有一種腔調,模型遇到同義詞替換或改寫就會崩。
formal、colloquial、imperative、interrogative、descriptive、concise —— 意圖清楚,只是語氣不同。
vague、metaphorical —— 用模糊詞或比喻,需額外的 external knowledge 才能解讀;LLM 會一併合成這份知識。
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.)
每條 SQL 會生成多個候選問句。為了挑出語意最準的那個,用 Sentence Transformers(all-mpnet-base-v2)把候選嵌入向量,計算每個候選與其他候選的平均餘弦相似度,選最接近語意中心的那條。直覺:語意正確的問句會彼此靠近,離群的往往是翻錯的。
為了銜接「問題」與「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 之後的版本,證實這一步顯著提升資料品質。
把上述管線跑起來,就得到 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 解題(首見)
| Dataset | Source | # Example | # Unique SQL | # DB | Styles | Knowledge | CoT |
|---|---|---|---|---|---|---|---|
| WikiSQL | Human+Template | 80,654 | 80,257 | 26,531† | – | – | – |
| Spider | Human | 10,181 | 4,489 | 200 | – | – | – |
| BIRD | Human | 12,751 | –* | 95 | – | ✓ | – |
| ScienceBenchmark | LLM+Human+Tmpl | 5,031 | 3,652 | 3 | – | – | – |
| EHRSQL | Human+Template | 20,108 | 18,253 | 2 | – | – | – |
| SynSQL-2.5M | LLM-Gen | 2,544,390 | 2,412,915 | 16,583 | ✓ | ✓ | ✓ |
| Dataset | # DB | #Tbl/DB | #Col/DB | #PK/DB | #FK/DB |
|---|---|---|---|---|---|
| WikiSQL | 26,531 | 1.00 | 6.34 | 1.00 | 0.00 |
| Spider | 200 | 5.11 | 26.82 | 4.70 | 4.79 |
| BIRD* | 95 | 7.64 | 54.56 | 6.71 | 6.58 |
| SynSQL-2.5M (w/o DE) | 16,583 | 9.15 | 44.47 | 9.15 | 8.56 |
| SynSQL-2.5M | 16,583 | 10.15 | 74.07 | 10.14 | 9.61 |
| Dataset | #Tables | #Joins | #Func. | #Tokens | #Subq. | #Window | #CTEs | #Uniq Skeleton |
|---|---|---|---|---|---|---|---|---|
| Spider | 1.52 | 0.48 | 0.51 | 14.85 | 604 | 0 | 0 | 2,136 |
| BIRD* | 1.98 | 0.94 | 0.67 | 24.75 | 843 | 10 | 9 | 4,596 |
| EHRSQL | 3.60 | 0.62 | 2.63 | 41.62 | 17,989 | 3,207 | 0 | 2,447 |
| SynSQL-2.5M | 4.00 | 1.75 | 1.49 | 57.05 | 612,647 | 33,916 | 1,073,483 | 2,190,988 |
SynSQL 的 SQL 平均 1.75 joins/query(Spider 0.48、BIRD 0.94),約 40% 的查詢用到 CTE,涵蓋 83 種引擎函式、超過 219 萬種 unique skeleton —— 在複雜度與多樣性上都明顯勝過人工資料集。
從四面向(資料庫 / 問題 / SQL / 整體樣本)各細項用 excellent–poor 評分並加權。各抽 1,000 筆與 BIRD 比較,SynSQL-2.5M 幾乎所有準則都勝過 BIRD。
三位資工背景的資深研究生做 pass/fail:96% 資料庫真實且結構完整、97% 問題有意義、89% SQL 適當、86% 整體樣本完全正確 —— 屬高品質「銀標」資料。
用 SynSQL-2.5M 加上 Spider / BIRD 的人工資料,微調出 7B / 14B / 32B 三種規模的 OmniSQL,基座是 Qwen2.5-Coder-Instruct 系列。
輸入=資料庫 schema(格式化為 CREATE TABLE 敘述)+自然語言問題。每個欄位再以註解附上三種輔助資訊:欄位描述、代表值(每欄取兩個值)、與問題相關的值。輸出=CoT 解題(含逐步推理與最終 SQL)。由於 Spider / BIRD 只有黃金 SQL 沒有 CoT,論文用步驟四的技術替它們補上 CoT。
在 9 個資料集上評估(標準 3 + 領域 3 + 強健性 3),指標為執行準確率 EX 與 test-suite 準確率 TS。「Gre」= greedy decoding,「Maj」= 取樣 8 個再依執行結果多數決。重點:OmniSQL 在單步推理、單一模型設定下評估,不與多 agent 框架直接比較。
| LLM | 規模 | Avg (Gre) | Avg (Maj) |
|---|---|---|---|
| GPT-4o-mini | 閉源 | 56.2 | 58.0 |
| GPT-4-Turbo | 閉源 | 59.4 | 60.0 |
| GPT-4o | 閉源 | 58.9 | 59.9 |
| Qwen2.5-Coder-7B-Instruct | ~7B | 52.8 | 58.4 |
| OmniSQL-7B | 7B | 61.2 | 63.1 |
| Qwen2.5-Coder-14B-Instruct | 14B | 59.3 | 61.1 |
| OmniSQL-14B | 14B | 62.2 | 63.9 |
| Qwen2.5-Coder-32B-Instruct | 32B | 60.8 | 63.1 |
| Qwen2.5-72B-Instruct | 72B | 58.5 | 60.7 |
| Meta-Llama-3.1-70B-Instruct | 70B | 57.6 | 59.2 |
| DeepSeek-V3 (MoE) | 671B | 59.9 | 60.7 |
| OmniSQL-32B | 32B | 63.2 | 64.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 拿下全表最佳。
| Model | Spider dev | Spider test | BIRD dev | Spider2.0-SQLite | Science | EHRSQL | DK | Syn | Real |
|---|---|---|---|---|---|---|---|---|---|
| Qwen2.5-Coder-7B | 73.4 | 82.2 | 50.9 | 1.5 | 45.2 | 24.3 | 67.5 | 63.1 | 66.7 |
| OmniSQL-7B | 81.2 | 87.9 | 63.9 | 10.4 | 50.2 | 34.9 | 76.1 | 69.7 | 76.2 |
| Qwen2.5-Coder-14B | 78.1 | 86.6 | 61.5 | 5.9 | 52.2 | 31.6 | 73.6 | 68.2 | 76.2 |
| OmniSQL-14B | 81.4 | 88.3 | 64.2 | 10.4 | 56.9 | 39.9 | 72.9 | 69.0 | 76.4 |
| Qwen2.5-Coder-32B | 77.7 | 87.5 | 64.5 | 5.9 | 54.8 | 36.4 | 78.3 | 69.9 | 72.4 |
| OmniSQL-32B | 80.9 | 87.6 | 64.5 | 11.9 | 57.2 | 42.4 | 76.1 | 69.7 | 78.1 |
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 上都保持穩定領先。
論文用 Qwen2.5-Coder-7B 當基座做了多組消融,全部 greedy decoding。
| 設定 | Spider dev | Spider test | BIRD | Spider2.0 | Science | EHRSQL | DK | Syn | Real |
|---|---|---|---|---|---|---|---|---|---|
| Qwen2.5-Coder-7B(基座) | 73.4 | 82.2 | 50.9 | 1.5 | 45.2 | 24.3 | 67.5 | 63.1 | 66.7 |
| FT w/ SynSQL-2.5M | 74.6 | 83.5 | 59.9 | 9.6 | 48.5 | 37.2 | 71.6 | 61.6 | 70.3 |
| FT w/ CoT-enhanced Spider+BIRD | 80.3 | 86.6 | 59.6 | 5.9 | 49.5 | 26.0 | 72.0 | 70.0 | 76.4 |
| FT w/ original Spider+BIRD | 76.9 | 80.7 | 55.1 | 3.0 | 43.8 | 31.4 | 65.8 | 65.9 | 71.9 |
| + 兩者合併 (OmniSQL-7B) | 81.2 | 87.9 | 63.9 | 10.4 | 50.2 | 34.9 | 76.1 | 69.7 | 76.2 |
只用 SynSQL-2.5M 微調,相對基座在 BIRD +9.0%、EHRSQL +12.9%。把 SynSQL 從訓練組移除(只留 CoT-enhanced Spider+BIRD),七個資料集一致下滑 —— 它補上了人工資料的涵蓋缺口。
比較「CoT-enhanced Spider+BIRD」與「original Spider+BIRD」,移除 CoT 幾乎在所有資料集都掉分。CoT 同時帶來「強化推理」與「修正錯標」兩種增益。
用 20%→100% 子集各訓一 epoch,準確率隨資料量單調上升,且到 100% 仍未飽和 —— 暗示更多資料還能再漲。
| Method | Spider w/o | Spider w/ | Δ | BIRD w/o | BIRD w/ | Δ |
|---|---|---|---|---|---|---|
| DT-Fixup + Syn† | 74.6 | 76.1 | +1.5 | – | – | – |
| T5-3B + PICARD + Syn† | 79.3 | 81.4 | +2.1 | – | – | – |
| Sense-13B | 79.4 | 82.9 | +3.5 | 51.6 | 52.9 | +1.3 |
| OmniSQL-7B (greedy) | 76.9 | 81.2 | +4.3 | 55.1 | 63.9 | +8.8 |
同樣用 LLM 合成的 Sense 在 BIRD 只帶來 +1.3%,OmniSQL 的管線卻帶來 +8.8% —— 「SQL→Question + CoT 修正」的解耦設計,品質明顯更高。
論文相當誠實地標出幾個邊界,也指出可延伸的方向。
限制 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」資料,足以用於訓練,但非零錯誤。規模化帶來的訊號量,蓋過了殘餘雜訊。
回譯比正向翻譯更準、歧義更低,從源頭鎖住配對品質。
明說「可能有錯、別提它」,讓 CoT 敢於推翻並修正 —— 93.98% 案例變更好。
四個簡單子任務各自交給開源小模型,擺脫對昂貴閉源 LLM 的依賴,才談得上百萬級規模。
資料集、三種規模模型與完整合成 / 訓練 / 評估程式碼皆已開源(SynSQL-2.5M 採 Apache 2.0)。對想自建 text-to-SQL 訓練資料的人來說,這四步驟管線是一份可直接照抄的食譜。