如何微調 LLM [以及何時改用 RAG 或提示]

本指南逐步說明如何微調 LLM,比較完整微調與 LoRA 和 QLoRA 的差異,並說明何時使用提示或 RAG 是改善模型輸出的更佳方式。

Diagram comparing pre-training and fine-tuning: pre-training turns a vast general text corpus (trillions of tokens, large labs, huge compute) into a base model, while fine-tuning combines a base model with a small task-specific dataset (a few hundred to a few thousand examples, one GPU, hours) to produce a specialized model.

微調大型語言模型(LLM)是指以小型、針對特定任務的資料集進一步調整預先訓練好的 LLM,讓它產出單靠提示詞無法獲得的結果。

微調的流程包括:蒐集能展現理想行為的輸入/輸出範例配對、執行訓練讓模型權重朝這些範例調整,再將結果與原始模型的輸出進行比對。LoRA 等參數高效方法能大幅降低成本,只需單一 GPU 即可執行。

如果您對 LLM 的輸出不滿意,請先改善提示詞和檢索增強生成(RAG)。微調改變的是 LLM 的行為方式。若您需要它使用最新或專有資訊,提示詞和 RAG 通常是更好的選擇。

以下將逐步說明如何微調 LLM、主要的微調方法(LoRA 與 QLoRA),以及可能導致流程失敗的挑戰與錯誤。

什麼是 LLM 微調?它與 LLM 預先訓練有何不同

LLM 預先訓練是在龐大的語料庫上從頭建立模型的通用語言能力,而 LLM 微調則是以小型資料集調整預先訓練好的模型,使其專精於單一工作。

LLM 預先訓練是產生基礎模型的資源密集階段。模型從廣泛的文字語料庫中學習,因而具備一般的文法、事實知識與推理能力,但並未針對您的任務進行專門化。

LLM 微調會以小型、精心整理的資料集繼續訓練基礎模型,使其針對特定任務或使用情境產出理想的結果。例如一致的格式、品牌語調或風格、特定領域的模式,或可靠的工具與函式呼叫。

何時該微調 LLM,何時該改用提示詞或 RAG

若要提升 LLM 的效能,請循序漸進:提示詞 -> RAG -> 微調。

透過更詳細的指示改善提示詞,並使用 RAG 為模型提供最新資訊。只有在改善提示詞與檢索仍無法奏效時,才使用微調。

做法

改變的對象

適用時機

主要限制

提示詞工程

您傳送的請求

行為已接近理想,且您希望快速見效、可隨時復原

受限於基礎模型既有的能力

RAG

模型在推論時看到的內容

事實經常變動,且您需要 LLM 存取最新資訊

增加檢索延遲與基礎架構負擔;不會改變行為

LLM 微調

模型的權重(模型內部參數)

您需要大規模維持一致的行為、格式或語調,或希望每次呼叫都使用較短的提示詞

前期成本高、內化於權重中的知識會過時、可能遺忘預先訓練習得的行為

何時改善提示詞勝過微調,何時則力有未逮

提示詞是最快速、最便宜的手段。在許多情況下,更精確、更詳細的提示詞就能達成理想的行為改變。

但較長的提示詞會拖慢作業速度、提高成本,而且無法突破模型既有的限制。

提示詞可能已達極限的跡象:

  • 新的邊緣案例不斷導致輸出出錯:例如,您需要 JSON 時模型卻回傳敘述性文字,或語調偏離,而您得為每個新案例修補提示詞。
  • 系統提示詞不斷膨脹:提示詞長達數百甚至數千行,難以管理。
  • 每次呼叫都得付出代價:每個請求都會重新傳送並處理提示詞,因此 token 成本與延遲隨之增加。
  • 修改已不再見效:新增的指示無法改善輸出。

即使如此,仍應先嘗試成本較低的提示詞層級修正。使用少樣本範例(輸入/輸出配對)向模型示範模式、以提示鏈將困難的任務拆解成較小的步驟,或透過函式呼叫掛鉤將精確查詢或運算交由外部處理。

何時 RAG 比微調模型更合適

RAG 改變的是 LLM 知道什麼,而 LLM 微調改變的是它的行為方式。如果差距在於知識,尤其是經常變動或存放在您自有文件中的知識,RAG 就是解答。如果差距在於行為,就進行微調。

微調也會改變模型所知道的內容,但模型吸收的任何事實都凍結於訓練當下,在快速變化的領域中很快就會過時。此外,這些資訊會內化到模型的權重中,因此不會留下任何來源紀錄。

更新檢索層所使用的來源文件更快速、更便宜,而且檢索層能引用它所使用的確切來源。因此,當您需要有憑有據的最新資訊時,RAG 是更好的選擇。

RAG 的缺點?它需要額外建置與維護一層架構,而且會增加延遲。

實務上,您通常兩者都需要。正式環境的系統會將微調模型與 RAG 搭配使用,一個負責一致的行為,另一個負責提供最新事實。

常見的微調陷阱、風險與挑戰

即使微調是合適的工具,它仍伴隨著成本與風險:

  • 成本與時間:整理乾淨且具代表性的訓練資料,以及訓練所需的運算資源,都所費不貲。
  • 災難性遺忘:以範圍狹窄的資料集訓練後,模型可能喪失通用技能並出現新的失敗模式,產生基礎模型原本不會犯的錯誤。
  • 過度擬合:如果資料太少或過於重複,模型會死記訓練範例而非學習模式,因此在訓練樣本上表現良好,面對實際輸入時卻表現不佳。
  • 過時:內化於權重中的知識很快就會過時,因此您必須以新資料重新訓練。
  • 遭到淘汰:當更強大的模型推出時,往往無須任何調整就能勝過您微調過的模型,讓您不得不重做一遍。
  • 評估與重現的挑戰:要證明微調模型的表現優於基礎模型並不容易。此外,即使使用相同設定,兩次 GPU 訓練也可能產生略有差異的模型。
  • 資料治理:以專有或敏感資料進行訓練會引發隱私與授權問題;模型日後可能會洩露部分訓練內容。

主要的微調方法

LLM 微調的主要類型差別在於改變模型的程度:完整微調會重新訓練整個模型,而 LoRA 和 QLoRA 等參數高效微調(PEFT)方法只會更新部分權重。PEFT 方法所需的記憶體僅為完整微調的一小部分,且在設定得當時,能達到相當的成果。

完整微調會更新模型的每一個權重。這是成本最高的方法,發生災難性遺忘的風險也最高。請將它保留給需要大幅改變行為、且您擁有足夠資料與運算資源支援的情況。

另一種做法是參數高效微調,也就是 PEFT。這是一個統稱,泛指凍結模型大部分參數、只訓練一小組參數的各種方法。由於基礎模型維持不變,它使用的記憶體少得多,也比較不容易發生遺忘。

在低秩設定下,PEFT 學到的內容比完整微調少,但提高秩並調整學習率後,便能在指令微調任務上縮小大部分差距。

PEFT 方法包括:

  • LoRA(低秩適應):這是常見的起點,會凍結原始權重,只訓練一小組新增的配接器參數(通常不到總數的 1%),因此可在單一消費級 GPU 上執行。
  • QLoRA(量化低秩適應):它會在套用 LoRA 之前,先將基礎模型壓縮為 4 位元精度,讓您能在單一 GPU 上微調大型模型。

方法

更新的對象

實際硬體需求

適用時機

完整微調

模型中的每一個權重

7B 級模型需要一個多 GPU 節點,更大的模型則需要更多

您需要深度改變行為,且擁有足夠的資料與運算資源

LoRA(PEFT)

一小組新增的配接器權重

單一消費級 GPU

您的預設起點

QLoRA(PEFT)

在 4 位元壓縮的基礎模型上使用 LoRA 配接器

在單一 GPU 上執行超大型模型

您的記憶體有限,但想使用大型基礎模型

除此之外,我們還會使用指令微調與偏好微調方法,從 RLHF(基於人類回饋的強化學習)到較輕量的替代方案,例如直接偏好最佳化(DPO)和勝算比偏好最佳化(ORPO),藉此塑造模型遵循指示及符合人類偏好的方式。

如何逐步微調 LLM

一旦您確定微調 LLM 是正確的決定,以下就是具體的工作流程。

步驟 1:定義任務以及衡量成功的方式

決定您希望 LLM 展現什麼行為,以及如何確認已達成目標。

明確指出您希望微調模型完成的具體工作,例如分類客服工單、以固定格式摘要合約,或依照您團隊內部的風格產生程式碼。

接著定義成功的標準。常見的選項包括:

  • 輸出有效性:例如,結果能否解析為有效的 JSON,或是否符合您需要的 Markdown 結構?
  • 自動化評分:使用 BLEU 或 ROUGE 等指標,將產生的文字與參考答案比較,或採用已標記資料集上的任務準確率。
  • 人工評分:針對難以用腳本評分的特質(例如語調或實用性),採用計分制或通過/不通過的評分準則。
  • 困難輸入的可靠性:它能否處理曾讓基礎模型出錯的特殊輸入?

步驟 2:準備資料集

資料品質決定微調的成敗,因此請投入心力蒐集合適的微調資料集。

將資料整理成 JSONL 格式的指令/回應配對,每一行包含輸入(以及任何上下文)和您希望得到的確切輸出。

例如,您可以參考公開資料集,像是通用指令資料集 Alpaca-cleaned 或 Databricks 的 Dolly,或是特定任務資料集 banking77,其中包含超過 13,000 筆真實客服查詢,並標記為 77 種意圖。

對於目標明確的任務,數百到數千個乾淨且多元的範例就足以改變行為,前提是這些範例要能反映實際正式環境中的輸入(包括邊緣案例),且格式一致。

還沒有輸入/輸出配對嗎?您可以利用現有的資料建立資料集,例如客服工單與其最佳回覆,或文件與其摘要。

如果您只有輸出,可以使用更強大的模型為每個輸出產生合理的輸入,或手動撰寫一小組種子資料,再用較大的「教師」模型擴充,然後保留最好的配對。

最後,將資料分成訓練集、驗證集和測試集,以便使用模型未曾見過的範例進行評估。

步驟 3:選擇基礎模型與方法

從參數量為 30 億到 70 億的小型開源模型開始,並搭配 LoRA 或 QLoRA 等參數高效微調方法。

Llama、Mistral 和 Qwen 等開放模型系列能提供可自行託管的強大基礎,而 PEFT 方法則能壓低硬體門檻:QLoRA 會將基礎模型量化為 4 位元,因此微調 7B 模型只需要一張 16-24GB 的消費級顯示卡。若對同一個模型進行完整微調,所需記憶體則是其數倍之多。

步驟 4:設定訓練超參數

以下是 LLM 微調的關鍵參數及建議的起始範圍:

  • 學習率控制每次權重更新的幅度。Biderman 等人於 2024 年發表的研究發現,LoRA 的最佳學習率約為完整微調的十倍,通常是 5e-5 至 5e-4,而完整微調則為 1e-5 至 5e-5。該研究建議在 1e-5 至 5e-4 的範圍內進行掃描,並採用能穩定訓練的最高值。
  • 批次大小是指模型在每次更新權重前所學習的樣本數量。在單一 GPU 上,請將每個裝置的批次大小設得較小(1 到 8),並搭配梯度累積,使有效批次達到約 16 到 64。
  • 訓練週期數是指模型完整看過整個資料集的次數。訓練模型執行特定任務時,1 到 3 個週期是不錯的經驗法則,但 LoRA 訓練通常需要更多週期。
  • LoRA 秩(r)決定適配器的容量,也就是它能學習多少內容。較簡單的任務可從 8 到 32 開始,較困難的任務則再調高:在前文引用的 Biderman 等人 LoRA 研究中,以程式碼對 7B 模型進行指令微調時,需要秩 256 才能媲美完整微調,而在數學任務上,秩 64 就已相當接近。
  • 最大序列長度是此次訓練所能處理的最長輸入。請將其設定為足以涵蓋最長的樣本,上限為模型的上下文視窗,因為任何更長的內容都會遭到截斷。
  • 暖身與排程控制學習率在訓練過程中如何逐步提升與變化。常見的預設做法是短暫暖身搭配餘弦衰減。不過,Pareja 等人的小型模型研究發現,省略暖身並不會降低最終分數。

請將這些設定視為參數掃描的起點,而非固定不變的設定。

步驟 5:訓練並監控損失

訓練進行時,請觀察訓練損失與驗證損失曲線,判斷訓練是否奏效。

損失衡量的是模型輸出與你的樣本之間的差距,隨著訓練進行,損失應平穩下降。訓練損失涵蓋模型用來學習的資料,驗證損失則是以預留的樣本計算。

如果訓練損失與驗證損失同步下降,代表模型正在學習泛化。如果訓練損失持續下降,但驗證損失趨於平緩或開始上升,代表模型正在死記訓練集,而非學習其中的模式(過度擬合)。

步驟 6:先評估,再部署

訓練損失低並不保證輸出正確,因此請依照你在步驟 1 設定的標準評估微調後的模型。

通過評估後,有兩種部署方式:

  • 以基礎模型搭配適配器提供服務,並在執行階段同時載入兩者;如此一來,適配器便可隨時替換。
  • 將適配器合併到基礎權重中,即可得到單一的獨立模型,託管起來更簡單。

使用 Perplexity 讓你的 LLM 取得最新資訊

當你想讓模型行為符合自身需求時,微調是正確的選擇。

如果你的模型需要最新資訊,尤其是快速變化的資訊,你就需要 RAG 或可靠的第三方搜尋工具。

自建檢索堆疊最適合專有資料集,例如內部 Wiki、客服紀錄、合約或產品文件。

如果你要使用的知識是公開的,就不必自行打造專屬的檢索層。Perplexity 是一款答案引擎,會根據即時網路索引回傳附有可點擊行內引用來源的回應。其 Agent API 只需一次呼叫,就能提供這些以網路資料為依據並附上引用來源的答案,讓你的應用程式能運用最新來源。

LLM 微調常見問題

可以免費微調 LLM 嗎?

可以,你可以免費微調小型開放 LLM。例如,Google Colab 的免費方案提供足夠的 GPU 資源,能在 3B 到 8B 的模型上執行 QLoRA,對於目標明確的任務來說已綽綽有餘。當你需要更多記憶體、更長的訓練時間,或免費方案無法容納的更大基礎模型時,才需要開始付費。

你需要自己的 GPU,還是可以在雲端進行微調?

微調 LLM 不需要自己擁有 GPU。代管服務與 GPU 雲端供應商以小時計費出租硬體,因此租用單一 GPU 就足以執行小型模型的 QLoRA 訓練。只有在你經常進行微調,或必須將所有資料保留在自己的機器上時,購買 GPU 才划算。

微調 LLM 需要多久時間?

對於小型 LLM,一次訓練可能在幾分鐘到幾小時內完成,視資料集大小與硬體而定。例如,Oumi 在其託管平台上僅花了一個多小時就完整微調了一個 0.8B 模型。

更大的模型或數萬筆樣本,會讓所需時間拉長到一天甚至更久:Emburse 的 LoRA 訓練在單一 40GB GPU 上對 7B 模型進行,5,000 筆樣本耗時 8 小時,50,000 筆則約需 30 小時。

資料變動時,可以持續更新微調後的模型嗎?

你可以用新資料重新微調,但每一輪都會耗費運算資源,並有發生災難性遺忘的風險。對於經常變動的知識,RAG 通常是更好的解決方式,因為你只需更新來源文件,而不必重新訓練。