在訓練大型語言模型(LLM)的討論中,社群多數的目光常聚焦於模型架構、注意力機制的改良或後期對齊演算法。然而在實際落地時:
Garbage In, Garbage Out. 模型的泛化能力與表現上限,在資料管線完成時就已經大致底定。
這篇技術筆記整理 pretrain-v4 的工程實踐——一套 1,047 萬筆記錄、20.27 億 Token(其中 train 為 1,030 萬筆、19.91 億 Token)的英→繁中預訓練資料集,探討四項關鍵設計:
- 高品質平行語料不足時,如何透過本機 LLM 生成與切片擴展?
- 合成語料在生產環境中常見的品質陷阱與雙向防禦機制。
- 為什麼將內容「刻意重複 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 洩漏」(非括號補充說明的中文字元):
- 未翻譯的簡體詞彙夾雜在英文中:例如模型翻譯中斷,直接輸出
"亲民党 Chairman Ko Wen-je"。 - 重複出現的樣板句尾洩漏:新聞或文章結尾的來源標記(如
"社群實驗室"、"社群口碑資料庫")未被翻譯,整段被原樣帶入英文結尾,形成系統性偏差。 - 破碎詞組殘渣:長句翻譯中途注意力發散導致尾端殘留中文字。
架構重構:銷毀過早定型產出,建立「通用池」機制
這批受污染的輸出總量達 500,000 筆。考量到系統性偏差在預訓練階段會被模型無差別吸收與放大,處理方式並非事後用正規表達式勉強修補,而是全數銷毀該批產出,並重構資料管線。
這次經驗確立了兩項關鍵架構原則:
- 雙向對稱防禦:驗證邏輯必須對 Source 與 Target 兩側同時設定語言防護欄。
- 避免過早承諾格式(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 三種換行是同一組素材各用一次,只差分隔符;雜訊與結構變換則是在原始素材上再疊一層。下方對照器中的前三個分頁,就是訓練集裡真實存在的同一組三行素材:
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
\n\n 哦那拿一些葡萄去吧。⏎ - 每個 AA 團體都應完全自力維生,拒絕接受外部捐款。⏎ 國立臺灣大學校史館-建築介紹-入口
模型學到的不再是特定排版下的字面順序,而是「語意與版面格式的解耦」。 無論兩段文字中間隔了一個換行還是兩個換行、行首有沒有 A. B. C. 編號、英文有沒有被抽乾空白,英中逐行對齊的邏輯都維持不變——這就是格式強健性(Format Robustness)的來源。
4. 資料集的六大類別
pretrain-v4 的 train split 共 10,304,296 筆、19.91 億 Token,依用途分為六個類別:
| 類別 | 記錄數 | Token 總量 | 佔比 | 平均 Token/筆 | 長度中位數 |
|---|---|---|---|---|---|
| Mosaic 拼貼文件 | 4,385,945 | 6.53 億 | 32.8% | 148.9 | 101 |
| Base 原始對照 | 2,662,867 | 4.83 億 | 24.3% | 181.5 | 206 |
| Longform 長篇視窗 | 839,676 | 3.21 億 | 16.1% | 382.8 | 393 |
| Noise 雜訊注入 | 1,507,881 | 2.89 億 | 14.5% | 191.9 | 216 |
| Shape 結構變換 | 656,173 | 1.91 億 | 9.6% | 291.1 | 311 |
| Schema 結構化格式 | 251,754 | 0.52 億 | 2.6% | 207.4 | 197 |
| 合計(train) | 10,304,296 | 19.91 億 | 100% | 193.2 | 182 |
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 行隨機組成一篇「虛擬文件」。這考驗模型的逐行辨識力——上一行在講馬拉松、下一行在講乳癌治療,模型必須緊咬英文第 行與中文第 行的對應,不能跨行混淆。
- 同段連續句:來自同一場演講或同一段影視對話的連續句子,訓練短對話的上下文連貫性。
兩者都各有 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%:
- 無空白:英文單字間的空白全部抽乾(如
Searchingyourpockets,youfindsomething...),強迫模型學會子詞切分與強健對齊。 - 斷字:單字中間隨機斷字、插入換行或空白(如
affo-\nrds)。 - 亂空白:隨機插入大量連續空白與
\t。 - HTML 殘留:前後嵌入
</div><!-- /content -->、等 HTML 殘留。 - 特殊符號:隨機插入
·、‣、›等罕見排版符號。
英文側一律注入;中文側只有後三種會依 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 數分佈:
表格檢視(記錄數佔比,依長度區間)
| 類別 | ≤32 | 33–96 | 97–192 | 193–320 | 321–384 | 385–458 | P10 | P50 | P90 |
|---|---|---|---|---|---|---|---|---|---|
| Mosaic | 7.2% | 41.2% | 21.4% | 17.3% | 6.7% | 6.3% | 35 | 101 | 348 |
| Base | 30.4% | 7.9% | 9.7% | 30.4% | 19.8% | 1.7% | 14 | 206 | 350 |
| Longform | 0.0% | 0.0% | 0.6% | 11.9% | 30.5% | 57.0% | 309 | 393 | 442 |
| Noise | 27.5% | 10.3% | 9.0% | 26.8% | 20.6% | 5.8% | 18 | 216 | 367 |
| Shape | 2.0% | 7.9% | 13.4% | 29.4% | 20.3% | 26.9% | 97 | 311 | 439 |
| Schema | 0.0% | 0.4% | 45.9% | 48.8% | 3.8% | 1.1% | 144 | 197 | 285 |
幾個值得注意的形狀:
- 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)對整段訓練文字進行逐字精算。
- 只要長度 ,這筆記錄立即丟棄並記錄原因(例如雜訊類因此丟棄 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: []),資料集在逐位元組重放、序列長度預算、文章隔離、雜訊比例與決定性上都符合規格。
這套預訓練資料工程實踐展示了幾項關鍵原則:
- 格式多樣性重於單純去重:同內容多變體能有效打破模型對特定排版的依賴,促使模型學會跨行與跨結構的語意對齊。
- 防禦必須是雙向的:合成語料不僅要檢查 Target 側的合規性,也必須防止 Source 側的語言滲漏與結構退化。
- 決定性勝於大量快取:透過可溯源的元資料與決定性種子,大幅降低儲存成本,同時保持 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(逐筆標記)