如何訓練你的大型語言模型

打造一個聽起來很智能的大型語言模型 (LLM) 助手,就像在反復塑造泥塑一樣。你從一塊泥土開始,把它擠壓成一個可行的結構,然后開始精雕細琢,直到最終成品。越接近最終成品,那些精妙的點綴就越重要,正是這些點綴決定了最終成品是杰作還是恐怖谷效應。
在完成前面的步驟之前,你無法開始處理細節。同樣,你也不能直接把一個沒有經過預訓練的 LLM 架構扔進偏好優化和推理中。模型需要有足夠的基礎,才能獲得哪怕是一點點獎勵,從而朝著合理的良好行為方向發展。
這種“塑造”過程仍然是一個活躍的研究領域,我們還沒有完全達到超級一致的尋求真理和有意圖的助手的圣杯,但我們在對這門手藝的集體理解方面已經取得了巨大的進步。

Kimi和Deepseek 的論文都向世界揭示了大量有價值的信息,關于如何進行預訓練并添加監督微調和強化學習作為層,以不斷提高 LLM 的實用性。
作為參考,Deepseek V3 的訓練基于14.8萬億代幣這大約相當于1.23億部平均長度的小說的文本。為了提供一個規模感,谷歌在 2010 年估計,人類總共寫了 1.29 億本書。

一、模型訓練技巧:大型語言模型雕塑家的工具
為了獲得復雜的語言模型行為,例如思路鏈 (CoT) 推理和工具使用,LLM 在三個耦合循環中接受訓練。

1.自監督預訓練
就像粘土成型后才能開始雕刻一樣,語言模型只有在擁有一個能夠運作的人類語言模型后,才能開始實現復雜的推理行為。它們需要能夠從某種數據分布中生成令人信服的文本,然后才能將其文本轉化為類似聊天的交互和推理。
第一個循環是預訓練階段,通過對混合領域數據進行大規模自監督學習,獲得原始容量和通用先驗知識。模型會從各種來源獲取大量原始文本數據:代碼、百科全書、教科書、網頁等等。自監督學習的應用方式是在文本中制造空白,并迫使模型學習如何填補空白并學習人類語言的趨勢。
現代堆棧依賴于架構和系統技巧:混合專家 (MoE)可在不降低密集計算成本的情況下提高容量,多頭潛在注意力( MLA)可縮減注意力內存,FP8/MuonClip可實現穩定的高吞吐量數值計算,有時還會使用多標記預測 (MTP)來提高目標函數的密度并實現更快的推測解碼。可以將其視為大規模地教授模型“語言的工作原理”,同時對訓練過程進行設計,使其不會耗盡 GPU 或導致損失曲線爆炸。
2.訓練后微調
第二個循環是訓練后,它賦予基礎模型可操控性和風格。團隊通常從對指令、JSON 格式和工具調用軌跡進行監督微調 (SFT)開始,以教會模型如何按照指令與用戶交互。如果沒有微調,LLM 就只能無限地補充文本并從訓練堆中重復使用 token。我們需要通過合成一個類似腳本的聊天交互數據集,將這個流引導到與用戶更簡潔的交互中,該數據集將用于引導模型的 token 生成趨向于“指令”格式。這就是所謂的指令微調。
當模型能夠以類似聊天的方式進行響應后,我們就可以應用更精細的強化學習 (RL) 技術,例如直接偏好優化 (Direct Preference Optimization)和群體相對策略優化 (GRPO),來塑造語氣、安全性以及對模式的遵循。這正是流程中對齊部分發揮作用的地方,我們開始塑造模型,以創建人類認為有用的輸出。
最后,我們可以應用特定的行為強化學習技術。其中一種技術是針對數學/代碼/格式的可驗證獎勵強化學習,其中自動評分器會為正確答案的模型提供明確的獎勵。另一種是以思維鏈 (CoT)推理為中心的強化學習(o1/R1 風格),它推動文本中類似人類的思維模式和自我反思,通過更長的生成時間和測試時間計算來增強問題解決能力。
工具使用培訓
就像思維行為通過強化學習引導灌輸到模型中一樣,工具使用是另一種生成模式,在模型調整時會更自然地出現
為了讓 LLM 生成正確的輸出以使用系統集成,我們參與了代理/工具循環,讓模型學習如何在現實世界中執行操作。在這里,實驗室擴展高覆蓋率的工具調用軌跡并強制執行嚴格的模式,然后在沙盒環境(瀏覽器、終端、代碼庫)中進行訓練,以縮小“知”與“行”之間的差距。少量的聯合強化學習可以提高工具成功率并減少延遲,但大部分可靠性仍然來自于良好的軌跡和規范的模式。
最近有報道稱,OpenAI o3 類推理模型已成功利用工具調用訓練循環與推理微調相結合,使模型能夠自發地使用工具間歇性地生成推理文本。
來自開源領域的兩個具體錨點可以讓我們深入了解這一過程。DeepSeek -V3使用671B 參數的 MoE,每個 token約有37B 活躍數據,在14.8T 的 token上進行預訓練,并在FP8和MTP中進行分層,以穩定訓練并加速推理。Kimi K2 的MoE可擴展到約 1.04T 參數,每個 token約有32B 活躍數據,在15.5T 的 token上進行預訓練,并依賴MuonClip來避免萬億參數規模的損失峰值。然后,它通過大規模工具使用綜合和聯合強化學習,大量依賴于代理/工具循環。
在實踐中:預訓練創建一個對語言有一致理解的模型,后訓練灌輸行為屬性,使模型能夠在聊天中使用工具、推理和角色扮演。
3.微調與提示
當我們能夠為指令調整模型提供完整的指令集并讓它遵循提示指令時,為什么我們還要進行微調?
原因在于指令微調的程度有限。提示中的潛在指令空間巨大,模型需要平衡先前關于工具調用的指令與來自新數據源的后續信息。很快,上下文就會變得極其混亂,注意力也會變得緊張。
如果不學習如何以正確的方式理解所有信息,以及在正確的時間關注哪些信息,指令調優模型在代理工具使用場景中很快就會崩潰。雖然可以繞過非工具調用模型的局限性,但通常來說,插入一個因成功駕馭指令遵循、推理和工具使用的復雜空間而獲得獎勵的模型會更有效。
二、塑造之手:數據是什么樣的
LLM 訓練過程中最關鍵的部分當然是數據。獲取足夠的數據來建模語言,存儲數據、引用和注釋數據,并將其按固定長度的序列分塊輸入到模型中,這背后有一個復雜的過程。
從生物信息學來看,我發現這個過程與DNA測序在機制上存在相似之處。為了使DNA達到可讀取的程度,需要經過一個漫長而敏感的預處理流程。而一旦將解決方案放入測序儀中,測序儀對序列的長度和質量會有特定的要求,才能真正讀取數據。
對于 LLM 來說,情況有些類似。為了提高效率,我們需要能夠將整個文本語料庫分塊,并在訓練期間將質量控制的、帶注釋的固定長度輸入到模型中,以便我們能夠大規模地進行高效的并行處理。

端到端數據處理路徑從“原始源”中發現的各種格式的數據一直到可以作為令牌 ID 整齊地加載到 Python DataLoader 中的固定長度序列。
下面重點介紹在進行預訓練之前所需的一些關鍵數據處理階段:
數據來源:編寫爬蟲程序、購買許可證、訪問公共文本數據轉儲。數據并非來自單一語料庫,而是可能分散在許多不同的地方。數據需要以快照的形式及時捕獲,一旦預訓練開始,模型就只能通過使用工具和上下文工程來訪問新信息。
提取、規范化和質量保證:文本需要以盡可能高質量的格式清晰地提取。這就像一個過濾器,可以防止“垃圾進,垃圾出”。通常,會有各種自動化算法從 PDF、HTML 網站、GitHub 代碼和其他來源中提取文本,并確保文本主體不受噪音污染。完全無噪音是不可能的,但絕大多數數據應該是合乎邏輯且合理的,這樣模型才能在自監督學習下達到收斂(“穩定訓練”)。
注釋和結構化:使用自動化算法遍歷、注釋和存儲已清理的文本樣本。這通常涉及添加段落框架、文檔長度、Schema 注釋(Markdown、JavaScript、純文本、HTML)以及其他有用的標簽等信息,這些信息可在訓練期間使用,并為訓練團隊提供寶貴的統計摘要,用于故障排除。
分塊、分片和填充:文本內容隨后被“切分”成塊,并使用特殊標記來指示文檔結束、文件結束以及其他注釋信息,再將其標記為數字 ID,并進行填充以確保每個序列的長度相同。一旦獲得等長序列,就可以更輕松地將它們排列成組,并一次性將多個序列輸入模型訓練循環,從而實現大規模并行訓練。
示例文檔架構:
{
"doc_id" : "01J2Y2G2F6X9S7J3SYZ3QW6W0N" , // ULID/UUID
"source" : {
"type" : "web|book|paper|code|forum|wiki|synthetic" ,
"url" : "https://example.com/post" , // 用于 web
"repo" : "github.com/org/repo" , // 用于代碼
"commit" : "0f3c1a..." , // 用于代碼
"path" : "src/utils/math.py" , // 用于代碼
},
"title" : "FFT 簡介" ,
"lang" : "en" , // ISO 639-1
"script" : "Latn" , // ISO 15924
"license" : "CC-BY-4.0" , // SPDX id 或策略 bucket
“created_at”:“2023-04-12T09:21:37Z”,
“collected_at”:“2025-07-25T14:03:11Z”,
“content”:“帶有段落的純文本正文... \ n \ n ##部分\ n文本繼續......”,
“structure”:{
“format”:“markdown | plaintext | html | latex | rst”,
“segments”:[
{ “start_char”:0,“end_char”:128,“type”:“paragraph” },
{ “start_char”:129,“end_char”:180,“type”:“heading”,“level”:2 },
{ “start_char”:181,“end_char”:420,“類型”:“代碼”,“lang_hint”:“python” }
]
},
“元數據”:{
“域”:“example.com”,
“主題”:[ “signal_processing”,“數學” ],
“閱讀水平”:11.2,
“length_chars”:4231,
"length_tokens_est" : 950
},
"quality" : {
"ppl_small_lm" : 28.7 , // 困惑度濾波器信號
"toxicity" : 0.004 , // [0,1]
"pii" : { "email" : 1 , "phone" : 0 , "ssn" : 0 }, // 計數
"watermark_prob" : 0.01 // LLM 編寫的檢測器
},
"dedup" : {
"raw_sha1" : "0e5b4...8f" ,
"text_sha1" : "a1c2d...9a" ,
"simhash" : "9b7a3f12" ,
"minhash" : [ 121 , 9981 , 733 , 4211 , 5901 ] // 5× 64 位或更高
},
"policy_flags" : {
"nsfw" : false ,
"copyright_sensitive" : false ,
"allowed_for_training" : true
},
"eval_overlap" : {
"mmlu" : 0.0 , "gsm8k" : 0.0 , "humaneval" : 0.0 // n-gram/regex 凈化
},
"split" : "train|val|test"
}打包和填充模式示例:
{
“sample_id” : “01J2Y3AZ7X12P5 ...” ,
“seq_len” : 8192 ,
“tokenizer” :“ sentencepiece_v5_en_32k” ,
“input_ids” : [ 1017,42,1337 , “...” ] ,“ labels_n1 ” :[ 42,1337,9001 ,“...” ] ,//下一個 標記標簽“labels_mtp” :{ //對于MTP是可選的“ depth” :2 ,“ n2 ” :[ 1337,9001,7 ,“...” ] //第二個下一個標記標簽} ,“attn_mask” :“ ...” ,“position_ids” :“ ...” ,“doc_spans” :[ { “doc_id” :“01J ... W0N” ,“start_tok” :0 ,“end_tok” :2500 } ,{ “separator” :“<eod>” } ,{ “doc_id” :“01J ... 9KX” ,“start_tok” :100 ,“ end_tok” :5600 } ,{ “ separator” :“ <eod>” } ,{ “doc_id ” : “ 01J ... 2Q3” ,“start_tok” :0 ,“end_tok” :92 } ] ,“tags” :[ “web” ,“math” ,“code_block_present” ] ,“mix_weight” :0.85 ,//由采樣器使用“long_context_bucket” :0 //例如,0:8k、1:32k、2:128k } 三、預備訓練:塑造粘土
我們將研究Deepseek和Kimi通過公開預印本分享的兩個預訓練案例研究。
DeepSeek-V3
DeepSeek V3 是一個包含6710 億個參數的MoE模型,每個 token約有 370 億個活躍參數。它使用MLA注意力機制來壓縮鍵值對 (KV) 并優化內存/延遲,并實現了無輔助損失負載平衡,以及經過超大規模驗證的FP8混合精度。
它基于14.8 萬億個標記進行訓練;工程協同設計在預訓練、上下文擴展和后訓練方面帶來總端到端成本 ≈ 2.788M H800-GPU 小時。
KimiK2
Kimi K2 是一個擁有1.04 萬億個參數的MoE ,每個 token約有 320 億個活躍參數。它還利用MLA作為更節省內存的注意力機制,擁有384 位專家,每個 token 選取 8 位專家。它支持128K token的上下文窗口。
Kimi K2 模型使用MuonClip(Muon + QK-Clip )對15.5 萬億個 token進行了預訓練,以消除萬億參數 MoE 規模下的損失尖峰。該模型強調 token 效率是首要的擴展系數。
與 Deepseek V3 不同,該模型的后期訓練具有明確的代理性:大規模工具使用合成以及針對真實和模擬環境的聯合 RL 。
四、情境擴展:管理感官超負荷
你可能閱讀過關于如何在 DeepSeek V3 架構的注意力機制中使用旋轉位置編碼 (RoPE) 來傳遞關于 token 位置的相對信息的文章。這些位置編碼是模型區分輸入文本不同部分相同 token 能力的重要組成部分。
暴露相對距離的訓練機制的存在也意味著,如果輸入文本的長度發生變化,那么模型將不再能夠可靠地關注超出其最大訓練注意力的文本。
這個問題在訓練過程中通過上下文擴展的過程來處理,它可以被認為是一種“訓練課程”,其中模型從簡單開始,最初學習 8,000 個標記的短序列,然后重新校準以逐步處理 16,000 個標記、32,000 個標記等更大的塊。
前沿模型通常通過分階段的訓練課程(從短到長)擴展到128K或更長,并進行位置/注意力調整和“針狀”壓力測試,以避免在長序列中出現回歸。DeepSeek V3 技術論文報告了從 8K 到 32K 再到 128K 的兩階段擴展。
然而,Kimi K2 卻是一個反例:截至 2025 年 7 月,Kimi K2 技術論文導出了 12.8 萬億個開箱即用的數據,這些數據使用 MLA、長序列 RoPE 和 MuonClip 管理著萬億參數規模的訓練。這是一個在一年時間內實現訓練創新的案例,它有可能取代之前長上下文預訓練的前沿范式。
五、訓練后:雕琢細節
在“后訓練”階段,模型的行為得以形成。在后訓練之前,模型只是一個文本補全工具,可以對文本進行自回歸并預測下一個標記。在后訓練期間,我們可以嘗試通過監督學習和強化學習技術來強制執行訓練數據中沒有的某些行為。在這個階段,指令遵循、聊天角色扮演、推理和工具使用等功能開始出現。
1.監督微調(SFT)
SFT 只是監督微調模型對精選對話和演示進行下一個 token 預測。“獎勵”是隱式的:你最小化了模型希望生成的 token 的交叉熵。這意味著,如果模型生成了與示例數據完全相同的文本,你將獲得最大的獎勵。
您可以通過以下方式控制模型的學習內容:
標記了哪些標記(按角色/字段掩蓋損失)。
某些模式出現的頻率(混合權重、課程)。
結構執行的嚴格程度(數據構建期間的驗證器)。
具體來說,你將對話序列化為 token,并僅針對想要模擬的部分計算損失。這通常是助手的回復以及(對于工具而言)函數調用對象,而不是用戶文本或原始工具輸出。
我們通常從指令調優開始,這是 SFT 的一部分,我們在此塑造模型,使其表現得像一個助手,并遵循用戶指令和系統提示。用于指令調優的 SFT 數據輸入如下所示:
{
“id” : “sft-0001” ,
“system” : “你是一個簡潔的助手。” ,
“messages” : [
{ “role” : “user” , “content” : “用一段話解釋dropout。” } ,
{ “role” : “assistant” , “content” : “Dropout隨機將單位歸零......” }
] ,
“loss_mask” : {
“assistant” : true, //標記這些標記
“user” : false //不要在這里計算損失
} ,
“tags” : [ “instruction” , “science.explain” , “concise” ]
}在訓練期間,結構化數據將被序列化為單個標記序列,并在用戶標記上加上掩碼,以使模型根據對話中助手的行為進行自我塑造。
單字符串對話的 ChatML 樣式模板如下所示:
<BOS> <|system|>你是一個簡潔的助手。<|eot|> <|user|>用一段話解釋dropout。<|eot|> <|assistant|> Dropout隨機將單位歸零…… <|eot|>
請注意,這個階段被稱為監督微調的原因是我們明確地以未掩蔽的標記形式提供標簽,并要求助手精確地生成這些標記以實現目標(最小化未掩蔽的標記生成的損失函數)。
2.偏好優化(廉價、穩定的控制)
直接偏好優化 (DPO) 是一種基于偏好的后訓練方法,通過比較而不是黃金答案進行學習。
對于每個提示,您需要提供一個已選答案和一個被拒絕的答案。該模型經過訓練,使得在特定策略下,相對于固定的參考策略(通常是 SFT 檢查點),已選答案比被拒絕的答案更有可能。本例中沒有提供評判/獎勵模型,也沒有 PPO 循環;只有一個穩定的離線目標。
DPO不是教你說什么(SFT),而是教你兩種可能表達方式中哪一種更好(語氣、安全性、簡潔性、格式準確性)。它成本低廉、功能強大,而且易于迭代。
由于穩定性、靈活性和降低的成本,許多堆棧現在在完全強化學習與人工反饋 (RLHF) 之前(或代替)默認為DPO(可能除了二進制替代方案KTO )。
對于每個樣本,DPO 的數據輸入通常類似于以下內容:
{
"id" : "dpo-00421" ,
"prompt" : "<BOS>\n<|system|>\n你是一個簡潔的助手。\n<|eot|>\n<|user|>\n用一段話解釋dropout。\n<|eot|>\n" ,
"chosen" : "<|assistant|>\nDropout隨機屏蔽單元... (清晰、簡潔)\n<|eot|>\n" ,
"rejected" : "<|assistant|>\nDropout是一種最初... (雜亂無章/不合規范)\n<|eot|>\n" ,
"meta" : { "reason" : "簡潔/風格" , "source" : "human_label" }
}我們可以看到,我們正在根據提示進行指令調整,這是一個 ChatML 序列化輸入,模型現在應該可以理解它。
下面的 Python 偽代碼詳細說明了如何應用 DPO:
import torch
import torch.nn. functional as F
# 這是偽代碼,但需要這些代碼才能在實際實現中存在:
# - dpo_loader:生成包含字段 .prompt_ids、.chosen_ids、.rejected_ids、.assistant_mask 的批次
# - policy:可訓練模型(θ)
# -reference_policy:凍結參考模型(θ_ref),通常是 SFT 檢查點
# - seq_logprob(model, prompt_ids, respond_ids, mask, length_normalize=True):返回
# 僅對掩碼輔助標記(可選長度歸一化)的序列對數概率beta = 0.1
# dpo_loader 中批次的偏好分離強度: prompt_ids = batch.prompt_ids
# [B, T_prompt] chosen_ids = batch.chosen_ids
# [B, T_answer] rejected_ids = batch.rejected_ids
# [B, T_answer] assist_mask = batch.assistant_mask
# [B, T_answer] bool (僅在輔助標記上損失)
#當前策略下的序列對數概率 (θ) --- logp_chosen = seq_logprob(policy, prompt_ids, chosen_ids, mask=assistant_mask) logp_rejected = seq_logprob(policy, prompt_ids, rejected_ids, mask=assistant_mask)
# --- 凍結參考下的序列對數概率 (θ_ref) --- logp0_chosen = seq_logprob(reference_policy, prompt_ids, chosen_ids, mask=assistant_mask).detach() logp0_rejected = seq_logprob(reference_policy, prompt_ids, accepted_ids, mask=assistant_mask).detach()
# --- DPO 邊際:鼓勵政策擴大相對于參考的選擇與拒絕差距 --- margin_current = (logp_chosen - logp_rejected)
# 在 θ 下 margin_reference = (logp0_chosen - logp0_rejected)
# 在 θ_ref (無 grad) 下 z = beta * (margin_current - margin_reference)
# 數值穩定:-log σ(z) == BCEWithLogits(z, target=1) loss = F.binary_cross_entropy_with_logits(z, torch.ones_like(z))
# 標準優化器步驟 policy.zero_grad(set_to_nnotal對于每個樣本,正在訓練的模型將因生成以下文本而獲得最大獎勵:
(1)與所選文本完全相同
(2)與被拒絕的文本完全不同
(3)與我們開始的參考模型(指令調整的 SFT 檢查點)生成的文本在字符上沒有太大區別
隨著時間的推移,給定足夠多的示例,模型的新檢查點將開始根據用戶偏好行事,而不僅僅是遵循來自監督訓練數據的特定示例,同時保留從指令調整中學習到的核心行為。
通常,結合用戶輸入對于塑造一個在開放世界中對用戶“感覺”有用的助手的模型至關重要,因為指令調整數據集通常只是一組由團隊內部合成和/或來自開源研究工作的預先準備好的、精心策劃的對話。
3.強化學習
強化學習 (RL) 在現代技術棧中體現在兩個方面:可驗證的端點(數學/代碼/格式),可用于自動評分輸出;以及長遠推理(o-series/R1 風格)。為了提高效率,兩者通常使用群相對策略優化 (GRPO) 家族中的群相對、無批評更新,而不是完整的近端策略優化 (PPO) + 價值函數循環。
4.群體相關策略優化
GRPO 是一種程序,它允許我們使用獎勵函數有效地評估模型相對于自身的最佳性能,而無需提供特定的標簽。
與 PPO 不同,我們不需要單獨的評價模型來評估模型的性能。相反,我們讓模型生成少量候選答案,并根據自動檢查進行評分,然后對獲得最高分的答案進行獎勵。這些檢查通常是在生成的文本上運行的函數,用于檢查諸如是否存在精確答案、是否通過單元測試、數據模式是否有效,以及有時還會進行負面獎勵,例如長度或延遲懲罰。
訣竅在于,分數在組內是相對的,因此你可以從樣本本身“免費”獲得低方差優勢信號。你不需要第二個 LLM 來執行計算,因此相對于 PPO,它顯著降低了計算成本。
PPO 風格的裁剪步驟將更新保持在信任區域內,而序列級、長度歸一化的對數概率確保整個生成過程都能獲得獎勵,而不僅僅是最終的 token。最終形成了一個簡單、穩定且可擴展的循環:增加組規模以增強信號,模型就會穩步向輸出靠攏,最終確保輸出始終符合評分標準。
下面的一些 Python 偽代碼有助于更具體地概念化正在發生的事情:
# 超參數
group_size = 8 # K
clip_epsilon = 0.2
temperature = 0.8
top_p = 0.95
for prompt in prompt_batch:
# 1) 從 *舊* 策略中提出 K 個候選完成
candidates = sample_candidates(old_policy, prompt, group_size,
temperature=temp, top_p=top_p)
# 2) 使用程序化的獎勵函數對每個候選進行評分
rewards = [compute_reward(prompt, completion) for completion in candidates]
# 3) 群體相對優勢(K 個樣本內的 z 分數)
advantage = zscore(rewards) # (r_i - mean) / (std + eps)
# 4) 使用 PPO 樣式剪輯的策略梯度更新(序列級、長度歸一化)
for completion, advantage in zip (candidates, advantage):
logprob_new = sequence_logprob(policy, prompt, completion,
mask= "assistant" , length_normalize= True )
logprob_old = sequence_logprob(old_policy, prompt, completion,
mask= "assistant" , length_normalize= True ).detach()
unlikely_ratio = torch.exp(logprob_new - logprob_old)
loss += -torch.clamp(likelihood_ratio, 1 - clip_epsilon, 1 + clip_epsilon) * advantage
optimizer.zero_grad()
loss.backward()
optimizer.step()
# 5) 信賴域簿記(標準 PPO 風格:刷新舊策略)
old_policy.load_state_dict(policy.state_dict())5.可驗證獎勵的強化學習
當你能編寫一個程序自動判斷答案是否“好”時,你就能廉價且安全地擴展強化學習。通常,一個擁有數萬億個參數的前沿模型需要數百萬個示例、數億次嘗試(“候選軌跡”)以及數萬億個標記的生成,才能顯著改變模型的行為。這意味著,人工監控模型為獲得獎勵而經歷的每一次事件/軌跡是不現實的。“可驗證的獎勵”是指那些能夠通過某種自動方式來確定模型模擬的任務是否正確完成的獎勵。
與 SFT/DPO(完全離線)不同,強化學習任務是提示加評分。每個示例都會有一個提示,其中包含需要完成的任務、需要解決的問題或其他類型的完成請求,其結果可以通過編程驗證。
對于代碼來說,這可以是編寫一個能夠通過單元測試、代碼檢查和其他類型程序性檢查的函數。對于數學來說,這可以是對完整答案中我們期望看到的特定表達式進行精確匹配,例如方程式、引理和證明說明。
數學任務和代碼任務的最小 JSON 示例如下所示:
數學
{
"id" : "rl-math-0007" ,
"prompt" : "<BOS>\n<|system|>只用數字回答。<|eot|>\n<|user|>37*91 是多少?<|eot|>\n" ,
"rewarders" : [
{ "type" : "exact_answer" , "target" : "3367" } ,
{ "type" : "format_regex" , "pattern" : "^[0-9]+$" } ,
{ "type" : "length_penalty" , "alpha" : 0.001 }
]
}編碼
{
"id" : "rl-code-1031" ,
"prompt" : "<BOS> \n <|system|>編寫一個 Python 函數 resolve(),讀取 stdin 并打印答案。<|eot|> \n <|user|>給定 N,輸出總和 1..N。<|eot|> \n " ,
"rewarders" : [
{ "type" : "unit_tests" , "tests" : [ "tests/sum_to_n_*.txt" ], "timeout_ms" : 2000 },
{ "type" : "runtime_penalty" , "beta_ms" : 0.0005 },
{ "type" : "format_regex" , "pattern" : "def resolve \\ (" }
],
"sandbox" : { "image" : "py3.11","內存大小" : 512 }
}獎勵器是用于處理生成文本的程序,用于評估給予模型的獎勵金額。這些程序應該對符合人類預期的結果給予高額獎勵,并對不符合預期的結果進行懲罰。
注意:模型對齊的研究專門考察獎勵機制與預期行為之間的匹配。實現真正的對齊通常非常棘手,因為許多代模型可能會“破解”獎勵機制,并在不真正符合人類預期的情況下獲得高額獎勵。
這樣的例子包括,當模型記住一個等式而沒有在數學結果中正確顯示工作時,或者編寫一個剛剛通過單元測試但由于缺乏常識性應急措施而在生產中變得脆弱的函數時。
6.思路鏈推理 RL(o 系列/R1 風格)
為了優化長期問題的最終正確性以及輕量級格式約束,我們需要引入更深層次的內部計算作為模型的基本行為。這是通過讓LLM自行學習一種針對難題的結構化思維模式來實現的,這種模式的獎勵僅基于最終正確性。
推理微調是可驗證獎勵強化學習的一個子集,其中不提供針對特定分步活動的獎勵,而僅提供正確性信號。目標是必須完全學習獲得最終獎勵的過程,在這個訓練階段,我們相當于“去掉了輔助輪”。
兩個常見的附加內容:
?語言/格式獎勵。例如,“用英語回答;最后一句是Final Answer: ...”。
?流程塑造(可選)。通過中間檢查(子目標、無需工具的推導)可獲得小額獎勵,而無需在推理階段透露具體解決方案。
DeepSeek 的R1表明,基于強大的預訓練基礎(無需 SFT 冷啟動)的純推理強化學習可以引發長視界推理。之后,他們通過一輪小型 SFT 傳遞和另一輪強化學習,成功解決了強化學習推理問題。
然后,V3將 R1 的推理提煉回其聊天模型中。OpenAI 的o1線路同樣以大規模強化學習為中心,用于隱藏的思路鏈。
使用 GRPO 進行 CoT 訓練的樣本如下所示:
{
"id" : "rl-reason-2203" ,
"prompt" : "<BOS>\n<|system|>請僅提供思考后的最終數字答案。\n<|eot|>\n<|user|>若 f(x)=...,則計算 ...<|eot|>\n" ,
"rewarders" : [
{ "type" : "equality_modulo" , "target" : "(2*sqrt(3))/5" } ,
{ "type" : "format_regex" , "pattern" : "^Final Answer: " } ,
{ "type" : "language" , "lang" : "en" , "gamma" : 0.05 }
] ,
"sampling" : { "K" : 8 , "temp" : 0.9 }
}我們可以看到,這種模式與具有可驗證獎勵的模式非常相似,但是我們只是將難度增加到一定程度,要求模型利用內部邏輯以某種方式自行找到最終答案。
在可驗證獎勵中,模型很容易不假思索地生成答案,但推理訓練的目標是注入一組非標準且需要長遠思維的特殊問題。其結果是,思維鏈式的獨白在訓練過程中自然而然地形成了。大型語言模型(LLM)從未被明確教導如何生成思維獨白,但他們最終需要這樣做才能在這些任務中獲得獎勵。
與可驗證獎勵的樣本相比,這些任務需要更加仔細地策劃,并且期望與可驗證獎勵數據集相比,每個樣本的模型將生成更多的令牌。
注意:你可能已經注意到,以推理為中心的強化學習和具有可驗證獎勵的強化學習之間存在許多相似之處。有一個超級對齊(superalignment)領域,專門處理“不可驗證”的獎勵,我們試圖讓大型語言模型(LLM)生成一些我們無法簡單解決的答案。
更具體地說,它涉及當獎勵機制不再是一個易于評估的透明函數時,如何使模型與人類對行為和安全的期望相一致。這最終超出了本文的討論范圍,但由于它處于訓練后研究的前沿,因此是一個非常有趣的主題,值得進一步研究。
六、讓大型語言模型與現實世界互動:工具的使用
大多數“工具使用對齊”都發生在 RL之前:你向模型傳授模式和軌跡,然后使用強化學習來打磨邊緣。
我們首先需要在 SFT 中教授工具使用直覺,通過添加需要 LLM 生成特定工具使用模式(通常為 XML 或 JSON)的示例,然后在對話中添加“工具”角色來捕獲來自該工具的真實世界反饋。
通常,我們要求模型生成特定的結構化模式,以便與其環境中的程序、集成或代碼(“工具”)進行交互,并期望這種行為能夠推廣到具有各種模式的各種工具。指令調優應該允許模型泛化圍繞特定工具和模式的自定義用戶提示,并根據具體業務用例遵循這些提示。
外匯價格查詢的示例可能以 JSON 格式如下所示:
{
“id” : “sft-tool-0219” ,
“system” : “您可以調用工具。更喜歡 JSON 答案。“ ,
”tools“ : [ { “name” :“fx.lookup” ,“schema” :“fx.lookup.input_schema” } ] ,
“messages” : [
{ “role” :“user” ,“content” :“現在歐元→加元的匯率是多少?” } ,
{ "role" : "assistant" , "tool_call" : { "name" : "fx.lookup" , "arguments" : { "base" : "EUR" , "quote" : "CAD" } } } ,
{ "role" : "tool" , "name" : "fx.lookup" , "content" : { "rate" : 1.47 , "timestamp" : "2025-08-09T10:22:01Z" } } ,
{ "role" : "assistant" , "content" : "{\"pair\":\"EUR/CAD\",\"rate\":1.47}" }
] ,
"loss_mask" : {
"assistant.tool_call" : true , // 學習名稱+參數 JSON
"assistant.text" : true , // 學習最終摘要/JSON
"user" : false ,
"tool.content" : false // 不要記住原始工具輸出
}
}這將被序列化為以下內容,其中模型必須學習準確地完成輔助消息:
<BOS>
<|system|> 您可以調用工具。最好使用 JSON 格式的答案。<|eot|>
<|user|> 現在歐元兌加元的匯率是多少?<|eot|>
<|assistant|><|tool_call|>{"name":"fx.lookup","arguments":{"base":"EUR","quote":"CAD"}/><|eot|>
<|tool|><|fx.lookup|>{"rate":1.47,"timestamp":"2025-08-09T10:22:01Z"}/><|eot|>
<|assistant|>{"pair":"EUR/CAD","rate":1.47}/><|eot|>然后,我們可以在沙箱中使用 GRPO 強化學習來獲得可驗證的獎勵:
{
"id" : "rl-tool-0817" ,
"prompt" : "<BOS>\n<|system|>僅在需要時使用工具。以 JSON 格式響應。\n<|eot|>\n<|user|>當前 EUR→USD 匯率是多少?\n<|eot|>\n" ,
"tools" : [ "fx.lookup" ] ,
"environment" : {
"sandbox" : "http" ,
"rate_limits" : { "fx.lookup" : 5 } ,
"secrets_policy" : "none_leak"
} ,
"rewarders" : [
{ "type" : "tool_success" , "name" : "fx.lookup" , "checker" : "value_in_range" , "range" : [ 1.3 , 1.7 ] , "weight" :1.0 } ,
{ “type” :“schema_valid” , “target” :“assistant_json” , “weight” :0.2 } ,
{ “type” :“latency_penalty” , “beta_ms” :0.0003 } ,
{ “type” :“no_op_penalty” , “delta” :0.1 } , //懲罰不必要的調用
{ “type” :“arg_semantics” , “rule” :“base!=quote” , “weight” :0.2 }
] ,
“limits” : { “max_calls” : 2 , “max_tokens” : 512 }
}強化學習中最棘手的部分是確保現實世界的工具使用示例具有清晰、可驗證的獎勵。這并非總是可行,我們可以看到,獎勵器的數量現在已經增加,試圖將模型“限制”在特定行為中,使其與人類在真實環境中對模型的期望相一致。
問題在于,在復雜的現實世界中,獲取獎勵的途徑數量非常多:通常比合法的完成路徑數量高出幾個數量級。這通常會導致用戶在使用工具時出現某種“角色扮演”行為,即模型學習到了一些非真實的獎勵獲取路徑,而沒有以準確的方式正確表達核心邏輯和環境約束。
這將我們帶入了后訓練的前沿,這里的情況尚不明晰,仍有待進一步探索。我個人認為,人工智能能力的下一次演進并非來自更高的計算能力或預訓練規模,而是來自對后訓練過程的持續改進,以防止獎勵黑客攻擊,并縮小模型可能的軌跡,使其能夠以合理的方式找到真正的獎勵。
七、案例研究
1.使用 DeepSeek-V3 進行強化學習和蒸餾
Deepseek-V3 是一個擁有 671B 參數的 MoE,每個 token 約有 37B 個有效參數。它基于多頭潛在注意力 (MLA) 構建,以實現高效的內存上下文處理,并在多 token 預測(MTP) 目標下進行訓練。MTP 細節至關重要:該模型預測兩個連續的 token;在推測解碼過程中,第二個 token 的接受率約為 85% 到 90%,這意味著推理時每秒大約可以生成 1.8 倍的 token,且不會造成質量損失。可以將其視為合法地搶先交易未來 token 并獲利。
從規模上看,V3在預訓練期間消耗了14.8T 令牌,端到端消耗了約 2.788M H800 GPU 小時 ,這個數字已經包含了長上下文擴展和后訓練。該堆棧運行混合精度FP8,以確保在整個訓練過程中保持經濟高效和穩定。這不僅僅是“向右旋轉旋鈕”那么簡單;報告強調了穩定的運行(沒有無法恢復的損失峰值)以及清晰的基礎架構,以實現這一點。
后訓練階段是 V3 的個性和推理能力得以提升的關鍵。團隊運用監督式微調和強化學習,將R1 系列中的推理行為提煉回聊天模型中。實際上,他們直接在預先訓練好的基礎模型上進行強化學習,無需 SFT,然后再將這些行為壓縮回去改進基礎模型。通過這種方式,強化學習的迭代循環可以持續改進基礎模型,從而為更復雜的強化學習提供更完善的基礎。
2.Kimi K2 的 Agentic 工具使用
Kimi K2 的設計明確地是一個代理模型,而非純聊天模型。其底層是一個1.04T 參數的 MoE ,每個 token約 320 億個活躍數據,并包含MLA;該架構傾向于稀疏性,以便在擴展專家池的同時保持活躍 FLOP 的合理性。他們將專家總數增加到 384 位(其中 k=8 個活躍專家),并將注意力頭數量減半至 64 位(相較于 V3),這一權衡既控制了吞吐量,又在稀疏擴展規律下改善了驗證損失。上下文開箱即用,大小為128K。
K2 引入了MuonClip: Muon 加上 QK-Clip 機制,該機制可以重新縮放查詢/鍵的投影,以防止注意力邏輯爆炸,從而允許它們在15.5T 的 token上進行預訓練 而不會出現損失峰值。如果你曾經見過萬億級的運行因為少數幾個 head 爆炸而搖搖欲墜,那么這是一個務實的解決方案,既能保持 Muon 的 token 效率,又能保證訓練的流暢性。
后期訓練側重于工具的大規模使用。首先,K2 投資于一個大型合成/真實代理數據管道,該管道可生成工具規格、多輪軌跡和基于規則的評估;然后,它應用一種聯合 RL方案,將可驗證的獎勵(調用是否成功?JSON 是否有效?)與自我批評規則相結合,以塑造靜態痕跡無法傳授的行為。
他們甚至發布了一個用于函數調用的令牌模板,并描述了一個“強制器”約束解碼器,該解碼器保證調用與生成時聲明的模式相匹配;這對于任何對抗脆弱函數調用格式的人來說都很有用。
最后,K2 的發布方式就像一個產品。開放權重檢查點(基礎和指令)在FP8 區塊中發布,并附帶vLLM、SGLang 和 TensorRT-LLM的部署示例,這為想要評估或在生產環境中運行它的團隊縮短了“hello world”的路徑。



































