hon9kon9ize logo

CantoneseLLM v2 技術報告

by Joseph Cheng

2026-09-10 10:00GMT

CantoneseLLM v2 技術報告

Read this post in English

距離上一份 CantoneseLLM 技術報告已經兩年多,我們終於發佈了 CantoneseLLM v2,並將完整的技術報告上載到 arXiv。這一代模型基於 Qwen3 8B 及 Qwen3 30B-A3B(MoE)訓練,據我們所知,這是首個有系統地嘗試令模型「以廣東話推理」的工作——不只是用廣東話回答,而是連思考過程(Chain-of-Thought)都用廣東話進行。所有模型權重、訓練環境及數據集都已開源,可以在 HuggingFace Collection 找到。

為何標準配方不適用於廣東話

現時大語言模型的語言適配(language adaptation)已有一套成熟配方:大規模持續預訓練,再用教師模型蒸餾出後訓練數據。Taiwan-LLM 用了 35.1B tokens,日本的 Swallow 和東南亞的 SEA-LION 更各用了 200B tokens。但這套配方對廣東話完全行不通:

  1. 語料規模:我們能收集到的語料只有 784M tokens,當中真正的廣東話只佔 5.4%。
  2. 沒有教師模型:沒有任何開源模型能生成地道的口語廣東話,蒸餾無從談起。
  3. 零推理語料:原生的廣東話 Chain-of-Thought 語料是零,只能靠機器翻譯。
  4. 評測盲點:現有的廣東話 benchmark 都是選擇題,一個模型可以完全用錯誤的語言推理,分數依然亮麗。

這些限制不是廣東話獨有,而是大部分低資源語言的共同處境,所以整份報告其實也是一份「低資源語言推理模型」的實驗記錄。

五階段訓練:每一階段修復上一階段的問題

v2 的訓練管線共有五個階段:持續預訓練(CPT)→ Chat Vector 合併 → 監督微調(SFT)→ 直接偏好優化(DPO)→ 可驗證獎勵強化學習(RLVR)。與其說這是預先設計好的配方,不如說每一階段都是為了修復上一階段診斷出的問題。模型在每個階段後都用 HKCanto-Eval 及一系列生成探針(probe)評測,檢查推理區塊的存在、長度、語言及文字系統。

持續預訓練(CPT)

CPT 語料共 784M tokens、568K 行,在 64 顆 TPU v6e 上以 MaxText 訓練。語料構成上,Common Crawl 書面中文佔 27.5%、英文 replay 數據(Nemotron)佔 20.9%、網絡小說及創作佔 17.1%、百科類佔 12.5%、新聞及合成評論佔 8.4%,而 Common Crawl 廣東話只佔 5.4%——再次反映廣東話的低資源本質。我們同時處理了由 2013-20 至 2025-38 合共十三年的 Common Crawl snapshot,去重後得到 477,298 篇廣東話文檔,這個數據集亦已釋出。

這階段有一個頗有意思的發現:在 30B-A3B 的 learning rate 掃描中,最終 training loss 與下游 benchmark 分數呈反相關——loss 最低的一組(1.52)benchmark 平均分反而低於未訓練的基礎模型。這是 domain overfitting 的訊號:語料規模太小,模型越貼近語料,就越犧牲原有的通用能力。換言之,在低資源 CPT 中,training loss 不能用作模型選擇的指標。

Chat Vector 合併

CPT 後的模型有香港知識但沒有指令跟隨能力。傳統做法是 SFT 或蒸餾,但前者需要大量高質標註數據,後者需要教師模型,兩者我們都沒有。Chat Vector 方法提供了一條捷徑:把官方 chat 模型與基礎模型的權重相減得到「指令向量」,再直接加到我們的 CPT checkpoint 上:

Δ_chat = θ_instruct − θ_base
θ_cv   = θ_cpt + Δ_chat

整個過程零訓練成本。結果 8B 合併模型在 HKCanto-Eval 上比官方 Qwen3 8B 還要高 3.18%;30B-A3B 則輕微倒退 2.55%。

但選擇題分數掩蓋了一個問題:推理語言完全承襲自 donor 模型。用機器翻譯的 GSM8K 問題測試,合併模型雖然答案正確,推理過程卻是簡體中文——例如用「只」(zi2)作為蛋的量詞,而地道廣東話應該用「隻」(zek3);又例如用「現在」而非「而家」。這正是選擇題 benchmark 看不到的失敗模式。

監督微調(SFT)

SFT 的目標是補足合併無法提供的能力:書面中文與廣東話之間的翻譯、資料策展、LLM-as-a-judge 等——這些能力是為了讓模型可以幫手生產下一代語料。混合數據共 74,865 行、177.4M tokens,當中推理 tokens 佔 52.2%。

代價卻很大:SFT 幾乎摧毀了模型的推理能力。因為 Qwen3 8B 是 hybrid 模型,我們把 25% 訓練數據的推理欄位刪走以保留非推理模式,結果空的 <think></think> 成為一個 low-loss attractor——8B 模型在 64.5% 的生成中直接交出空推理區塊;30B-A3B 的推理長度亦縮短至原來的十分之一(官方模型平均 1,042 tokens,SFT 後只剩 158)。Benchmark 平均分 8B 大跌 20.52 分、30B-A3B 跌 12.46 分。

直接偏好優化(DPO)

DPO 是針對上述診斷出來的局部缺陷而做的。因為沒有資源做人工標註,偏好對全部由 SFT checkpoint 自己生成、再由 Gemini 3.5 Flash 評分,最終為 8B 編出 12,204 對、30B-A3B 14,679 對。

DPO 成功恢復了推理區塊的「格式」:8B 平均分回升 10.19 分,30B-A3B 的無限重複推理問題(不斷「但係等等⋯⋯可能問題係⋯⋯」直至撞到 token 上限)亦大幅改善。但能力只恢復了一半左右——格式可以靠偏好對修好,解難能力卻不能。

順帶一提一個意外發現:我們原本假設加入詳盡指示的 verbose system prompt 會產生更好的回應,用作偏好對的正樣本,但評分結果剛好相反——簡潔 prompt 在兩個 size 都跑贏 verbose prompt。Prompt 的擾動標籤不等於質素標籤。

可驗證獎勵強化學習(RLVR)

這是整份報告的核心貢獻。前面所有階段都無法令模型用廣東話推理,RLVR 用 GRPO 配合一個乘法式的語言及文字獎勵做到了:

R = m_lang × g_fmt × (w_t·r_t + w_a·r̄_a)

當中 g_fmt 是硬性格式門檻(必須有一個非空推理區塊),r_t 是任務獎勵(如數學題的精確驗證),而關鍵是語言乘數 m_lang

情況 乘數
以拉丁字母主導推理 0
廣東話或混合中文推理 1.0
書面中文(官話)推理 0.1
簡體字比例 ≥ 20% 0

語言訊號以「乘數」而非「加項」進入獎勵是刻意設計:如果只是加項,語言錯誤的懲罰會小於答錯題的懲罰,模型會樂於用錯誤語言換取正確答案。乘數令目標語言變成沒有議價空間——無論答案多正確,用錯語言都拿不到分。

訓練分兩個階段:第一階段用 GSM8K 數學題(50% 廣東話、25% 書面中文、25% 英文翻譯)建立格式及語言行為;第二階段擴展至六個環境——數學、程式碼生成、STEM 選擇題、工作場景助理,以及兩個專為廣東話新建的環境:規則式指令跟隨(52 種可驗證約束,包括繁體字純度、口語量詞、句末語氣詞、四字成語,甚至粵拼押韻)及結構化輸出(JSON/YAML/TOML 格式轉換,以香港新聞為原始文本)。這些環境已在 GitHub 開源。

訓練前的難度剖析亦給出了本報告最清晰的一組證據:同一批題目分別用英文及廣東話問,數學 pass rate 下跌 0.247、程式碼下跌 0.105,但結構化輸出(−0.012)和指令跟隨(−0.003)幾乎無損轉移。跨語言的推理差距是真實而且可量化的,而且集中在數學和程式碼這些推理密集的任務上。

評測結果

下表是整條管線每個 checkpoint 在 HKCanto-Eval 上的表現(Δ 為相對官方 chat 模型的變化):

Model MMLU CantoMMLU Cultural Linguistic Academic & Prof. Avg Δ
Qwen3 8B 81.08 76.68 57.94 39.50 81.61 67.36 -
8B Chat Vector 80.04 76.96 66.67 41.50 82.36 69.51 +3.18%
8B SFT 64.23 56.15 47.62 23.00 53.97 48.99 -27.27%
8B DPO 69.19 61.85 59.52 34.00 71.35 59.18 -12.14%
8B GRPO 73.86 69.73 58.33 36.00 76.08 62.80 -6.77%
Qwen3 30B-A3B Thinking 2507 86.65 82.52 68.65 57.00 86.70 76.30 -
30B-A3B Chat Vector 80.71 80.26 70.24 55.00 85.59 74.36 -2.55%
30B-A3B SFT 57.78 64.77 69.05 47.50 70.29 61.90 -18.87%
30B-A3B DPO 73.71 62.47 67.86 48.00 68.82 64.17 -15.90%
30B-A3B GRPO 84.26 76.24 65.06 56.50 83.70 73.16 -4.13%

最終的 30B-A3B 模型回升至 73.16 分,距離它起步的 Chat Vector 合併 checkpoint(74.36)只差 1.20 分——但關鍵分別是:合併 checkpoint 從來沒有用廣東話推理過,而最終模型可以一邊用廣東話思考、一邊用廣東話回答,還額外學會了翻譯、資料策展等在選擇題上量度不到的能力。8B 模型的恢復則只是部分(距離合併 checkpoint 仍差 6.71 分),反映教一個較小的模型用新語言推理的代價更大。

成本方面亦值得一提:SFT 加 DPO 合共只用了 283 GPU 小時,而 RLVR 用了 1,697 GPU 小時(未計三次失敗的 30B-A3B 嘗試再花掉的 2,472 小時)。用廣東話推理這件事,絕大部分成本花在強化學習上。

釋出的資源

這次工作釋出的不只是模型:

總結

回望 v1 的時候,我們用 2 億 tokens 訓練出一個「講得出廣東話」的模型;兩年後的 v2,我們用 784M tokens 加上五個階段的後訓練,得到一個「用廣東話思考」的模型。過程中最深刻的教訓是:低資源語言的問題會在管線的每一個環節以不同形式重現——loss 不可信、教師模型不存在、推理語料要靠翻譯、benchmark 看不見語言錯誤——而每一個問題都要用專門的診斷和設計去逐一拆解。

最根本的限制依然存在:世上仍然沒有長篇的原生廣東話推理語料。但這個雞先定蛋先的困局如今有了出口——v2 是第一個有能力生成及翻譯廣東話推理語料的模型,這些語料將會成為下一代模型的訓練材料。一如 v1 報告所講,我們仍然相信大語言模型的未來應該由開源社群主導;如今廣東話在這條路上,又行前了一步。