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

微調大型語言模型(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 通常是更好的解決方式,因為你只需更新來源文件,而不必重新訓練。