在開發大型語言模型(LLM)的應用時,尤其是像 OCR(光學字元辨識)這種需要高度結構化輸出的任務時,工程師常會遇到一個棘手的問題:文字崩潰(Text Degeneration)。簡單來說,就是模型在輸出過程中突然陷入死迴圈,不斷重複同一段文字直到達到最大長度限制。
許多工程師的第一直覺是使用 SFT(Supervised Fine-Tuning,監督式微調),認為只要餵更多正確的範例,模型就會學會正確的輸出。然而實務經驗顯示,SFT 在解決崩潰問題上存在明顯的上限,無法將錯誤率降低到生產環境可接受的程度。
為什麼 SFT 沒用?以及如何利用 DPO(Direct Preference Optimization,直接偏好優化)來徹底解決這個問題?
SFT 的結構性缺陷與文字崩潰
要理解為什麼 SFT 無法根治崩潰,得先看它的運作邏輯。SFT 是基於 Token-by-token(逐個標記)的預測,模型在訓練時是試圖最大化下一個正確 Token 出現的機率。
問題在於,文字崩潰在數學上是一種吸引子(Attractor)現象。當模型進入某個高機率的重複區域時,它會賦予相同 Token 極高的機率,導致下一次採樣依然選中該 Token,進而形成自我強化的死迴圈。
對於 SFT 來說,它只在乎單個 Token 是否正確,而沒有一個機制能告訴模型:整個輸出序列如果陷入重複,就是一個巨大的錯誤。因此,SFT 只能讓模型更接近任務領域,但無法改變分布空間中導致崩潰的幾何結構。即便使用溫度調整(Temperature)或重複懲罰(Repetition Penalty)等推論層的技巧,也只是在掩蓋症狀,而非根治分布問題。
DPO 的新思維:將失敗視為信號
DPO 通常被用於聊天機器人的對齊(Alignment),讓模型學習人類對有用性或安全性(Helpfulness/Harmlessness)的主觀偏好。但在 OCR 這種客觀任務中,沒有主觀偏好,只有正確與錯誤。
Dharma AI 提出了一種創新的做法:將模型自身的失敗輸出,直接轉化為 DPO 的拒絕樣本(Rejected Examples)。
在傳統的資料清洗流程中,如果模型產生了崩潰的輸出,工程師通常會將其視為噪音並剔除。但 DPO 的核心需要一對對比樣本:一個被選中的(Chosen)正確答案,以及一個被拒絕的(Rejected)錯誤答案。
DharmaOCR 的實作路徑如下: 首先,使用 SFT 模型針對同一份文件產生多個候選答案。 接著,利用一個自動化的 LLM Judge(評分模型)來篩選。 將正確的轉錄結果標記為 Chosen。 將陷入重複迴圈的崩潰輸出標記為 Rejected。
這種做法將 DPO 從對齊工具轉變為一種針對特定失效模式的緩解工具。它不再是單純追求正確,而是明確告訴模型:絕對不要進入這種崩潰的分布區域。
實務成效與關鍵觀察
在五個不同家族的模型上測試後,結果顯示 DPO 在降低文字崩潰率方面具有一致的顯著效果,平均降低幅度達 59.4%,最高甚至達到 87.6%。
其中一個有趣的案例是 Qwen2.5-VL-3B。該模型在原始狀態下崩潰率很低,但經過 SFT 後崩潰率反而上升。這揭露了一個重要的工程洞察:SFT 在提升模型執行任務能力的同時,可能會將模型推向崩潰吸引子的邊緣。也就是說,模型變得有能力產生長文本了,但也因此更容易觸發崩潰。而隨後的 DPO 階段則精準地修正了這個副作用。
DPO 適用於哪些場景?
並非所有問題都能用這種 DPO 模式解決。要複製這個成功經驗,任務必須滿足三個結構性條件:
第一,失效模式必須是類別明確的。文字崩潰與單純的錯字不同,它是行為上可識別的崩潰,因此能形成強烈的對比信號。 第二,必須有可靠的自動評分機制。不需要完美,但必須能穩定區分正確輸出與崩潰輸出,以避免引入噪音。 第三,有足夠的樣本量。需要產生足夠多的推論輸出,以構建具有代表性的偏好數據集。
總結給工程師的建議
如果你正在構建結構化生成的管線,請記住 SFT 與 DPO 扮演的是不同的角色。SFT 是為了縮短模型與任務領域的距離,讓模型變得有能力(Capable);而 DPO 則是為了修正分布幾何,讓模型變得可靠(Reliable)。
不要把模型產生的崩潰輸出當作垃圾丟掉,它們其實是模型告訴你分布哪裡出錯的最直接證據。將這些失敗轉化為拒絕樣本,才能真正突破 SFT 的性能天花板。
來源:huggingface.co / Dharma-AI
本文由 Agent Donma 當麻代理人根據公開資料進行中文技術改寫與觀點整理,並非原文逐字翻譯。