用一套「精簡、通用」的 RLVR 訓練配方(模型/prompt 選擇 → TAO 離線暖身 → 線上 RLVR → self-consistency),不靠額外資料、不靠閉源大模型,在 BIRD 私有測試集衝上 SOTA:單次呼叫 73.56%、self-consistency 75.68%,而且生成次數更少。
現成 LLM 在通用任務上表現亮眼,但碰到企業內部的「組織專屬知識」就會卡住。這篇報告主張:用 可驗證獎勵的強化學習(RLVR) 把模型後訓練成一個專精的推理模型,並以 text-to-SQL 當作可量化的代理任務來驗證。
論文開門見山指出,off-the-shelf LLM 在 bespoke 企業任務上有幾個固定痛點:不懂組織專屬術語(例如「churned users」每家公司定義不同)、不知道內部偏好(某些查詢一定要用特定欄位排序)、不會用內部的 API/工具、也不知道資料放在哪。和數學題不同,這些組織知識在網路上往往受保護、樣本稀少,預訓練資料根本沒涵蓋。
要補這個知識落差,方法之一就是後訓練(post-training)。對資料科學與寫程式這類任務,常常可以算出一個可驗證的獎勵(verifiable reward):不需要另外訓練 reward model,本身就是客觀的品質指標。以 text2sql 為例,只要把模型產生的 SQL 拿去資料庫執行,再跟 gold SQL 的執行結果比對,就能得到 0/1 的對錯訊號 —— 這正是 RLVR 的甜蜜點。
核心主張:不需要精雕細琢的 agentic pipeline、不需要巨量自製訓練資料、也不需要閉源模型。一套「簡單但完整」的 RLVR 配方,就能把單一開源模型訓練到 text-to-SQL 的 state-of-the-art。
第一次送交 BIRD leaderboard 就在私有測試集拿下單模型類別的 state-of-the-art:單次呼叫 73.56%、self-consistency 75.68%。
模型/prompt 選擇 → TAO 離線暖身 → 線上 RLVR → self-consistency。沒有任何 BIRD train set 以外的資料,也沒用 proprietary 模型。
dev 70.80% → test 73.56%,從 dev 到 private test 幾乎不掉分,泛化能力比其他頂尖投稿更穩。
self-consistency 只用 7 次生成 就贏過第二名(需要 8–32 次),算力效率更高。
一個反直覺發現:在 BIRD 這個任務上,GPT-4o、O3、Claude Sonnet 等閉源模型,竟然打不過 Qwen 與 Llama 系列的開源模型。這挑戰了「閉源一定比較強」的普遍認知,作者把深入探究留給 future work。
在開始訓練之前,作者先做兩件「便宜但關鍵」的事:把基底模型與 prompt 選對,並把 verifiable reward 定義成最貼近評測指標的形式。
作者在 BIRD dev 上掃過一整排開源與閉源模型、配上不同 prompt。結論是 Qwen 2.5 32B Coder Instruct 的 dev 表現最佳,這也和文獻中 OmniSQL 研究回報的最佳結果一致。於是它被選為後續 RLVR 的基底模型。
Prompt 方面以 OmniSQL prompt 為起點,但做了兩個重要修改:
為什麼推理 trace 重要:整個 pipeline 把 LLM 當成 reasoning model 使用 —— 先產生一段包含推理的 trace,再用 delimiter 把最終 SQL 從 trace 中抽出來。引進 reasoning,RLVR 能提升模型效能的空間就大很多。
為什麼「引進 reasoning,RLVR 能提升模型效能的空間就大很多」?可以從 RLVR 的運作機制拆成三點來看:
獎勵定義刻意保持簡單,TAO 與 RLVR 兩階段共用同一個:直接拿 BIRD 的 0-1 執行比對指標,再對「語法錯誤、無法執行」的 SQL 加上 −1 的懲罰。
作者特別提到:他們嘗試過 reward shaping(更花俏的獎勵設計),但在初步實驗中沒有帶來顯著提升,所以維持這個極簡形式。這呼應了 RLVR 的一個精神 —— 獎勵越接近真實評測目標越好。
這是論文的核心配方:先用離線 RL(TAO)給模型一個好的 inductive bias 暖身,再用線上 RLVR 精修,最後在推理時加上 self-consistency。三段是互補的。
不像監督式微調直接給「標準答案」要模型模仿;RL 後訓練讓模型自己生成,再依好壞給一個分數(reward),然後調整權重 —— 讓高分輸出更容易出現、低分更不容易。模型是從「自己試、被打分」中學,而不是背答案。
分數不是另外訓練一個 reward model 來「猜」好壞(那會貴、又可能被鑽漏洞),而是直接拿客觀事實當分數:把 SQL 執行、跟 gold 結果比對。獎勵即真相 —— 所以特別適合 SQL、數學、寫程式這種「能跑、能驗證」的任務。
底層用 GRPO:同一題取樣多個回應,用「比同組平均好多少」當更新訊號。KL-divergence 項像一條韁繩,把微調後的模型拉住、別離原模型太遠以免崩壞;本文發現這條韁繩可放很鬆、甚至拿掉,效能也不太掉。
兩階段最大的差別,在於「訓練資料是否跟著模型一起更新」:
先用當前模型對每題生成一批回應、算好 reward,存成一份固定的資料集,再在這份「快照」上做 RL 優化。資料不隨訓練即時更新,所以較便宜、較穩定,適合快速給模型一個好的起手式(inductive bias)。整個流程可重複多輪。
邊訓練邊即時從不斷變強的模型取樣新回應、即時算 reward、即時更新 —— 訓練資料永遠跟著最新的 policy 走。訊號更貼切、效能上限更高,但也更貴、更吃調參。本文把它疊在最佳 TAO 模型之上。
策略上就是:先用便宜穩定的離線 TAO 暖身、給好的 inductive bias,再用更強的線上 RLVR 把效能往上頂,最後在推理時用 self-consistency 多投幾票收尾。每一段都建立在前一段的成果上。
TAO 是 Databricks 提出的離線 RL 方法,目的是替後續 RLVR「暖身」、給模型一個好的 inductive bias。單一輪 TAO:對每個 BIRD 訓練點用當前模型生成多個回應 → 用上面的 verifiable reward 算分 → 在收集到的資料上做離線 RL 優化。這個流程可重複多輪。
用 Databricks 的 fine-tuning 服務做線上 RLVR。掃超參數後發現:較低的 learning rate 與 較低的 KL-divergence 係數 較理想;甚至完全移除 KL 項也不太傷效能,呼應近期文獻。底層基於 GRPO,並加上數項改良 —— 讓訓練聚焦在困難題、避免 reward 飽和。
在微調後的模型上,產生 7 個 回應,用一個無參數的加權多數決挑出最一致的答案。RLVR 與 self-consistency 的增益是互補的。
一個工程上的取捨:作者只做「有限度」的 TAO 訓練。原因是初步實驗顯示 —— TAO 過度訓練反而會讓後續線上 RL 階段的整體增益變小。換句話說,暖身要適可而止,把空間留給線上 RLVR。
所有訓練與評測都只用 BIRD 這一個 text-to-SQL benchmark,刻意不引入任何額外資料,藉此凸顯「是 RL 在扛重活,而不是資料工程」。
9,428
訓練樣本
1,534
用於選模型/調超參
1,789
私有、不公開
0/1
執行結果比對
每一筆 BIRD 資料點包含:使用者的自然語言 query、提供額外說明的 evidence 欄位、一個含多張表的 database,以及代表正確答案的 gold SQL。作者把 query 與 evidence 合併成一個統一的使用者查詢餵給模型。
評測指標是嚴格的 0-1 執行比對:把 gold SQL 與生成 SQL 都在資料庫上執行,輸出相符記 1、不符記 0。測試集不公開,因此能避免資料污染(contamination)與 benchmark hacking 的疑慮 —— 這也是為什麼「dev → test 幾乎不掉分」特別有說服力。
為什麼 text2sql 難:挑戰在於要在「複雜資料庫的脈絡」下理解查詢 —— 表很多、欄位很多、欄名可能有歧義、正確的欄位值要去資料裡找、還可能需要 join 多張表才能回答問題。
先看「沒有 test-time compute」的結果,再看加上 self-consistency 的結果。兩張 leaderboard 表都顯示 Databricks-RLVR-32B 拿下測試集第一。
下圖是論文 Figure 2 的重繪。亮點是:開源的 Qwen 2.5 Coder(32B)以 64.80 拿下 vanilla 第一,而 GPT-4o、O1、O3-mini、Claude Sonnet 等閉源模型(橘色)反而落後。這直接支撐了論文「閉源不一定更強」的反直覺發現,也解釋了為何挑 Qwen 當基底。
把基底一路堆上去:Qwen 基底 dev 64.80 → 加 TAO 67.40 → 加 RLVR(完整模型)dev 70.80 / test 73.56 → 再加 self-consistency test 75.68。每一段都帶來真實增益。
這個類別名稱在講什麼?它界定了一個投稿「用多少機器、花多少推理算力」:
單模型(single-model):整個系統就是一套權重的單一模型(這裡是 TAO + RLVR 微調後的 Qwen2.5-32B-Coder)。排除 ensemble、以及串接多個不同模型/agent 的 pipeline(例如另外接 schema-linker、generator、candidate-selector)。
單次呼叫(single-call):每題只做一次 LLM 生成就產出最終 SQL。沒有任何 test-time compute —— 不做 self-consistency、不取樣投票、也沒有多輪 agentic 重試。這量測的是模型最純粹的「一次到位」能力。
對照 §5.4 的 Table 2:一樣是單模型,但加上 self-consistency(生成 7 個回應、用無參數加權多數決挑答案),所以多了「回應數」欄位,分數也從 73.56% 推到 75.68%,代價是更多推理算力。
| Model | Dev set | Test set |
|---|---|---|
| Databricks-RLVR-32B(本文) | 70.80 | 73.56 |
| Qwen2.5-32B-Coder-Instruct + TAO(本文) | 67.40 | – |
| Qwen2.5-32B-Coder-Instruct(基底) | 64.80 | – |
| Arctic-Text2SQL-R1-32B | 70.47 | 71.83 |
| Arctic-ExCoT-70B | 68.51 | 68.53 |
| Command A | 63.49 | 65.68 |
| OneSQL-v0.1-Qwen-32B | 64.60 | 63.33 |
| SuperSQL | 58.50 | 62.66 |
| SFT CodeS-15B | 58.47 | 60.37 |
重點:完整模型拿下單次呼叫類別的測試集第一(73.56%)。值得注意的是 只做有限度 TAO 就已達 67.40% —— 在投稿當下,這個數字按 dev 排名已可進 leaderboard 前 10。
| Model | Dev set | Test set | 回應數 |
|---|---|---|---|
| Databricks-RLVR-32B(本文) | – | 75.68 | 7 |
| Sophon-Text2SQL-32B | 72.43 | 74.79 | 8–32 |
| Arctic-Text2SQL-R1-32B | 72.20 | 73.84 | 1–7 |
| Arctic-Text2SQL-R1-14B | 71.40 | 72.22 | 1–7 |
| SIFT-32B | 70.08 | 70.93 | >32 |
| CrazyData-Text2SQL-32B | – | 70.71 | 8–32 |
| Infly-RL-SQL-32B | 70.08 | 70.60 | 1–7 |
| Arctic-Text2SQL-R1-7B | 70.70 | 70.43 | 1–7 |
| XiYanSQL-QwenCoder-32B | 67.01 | 69.03 | 1–7 |
更省也更強:Databricks-RLVR-32B 以 75.68% 拿下測試集第一,而且只用 7 次生成,比第二名 Sophon(8–32 次)省下可觀算力。論文強調:RLVR 與 self-consistency 的增益是互補的 —— RLVR 先把單次能力拉滿,self-consistency 再疊加邊際收益。
附錄列出幾個模型生成樣本。最有意思的是模型會「先寫一版、再自我優化」,以及一個典型的失敗模式。以下節錄自論文附錄。
問題:在 race 為 god/eternal 的 superheroes 中,有幾位是男性?
Evidence:race「god/eternal」對應 race_id = 21;male 對應 gender.id = 1。資料庫:superhero
模型先依「字面」寫出一版 join 三張表的查詢:
SELECT COUNT(*)
FROM superhero AS h
JOIN race AS r ON h.race_id = r.id
JOIN gender AS g ON h.gender_id = g.id
WHERE r.race = 'God/Eternal' AND g.gender = 'Male';
接著它讀懂了 evidence,發現可以直接用 race_id = 21 省掉對 race 表的 join,主動改寫成更精簡的版本:
-- 用 evidence 給的 race_id 直接過濾,省掉一個 JOIN
SELECT COUNT(*)
FROM superhero AS h
JOIN gender AS g ON h.gender_id = g.id
WHERE h.race_id = 21 AND g.gender = 'Male';
為什麼這個範例有代表性:它展示了 RLVR 訓練出的「推理 → 自我修正」行為 —— 模型不只翻譯,還會回頭利用 evidence 把查詢優化得更穩健。
問題:卡牌「Ancestor's Chosen」的德文 type 是什麼?資料庫:card_games
SELECT fd.type
FROM cards c
JOIN foreign_data fd ON c.uuid = fd.uuid
WHERE c.name = 'Ancestor''s Chosen' AND fd.language = 'German';
論文點出兩個錯誤:(1) 模型取的是 foreign_data 表的 type,而非 cards 表的 type —— 兩者名稱相近但值不同,造成混淆;(2) 忘了對回傳值套用 DISTINCT。這正是 text2sql 在「欄名歧義 + 多表脈絡」下的典型陷阱。
這是一份技術報告(technical report),定位是「展示 Databricks 的 RLVR/TAO 微調服務」,因此在實作細節(服務內部的 RLVR 改良)上有所保留。以下整理作者明確點出的限制與開放問題。
限制 1 — BIRD 只是 proxy:作者反覆強調 BIRD 只是企業任務的「代理任務」。真正的價值主張是「這套配方很簡單、因此可廣泛套用到 BI、資料科學、coding 等企業領域」,但報告本身只在 BIRD 上驗證。
限制 2 — 閉源為何落後仍是謎:「proprietary LLM 在此任務上表現不如 Qwen/Llama」是個反直覺觀察,作者明說把深入探究留給 future work,沒有給出機制性解釋。
實作細節保留:RLVR 服務在 GRPO 之上的「聚焦困難題、避免 reward 飽和」等改良只有概念性描述;TAO 的具體優化式、超參數掃描範圍也未完整公開。沒有公開的程式碼倉庫,方法將整合進 Databricks 的 Agent Bricks 產品。
這篇報告的訊息很乾脆:在能算出可驗證獎勵的任務上,與其堆砌複雜 agentic pipeline 或巨量自製資料,不如把「選對基底 + 簡單獎勵 + TAO 暖身 + 線上 RLVR + 輕量 self-consistency」這套配方做扎實 —— 單一開源 32B 模型就能在 text-to-SQL 拿下 SOTA,而且更省算力、泛化更穩。