在訓練大型語言模型(LLM)的討論中,社群多數的目光常聚焦於模型架構、注意力機制的改良或後期對齊演算法。然而在實際落地時:

Garbage In, Garbage Out. 模型的泛化能力與表現上限,在資料管線完成時就已經大致底定。

這篇技術筆記整理 pretrain-v4 的工程實踐——一套 1,047 萬筆記錄、20.27 億 Token(其中 train 為 1,030 萬筆、19.91 億 Token)的英→繁中預訓練資料集,探討四項關鍵設計:

  1. 高品質平行語料不足時,如何透過本機 LLM 生成與切片擴展?
  2. 合成語料在生產環境中常見的品質陷阱與雙向防禦機制。
  3. 為什麼將內容「刻意重複 4 種格式變體」能有效解耦語意與排版?
  4. 如何運用純演算法與決定性雜湊,達成 100% 逐位元組可重放的工程管線。

1. 痛點:高品質平行語料的匱乏與「自給自足」

訓練具備精準語意對齊與道地繁體中文語感的翻譯模型,最大的挑戰往往在於訓練資料的品質。

實際盤點公開的英中平行語料(Parallel Corpus)時,常見幾項限制:

  • 句對品質良莠不齊:許多網路公開爬取的雙語句對充斥著機器翻譯殘渣、對齊錯位,或是簡體轉繁體後的生硬詞彙。
  • 領域與格式單一:常見的乾淨公開資料庫(如演講字幕、影視字幕)大多是口語短句,極度缺乏連貫的長文章、技術文檔或現代排版格式。
  • 繁體中文語感稀缺:巨量網頁語料中,純正台灣繁體中文的佔比偏低,高品質雙語對照更為罕見。

為了解決素材不足的問題,一個直接的策略是:利用本機部署的開源模型,將高品質的單語文本轉化為雙語平行語料。

自動化翻譯管線

為了實現大規模生成,專案建構了一條自動化翻譯管線,核心架構如下:

原始單語文本(百科 / 新聞 / 英文網頁)
       │
       ▼
 [隨機抖動切片器]         ── 依段落/句尾切割,加入 Jitter 偏移防長度僵化
       │
       ▼
 [本機 vLLM 批次推論]     ── 呼叫本機模型進行高吞吐雙向互譯 (EN ↔ ZH-TW)
       │
       ▼
 [多重品質閘門]           ── 檢查空白、長度比例異常 (0.15 ~ 8.0)、ASCII 異常
       │
       ▼
 翻譯儲存庫               ── 支援斷點續傳與血統追蹤
  • 隨機切片機制:長文本如果一律按固定字數切斷,會破壞句意且讓模型產生長度偏見。切片器優先在段落邊界(\n\n)與句子標點截斷,並加入隨機抖動(jitter),讓切片長度自然分佈。
  • 雙向擴充能力:
    • 正向素材:原生英文網頁語料,由模型翻譯為高品質繁體中文。
    • 反向素材:原生繁體中文(百科與新聞類文章),由模型翻譯出對應英文。這類素材保證了中文側 100% 純正道地!
  • 全合成格式化實驗:此外也探索了全合成方向,讓 LLM 依據主題池生成 Markdown、CSV、JSON、XML、混亂網頁文字(Messy Web Text)、網頁片段等 6 種真實世界排版,再進行互譯,累積了超過 42 萬筆「全合成」資料。其中約 25 萬筆最後以 Schema 類別併入 pretrain-v4(見 4.6),專門教模型「翻譯內容、保留結構」。

2. 合成語料的品質陷阱:英文側的「裸露中文洩漏」

依賴 LLM 生成訓練語料時,最大的風險往往來自未被定義的邊界異常。

在初期的品質檢查閘門(Quality Gate)中,配對驗證設置了多項檢驗:

  • 檢查譯文是否為空。
  • 檢查中文側是否包含 CJK 字元。
  • 嚴格檢查中文側是否含有簡體中文殘留。

然而,在後續的深度語料稽核(Audit)中,發現了一個關鍵漏洞:Gate 只防禦了中文側的合法性,卻未限制英文側出現中文。

對已生成的合成英文資料進行全量掃描後,確認有 0.61% 的英文欄位出現「裸露 CJK 洩漏」(非括號補充說明的中文字元):

  1. 未翻譯的簡體詞彙夾雜在英文中:例如模型翻譯中斷,直接輸出 "亲民党 Chairman Ko Wen-je"。
  2. 重複出現的樣板句尾洩漏:新聞或文章結尾的來源標記(如 "社群實驗室"、"社群口碑資料庫")未被翻譯,整段被原樣帶入英文結尾,形成系統性偏差。
  3. 破碎詞組殘渣:長句翻譯中途注意力發散導致尾端殘留中文字。

架構重構:銷毀過早定型產出,建立「通用池」機制

這批受污染的輸出總量達 500,000 筆。考量到系統性偏差在預訓練階段會被模型無差別吸收與放大,處理方式並非事後用正規表達式勉強修補,而是全數銷毀該批產出,並重構資料管線。

這次經驗確立了兩項關鍵架構原則:

  1. 雙向對稱防禦:驗證邏輯必須對 Source 與 Target 兩側同時設定語言防護欄。
  2. 避免過早承諾格式(Premature Commitment):不應過早將語料綁定為最終訓練格式或特定 Prompt 模板。

以此為基礎,管線演進出新一代的通用語料池,確立「引用不複製」與「方向中立」的架構:

  • 方向中立:只存純淨的英文與繁中兩欄,不預設誰是 source、誰是 target。
  • 三種視圖分離:
    • 整篇視圖:完整文件或句對。
    • 逐行視圖:精確對齊的單行。
    • 視窗視圖:文章相鄰切片組成的視窗。
  • 嚴格驗證通過:所有進池的資料必須經過獨立驗證腳本,確保簡體不殘留、無裸露洩漏。

3. 核心哲學:為什麼同一份內容要「刻意重複 4 種變體」?

在通用池建立完成後,資料組裝的核心挑戰在於:如何將多樣的格式映射至預訓練目標?

在傳統 NLP 觀念中,「重複資料(Duplication)」通常被視為冗餘,去重演算法(如 MinHash LSH)傾向於剃除相似文本。

但在 pretrain-v4 的設計中,採取了不同的工程策略: 原始不重複內容約 4.93 億 Token,組裝後(不含 Schema 類)拓展為 19.73 億 Token,擴增比例約 4.0×。

為什麼要這麼做?設計目標只有一句話:

「重排語言模型能力、格式不同變體,才能有效讓模型學會不同格式。」

如果同一篇精采的文章,永遠只以「正向、完美段落、標準換行」的形式出現一次,模型記住的往往是特定詞彙的統計共現; 但如果同一份語意素材,以緊密排列(Dense)、標準雙換行(Paragraph)、跨來源拼貼、帶有格式雜訊(Noise) 等多種變體反覆出現:

[同一組語意素材]
       ├── 變體 A:Dense      行間 \n,BRIDGE 為 \n\n
       ├── 變體 B:Paragraph  行間 \n\n,BRIDGE 為 \n\n\n
       ├── 變體 C:Mixed      每個行間隨機 \n 或 \n\n,BRIDGE 為 \n\n\n
       └── 延伸變體:         注入雜訊(Noise)、演算法結構變換(Shape)

A、B、C 三種換行是同一組素材各用一次,只差分隔符;雜訊與結構變換則是在原始素材上再疊一層。下方對照器中的前三個分頁,就是訓練集裡真實存在的同一組三行素材:

格式變體對照
同一份語意,模型實際看到的訓練文字長這樣
以下全部逐字取自訓練集;⏎ 為換行、→ 為 Tab、· 為連續空白
換行變體(同一組素材)
雜訊注入
結構變換
Mosaic · 緊密換行 82 tokens 3 行 BRIDGE \n\n
EN
Well... Have some grapes.⏎
- Every A.A. group ought to be fully self-supporting, declining outside contributions.⏎
National Taiwan University Museum of History - Architectural Introduction - Entrance
BRIDGE \n\n
ZH-TW
哦那拿一些葡萄去吧。⏎
- 每個 AA 團體都應完全自力維生,拒絕接受外部捐款。⏎
國立臺灣大學校史館-建築介紹-入口
行間一個 \n,BRIDGE 為 \n\n。三行分別來自影視字幕、英文網頁與百科,是刻意的跨來源拼貼。

模型學到的不再是特定排版下的字面順序,而是「語意與版面格式的解耦」。 無論兩段文字中間隔了一個換行還是兩個換行、行首有沒有 A. B. C. 編號、英文有沒有被抽乾空白,英中逐行對齊的邏輯都維持不變——這就是格式強健性(Format Robustness)的來源。


4. 資料集的六大類別

pretrain-v4 的 train split 共 10,304,296 筆、19.91 億 Token,依用途分為六個類別:

pretrain-v4 · train split
六大類別的 Token 配比
點擊色塊或下方標籤,查看各類別的規模、長度與設計目的
1,990,521,412 train tokens · 10,304,296 筆
Mosaic 拼貼文件
2–8 行跨來源拼貼,或同一段對話的連續句,考驗逐行精準對齊。
Token 總量 6.53 億 32.8% of train
記錄數 4,385,945 42.6% of records
長度中位數 101tok P10 35 · P90 348
反向素材 32.9% 全體 41.3%
設計重點 兩種拼法各有 Dense / Paragraph / Mixed 三種換行,同一組素材在三種模式各用一次。
語料血統:正向 vs 反向素材(token 佔比) 反向素材逐筆標記,可直接過濾
正向 58.7%
反向 41.3%
正向:原生平行語料(演講、影視字幕等)與原生英文網頁(中文由 LLM 翻譯) 反向:原生繁中(百科、新聞)→ 英文由 LLM 生成
類別記錄數Token 總量佔比平均 Token/筆長度中位數
Mosaic 拼貼文件4,385,9456.53 億32.8%148.9101
Base 原始對照2,662,8674.83 億24.3%181.5206
Longform 長篇視窗839,6763.21 億16.1%382.8393
Noise 雜訊注入1,507,8812.89 億14.5%191.9216
Shape 結構變換656,1731.91 億9.6%291.1311
Schema 結構化格式251,7540.52 億2.6%207.4197
合計(train)10,304,29619.91 億100%193.2182

validation(81,285 筆、0.18 億 Token)與 test(80,831 筆、0.18 億 Token)另計,類別比例與 train 相近。

4.1 Base(24.3%):純粹的對照基石

最質樸的形態:整篇短文或整個句對英中對照,英文在前、中文在後,以 BRIDGE 分隔,完整保留原作者的換行風格。它也是「不重複內容」的基準——4.93 億 Token 的 Base(含 val/test)就是 4.0× 擴增的分母。

4.2 Mosaic(32.8%):拼貼出來的模擬文件

資料集裡佔比最大的類別,分為兩大流派:

  • 跨來源拼貼:從不同文件抽 2–8 行隨機組成一篇「虛擬文件」。這考驗模型的逐行辨識力——上一行在講馬拉松、下一行在講乳癌治療,模型必須緊咬英文第 ii 行與中文第 ii 行的對應,不能跨行混淆。
  • 同段連續句:來自同一場演講或同一段影視對話的連續句子,訓練短對話的上下文連貫性。

兩者都各有 Dense / Paragraph / Mixed 三種換行,共 6 個變體。

4.3 Longform(16.1%):長序列連續篇章

取自英文網頁、百科與新聞文章中相鄰的 2–3 個切片視窗(95.9% 為 2 個)。組裝時會盡量把視窗填滿預算,因此平均長度高達 382.8 Token,57.0% 的記錄落在 385–458 Token 的上限邊界,專門負擔長篇語意的連貫性。

4.4 Noise(14.5%):五種真實世界抗污盾牌

真實使用者餵給模型的文本永遠是髒的:網頁複製貼上的殘留標籤、OCR 斷字、缺乏空格。我們對 Base 素材注入 5 種特殊雜訊,五型均分,合計佔(併入 Schema 類前)全部記錄的 15.000%:

  1. 無空白:英文單字間的空白全部抽乾(如 Searchingyourpockets,youfindsomething...),強迫模型學會子詞切分與強健對齊。
  2. 斷字:單字中間隨機斷字、插入換行或空白(如 affo-\nrds)。
  3. 亂空白:隨機插入大量連續空白與 \t。
  4. HTML 殘留:前後嵌入 </div><!-- /content -->、  等 HTML 殘留。
  5. 特殊符號:隨機插入 ·、‣、› 等罕見排版符號。

英文側一律注入;中文側只有後三種會依 0.5 的機率套用(無空白與斷字只影響英文)。

4.5 Shape(9.6%):純演算法保證的結構強健性

來自獨立的結構強健性產生器,原封不動併入。這裡沒有使用任何可能產生幻覺的 LLM,全部是純字串演算法變換:

  • 行序置換:同文件的行順序隨機置換(英中兩側套用相同的置換)。
  • 隨機標記:在行首或行尾插入相同的隨機 Token(如 REF-9650-RY)。
  • 字母條列:自動重組為 A. B. C. 條列清單。
  • 無換行黏合:將多行黏成單行,測試模型在沒有換行輔助時的斷句能力。
  • 另有複雜連結、重複片段等變換,一筆記錄可同時套用多種。

4.6 Schema(2.6%):結構化格式文件

最後一步才事後注入:LLM 合成的 JSON、CSV、XML、Markdown、混亂網頁文字與網頁片段,只翻譯值與文字,鍵名、標籤與語法原樣保留。注入後整批重新 shuffle。

它刻意只佔 2.6%,而且兩側內容都出自 LLM、主題池僅約 98 個主題,所以它教的是「結構保留」這個行為,而不是語言知識。

4.7 長度分佈:六種截然不同的形狀

佔比只說明了「有多少」,長度分佈則說明了「長什麼樣」。下圖是 train 全量 1,030 萬筆記錄的逐筆 Token 數分佈:

pretrain-v4 · 序列長度
每筆記錄的 Token 長度分佈
10,304,296 筆 train 記錄,以 16 tokens 為一格;懸停查看各格組成,點擊類別聚焦
0%2%4%6%8%10%中位數 182(全體)458064128192256320384tokens / 筆(紅線=預算上限)
各類別自身的長度形狀(記錄數,各自正規化)
表格檢視(記錄數佔比,依長度區間)
類別≤3233–9697–192193–320321–384385–458P10P50P90
Mosaic7.2%41.2%21.4%17.3%6.7%6.3%35101348
Base30.4%7.9%9.7%30.4%19.8%1.7%14206350
Longform0.0%0.0%0.6%11.9%30.5%57.0%309393442
Noise27.5%10.3%9.0%26.8%20.6%5.8%18216367
Shape2.0%7.9%13.4%29.4%20.3%26.9%97311439
Schema0.0%0.4%45.9%48.8%3.8%1.1%144197285
長度為訓練用分詞器對整段訓練文字(英文區塊 + BRIDGE + 中文區塊)的精算 token 數;最後一格為 449–458,上限 458 以上 0 筆。 Shape 類使用產生時的估值(較精算值少約 0.75%)。

幾個值得注意的形狀:

  • Base 與 Noise 呈明顯雙峰:約三成記錄 ≤ 32 Token(演講、影視字幕等句子語料),另一個峰落在 300–370 Token(整篇網頁與百科文件)。Noise 是從 Base 抽樣注入,形狀自然相似,但無空白等雜訊會讓同一段英文多出幾個 Token,整體略往右移。
  • Mosaic 集中在短序列:中位數只有 101 Token,同段連續句多為 2–3 句短對話,是整份資料集「短上下文」的主力。
  • Longform 堆在天花板:中位數 393、P90 高達 442,與 458 的上限只差一步,負責讓模型習慣「接近滿載」的長序列。
  • Shape 往長端偏:中位數 311,因為它把多行拼接後再疊加變換。
  • Schema 是唯一的單峰窄分佈:集中在 144–285 Token,結構化文件的長度本來就相對固定。

切換成「Token 量佔比」會更明顯:≤ 32 Token 的記錄佔了 15.1%,貢獻的 Token 卻只有 1.6%;反過來,250 Token 以上的記錄只佔 39%,卻承載了 70% 的 Token。訓練算力實際上大多花在長序列上,這也是 458 這條預算線必須逐筆精算的原因。


5. 工業級工程規範:如何做到「位元組級精確」?

在達到 20 億 Token 規模的資料管線中,為了確保可維護性與可重現性,pretrain-v4 確立了幾項核心工程規範:

① 嚴格的 458 Token 預算(0 筆超標)

許多預訓練腳本只是粗暴地截斷超出長度的句子,這會導致雙語對齊在末尾被一刀兩斷,模型只學到半句話。 在組裝管線中:

  • 湊窗時為每一行預留 4 Token、BRIDGE 預留 4 Token 的開銷緩衝。
  • 組裝完成後,直接呼叫訓練所用的分詞器(自訓 32K BPE)對整段訓練文字進行逐字精算。
  • 只要長度 >458> 458,這筆記錄立即丟棄並記錄原因(例如雜訊類因此丟棄 5,706 筆)。
  • 最終全量 10,466,412 筆資料,超出 458 Token 的記錄為 0 筆。

② 輕量可溯源:省去十幾 GB 暫存檔的決定性重放

在舊版管線中,為了做資料清洗與驗證,往往需要先生成十幾 GB 的中介暫存檔(staging),硬碟 I/O 負擔極重。 而在 pretrain-v4 中,Base / Mosaic / Longform / Noise 記錄皆在記憶體中直接組裝,並在每筆記錄中附帶少量元資料:

  • 素材 ID:素材在通用池中的原始 ID。
  • 分隔符清單:行與行之間實際使用的分隔符。
  • 雜訊種子:由全域 seed、雜訊類型與素材 ID 決定的隨機種子,重跑必得同一結果。

這意味著:不需要保留肥大的中介檔,隨時都能憑藉這組元資料從通用池中逐位元組(byte-level)重組出完整的訓練文本。 Shape 與 Schema 則原封不動搬運,可直接與來源檔逐筆比對;同 seed 重跑,每個分片的 sha256 都一致。

③ 以文章為單位的 Split 切分

如果將同一個網頁或百科頁面的片段隨機打散到 train 與 test,模型在測試集上的良好表現很可能只是因為它在訓練集「偷看過上下文」(Data Leakage)。 本資料集嚴格保證:同一篇文章的所有切片,100% 只能落在同一個 Split。39 萬篇文章無一跨界。

④ 坦誠公開:41.3% 的「反向素材」

在整體資料集中,有 41.3% 的 Token 屬於「繁體中文原文,英文為 LLM 譯文」的反向素材(主要來自百科與新聞)。 因為預訓練版面統一為:

<英文區塊> ⏎⏎(BRIDGE) <中文區塊>

且 Loss 計算涵蓋整段序列,這意味著模型的英文理解部分也會學到 LLM 產生的英文。 資料集逐筆標記了是否為反向素材,下游訓練若需調整正反向權重,可直接據此抽樣或過濾。


6. 成果驗證與結語

資料集組裝完成後,透過獨立於產生器(不 import 其湊窗與渲染函式)的驗證工具,對全量 1,047 萬筆資料逐筆檢查:

============================================================
              PRETRAIN-V4 VERIFICATION REPORT
============================================================
- Total Records Checked   : 10,466,412 (Train 10.30M / Val 81K / Test 81K)
- Byte-level Replay Check : 9,796,470 records MATCH 100%
- Structural Exact Match  :   669,942 records MATCH 100%
- Token Budget <= 458     : 2,026,768,596 tokens re-counted, 0 over budget
- Split Isolation Check   :   390,126 articles PASS (0 cross-split leakage)
- Noise Ratio Accuracy    : 15.000% excl. Schema      (Target 15.0%, ±0.001%)
- Determinism             : same seed -> identical sha256 per shard
------------------------------------------------------------
FINAL RESULT: ok: True, errors: []
============================================================

驗證結果全數通過(ok: True、errors: []),資料集在逐位元組重放、序列長度預算、文章隔離、雜訊比例與決定性上都符合規格。

這套預訓練資料工程實踐展示了幾項關鍵原則:

  1. 格式多樣性重於單純去重:同內容多變體能有效打破模型對特定排版的依賴,促使模型學會跨行與跨結構的語意對齊。
  2. 防禦必須是雙向的:合成語料不僅要檢查 Target 側的合規性,也必須防止 Source 側的語言滲漏與結構退化。
  3. 決定性勝於大量快取:透過可溯源的元資料與決定性種子,大幅降低儲存成本,同時保持 100% 的重現性。

下一步是決定各類別的混合權重,基於這份全量資料集做比例抽樣,進入預訓練實測。


規格總結與配置

  • 資料集版本:pretrain-v4(全域已 shuffle,共 105 組分片,約 11 GB)
  • 規模:10,466,412 筆、2,026,768,596 Token(train 19.91 億 / validation 0.18 億 / test 0.18 億)
  • 通用語料池:方向中立,解耦整篇 / 逐行 / 視窗三種視圖
  • 結構強健性:純字串演算法變換,不經 LLM
  • 分詞器:自訓 BPE(Byte Fallback,詞表大小 32,000)
  • 序列長度上限:458 Tokens(逐筆精算,0 筆超標;全體中位數 182)
  • 反向素材:41.3% Token(逐筆標記)