落地:LoRA微調(diào)、DPO對(duì)齊與紅隊(duì)測(cè)試)
簡(jiǎn)介這份 PDF 面向希望系統(tǒng)進(jìn)入大模型工程領(lǐng)域的技術(shù)負(fù)責(zé)人、AI 工程師與算法開(kāi)發(fā)者圍繞企業(yè)級(jí)生成式 AI 與 LLM 的技術(shù)本質(zhì)、算法內(nèi)核和落地案例展開(kāi)適合規(guī)劃學(xué)習(xí)路線或內(nèi)部培訓(xùn)。文件共 1 個(gè) PDF壓縮包約 965KB目前已有 343 人學(xué)習(xí)下載。內(nèi)容以十講實(shí)訓(xùn)大綱組織覆蓋 GenAI 原理與全生命周期、工業(yè)級(jí) Prompting 與 LangChain 應(yīng)用、Llama 2/3 及 Code Llama、生產(chǎn)環(huán)境幻覺(jué)與偏見(jiàn)治理、Agentic 與 Multi-Agent 開(kāi)發(fā)、指令微調(diào)與量化、LoRA/QLoRA 等 PEFT 算法、RLHF 與 PPO/DPO 對(duì)齊流程以及 Red Teaming 與 Responsible AI 的私有化安全實(shí)踐。讀者可據(jù)此建立從原理到微調(diào)、從應(yīng)用搭建到安全合規(guī)的完整知識(shí)框架并對(duì)照綜合項(xiàng)目明確動(dòng)手方向。1. 能跑通的 Demo 和能接流量的系統(tǒng)中間隔著一整條工程鏈做過(guò)大模型項(xiàng)目的人大概都經(jīng)歷過(guò)這種落差本地跑的對(duì)話 Demo 效果驚艷接到真實(shí)業(yè)務(wù)流量第三天業(yè)務(wù)方就拿著截圖來(lái)投訴——同一句話問(wèn)兩遍答案不一樣問(wèn)文檔里沒(méi)寫(xiě)的東西它張口就編偶爾還冒出一句不該說(shuō)的話。這時(shí)候才會(huì)意識(shí)到人工智能算法這一層決定的只是模型能力的上限而生產(chǎn)環(huán)境里真正決定能不能上線的是上限之下那截可控性。這份實(shí)訓(xùn)大綱把十個(gè)模塊排成一條從原理、微調(diào)、對(duì)齊到紅隊(duì)測(cè)試的鏈路恰好就是那截可控性的施工圖值得按機(jī)制拆開(kāi)看一遍。2. 低秩微調(diào)為什么 1% 的參數(shù)就能改寫(xiě) 100% 的行為2.1 全量微調(diào)的顯存賬本7B 模型為什么在單卡上動(dòng)不了先算一筆賬因?yàn)樗鼪Q定了后面所有技術(shù)選型的起點(diǎn)。一個(gè) 70 億參數(shù)的模型在混合精度訓(xùn)練態(tài)下同時(shí)駐留顯存的東西遠(yuǎn)不止權(quán)重本身fp16 權(quán)重約 14GBfp16 梯度約 14GB優(yōu)化器為了數(shù)值穩(wěn)定還保留一份 fp32 主權(quán)重約 28GBAdam 的一階動(dòng)量與二階動(dòng)量各 28GB。這五項(xiàng)加起來(lái)已經(jīng) 112GB而激活值、attention 的中間張量、通信緩沖還沒(méi)算進(jìn)去。一張 80GB 的卡塞不下兩張也懸。駐留項(xiàng)精度7B 模型占用是否隨 batch 增長(zhǎng)模型權(quán)重fp16約 14GB否梯度f(wàn)p16約 14GB否主權(quán)重副本fp32約 28GB否Adam 一階動(dòng)量fp32約 28GB否Adam 二階動(dòng)量fp32約 28GB否激活值與臨時(shí)緩沖fp16隨序列長(zhǎng)度、batch 線性增長(zhǎng)是這張表解釋了一個(gè)常見(jiàn)誤解顯存不夠不是因?yàn)槟P吞蠖且驗(yàn)橛?xùn)練態(tài)下每個(gè)參數(shù)要背四到五份副本。參數(shù)高效微調(diào)PEFT之所以成為企業(yè)落地的默認(rèn)選項(xiàng)不是因?yàn)椤甘″X(qián)」而是因?yàn)槿课⒄{(diào)在很多團(tuán)隊(duì)的硬件條件下根本進(jìn)不了門(mén)。常見(jiàn)的做法是把可訓(xùn)練參數(shù)壓到千分之一量級(jí)剩下的全部?jī)鼋Y(jié)優(yōu)化器狀態(tài)隨之縮小兩個(gè)數(shù)量級(jí)。2.2 低秩假設(shè)增量矩陣為什么可以拆成兩個(gè)瘦矩陣PEFT 里影響最大的是 LoRA。它的核心假設(shè)是把預(yù)訓(xùn)練權(quán)重 W 適配到下游任務(wù)時(shí)所需的改動(dòng) ΔW 并不需要滿秩它的有效秩遠(yuǎn)小于矩陣維度。這個(gè)假設(shè)有直觀支撐——預(yù)訓(xùn)練模型已經(jīng)學(xué)到了通用的語(yǔ)言表征下游任務(wù)更多是在做「方向上的微調(diào)」而不是重建整個(gè)表征空間。于是 ΔW 被分解成兩個(gè)瘦矩陣的乘積B ∈ R^{d×r}A ∈ R^{r×k}其中 r 遠(yuǎn)小于 d 和 k。前向計(jì)算變成 h Wx (α/r)·BAx。原始權(quán)重 W 凍結(jié)不更新梯度只流過(guò) A 和 B可訓(xùn)練參數(shù)量從 d×k 降到 r×(dk)。以一個(gè) 4096×4096 的投影層為例滿秩是 1677 萬(wàn)參數(shù)取 r8 之后只有 6.5 萬(wàn)壓縮了 256 倍。兩個(gè)初始化細(xì)節(jié)值得說(shuō)清楚很多人照著抄但不知道為什么要這么寫(xiě)import torch import torch.nn as nn class LoRALinear(nn.Module): def __init__(self, base: nn.Linear, rank: int 8, alpha: int 16, dropout: float 0.05): super().__init__() self.base base # 凍結(jié)原始權(quán)重只保留前向不產(chǎn)生梯度也不進(jìn)優(yōu)化器狀態(tài) for p in self.base.parameters(): p.requires_grad False in_dim, out_dim base.in_features, base.out_features # A 用小方差高斯初始化B 置零 # 訓(xùn)練第 0 步時(shí) BA 恒為 0模型行為與底座完全一致不會(huì)一上來(lái)就打亂預(yù)訓(xùn)練知識(shí) self.A nn.Parameter(torch.randn(in_dim, rank) * 0.02) self.B nn.Parameter(torch.zeros(rank, out_dim)) # alpha 固定時(shí)改 rank 不必重調(diào)學(xué)習(xí)率scale 自動(dòng)補(bǔ)償 self.scale alpha / rank self.drop nn.Dropout(dropout) def forward(self, x): # 主干照常走旁路疊加一個(gè)低秩增量 return self.base(x) self.drop(x self.A self.B) * self.scale參數(shù)的含義需要逐個(gè)交代。rank是低秩分解的秩直接決定新增參數(shù)量和表達(dá)能力alpha是縮放系數(shù)最終生效的縮放是alpha / rank這樣在實(shí)驗(yàn)里把 rank 從 8 調(diào)到 64 時(shí)不必同步調(diào)整學(xué)習(xí)率否則每次調(diào)秩都要重新搜一遍超參血淚經(jīng)驗(yàn)。dropout 加在旁路而不是主干上是為了在對(duì)齊階段抑制 LoRA 分支的過(guò)擬合同時(shí)不擾動(dòng)已經(jīng)凍結(jié)的底座行為。推理階段還有一個(gè)關(guān)鍵性質(zhì)訓(xùn)練完成后可以把增量合并回主干W W scale·BA得到一個(gè)與原始結(jié)構(gòu)完全相同的權(quán)重。合并之后推理沒(méi)有任何額外延遲這是 LoRA 相對(duì)其他適配器方案最大的工程優(yōu)勢(shì)——部署側(cè)不需要為「適配」付出成本。2.3 QLoRA 與 AdaLoRA量化和秩預(yù)算各自解決什么問(wèn)題LoRA 把優(yōu)化器狀態(tài)壓下去了但底座權(quán)重仍然以 fp16 駐留。QLoRA 的做法是把凍結(jié)的底座量化到 4bitNF4 格式梯度只流過(guò) fp16 的 LoRA 旁路反向傳播時(shí)量化權(quán)重被臨時(shí)反量化用于計(jì)算。NF4 不是隨便拍的 4bit 分桶它的量化格點(diǎn)按正態(tài)分布的分位數(shù)布置對(duì)近似服從正態(tài)的權(quán)重分布而言信息損失最小。再疊加雙重量化和分頁(yè)優(yōu)化器應(yīng)對(duì)顯存尖峰一個(gè) 7B 模型微調(diào)的顯存門(mén)檻能壓到一張消費(fèi)級(jí)卡的量級(jí)。代價(jià)要說(shuō)清楚反量化引入的數(shù)值誤差會(huì)讓收斂曲線抖動(dòng)更大學(xué)習(xí)率通常要比 fp16 訓(xùn)練調(diào)低一檔量化后的底座在某些長(zhǎng)尾 token 上的表征會(huì)輕微退化如果你的任務(wù)對(duì)細(xì)粒度實(shí)體特別敏感需要在小樣本上先做一次回歸驗(yàn)證。AdaLoRA 解決的是另一個(gè)問(wèn)題秩預(yù)算怎么分配。固定 rank 意味著每一層被分配的容量相同但實(shí)際上一部分層對(duì)任務(wù)適配幾乎不敏感另一部分層很敏感。AdaLoRA 把增量參數(shù)化成 SVD 形式 PΛQ把 Λ 的對(duì)角元素當(dāng)作重要性分?jǐn)?shù)訓(xùn)練中周期性裁剪掉分?jǐn)?shù)低的奇異值把騰出來(lái)的預(yù)算分給真正需要的層。它的收益在多層、多任務(wù)的場(chǎng)景下才明顯單任務(wù)微調(diào)里固定 rank 往往已經(jīng)夠用。至于秩怎么選我的經(jīng)驗(yàn)是看任務(wù)距離預(yù)訓(xùn)練分布有多遠(yuǎn)輸出風(fēng)格、格式、語(yǔ)氣這類(lèi)調(diào)整rank 4 到 8 足夠注入特定領(lǐng)域的術(shù)語(yǔ)和表達(dá)習(xí)慣32 到 64 比較穩(wěn)要讓模型學(xué)會(huì)一套新的推理模板或多任務(wù)混合得往上加。另一個(gè)常被忽略的點(diǎn)是掛載位置——attention 的 q、k、v、o 四個(gè)投影全掛通常比只掛 q、v 更穩(wěn)定MLP 層掛不掛取決于任務(wù)是否需要改變知識(shí)本身。3. 對(duì)齊的三條路線從人類(lèi)偏好到一個(gè)可優(yōu)化的標(biāo)量3.1 獎(jiǎng)勵(lì)模型把「哪個(gè)回答更好」壓成一個(gè)數(shù)監(jiān)督微調(diào)教會(huì)模型「怎么答」對(duì)齊解決的是「答哪個(gè)更好」。人類(lèi)沒(méi)法直接給出一個(gè)連續(xù)的打分函數(shù)能提供的只有成對(duì)比較同一問(wèn)題下回答 A 比回答 B 好。獎(jiǎng)勵(lì)模型要做的事就是把這種離散偏好擬合成一個(gè)標(biāo)量函數(shù) r(x, y)。常見(jiàn)的建模方式是 Bradley-Terry假設(shè)回答 y_w 優(yōu)于 y_l 的概率為 σ(r(x,y_w) ? r(x,y_l))訓(xùn)練目標(biāo)就是最大化這個(gè)似然的負(fù)對(duì)數(shù)L_RM ?log σ(r(x, y_w) ? r(x, y_l))這個(gè)形式有個(gè)容易被忽略的性質(zhì)它只約束兩個(gè)分?jǐn)?shù)的差值不約束絕對(duì)水平所以獎(jiǎng)勵(lì)模型的輸出是一個(gè)相對(duì)量不能直接當(dāng)置信度用。更要緊的是獎(jiǎng)勵(lì)模型學(xué)到的是標(biāo)注者的偏好分布不是客觀正確性。標(biāo)注時(shí)如果偏好更長(zhǎng)、更結(jié)構(gòu)化、更禮貌的回答這些表面特征就會(huì)被固化進(jìn)獎(jiǎng)勵(lì)函數(shù)后面策略?xún)?yōu)化會(huì)毫不猶豫地去刷這些特征。這是對(duì)齊階段大量問(wèn)題的源頭。3.2 PPO四個(gè)模型同時(shí)在顯存里代價(jià)到底在哪有了獎(jiǎng)勵(lì)模型策略?xún)?yōu)化就是在做一件事讓策略生成的回答拿到更高的獎(jiǎng)勵(lì)。樸素做法會(huì)立刻翻車(chē)——策略會(huì)找到獎(jiǎng)勵(lì)模型的漏洞生成一堆在獎(jiǎng)勵(lì)模型眼里分很高、在人看來(lái)毫無(wú)意義的輸出。這就是 reward hacking。PPO 的應(yīng)對(duì)是加一個(gè) KL 懲罰項(xiàng)把當(dāng)前策略拴在參考模型附近目標(biāo) E[r(x,y)] ? β·KL(π_θ ‖ π_ref)參考模型 π_ref 通常是監(jiān)督微調(diào)后的那個(gè)版本全程凍結(jié)。β 控制約束強(qiáng)度太小壓不住漂移太大等于沒(méi)學(xué)。PPO 本身的截?cái)嗄繕?biāo)把重要性采樣比限制在 [1?ε, 1ε] 區(qū)間內(nèi)避免一次更新把策略推得太遠(yuǎn)。工程上的代價(jià)在于同時(shí)駐留的模型數(shù)量策略模型、價(jià)值模型估計(jì)基線、獎(jiǎng)勵(lì)模型、參考模型四個(gè)都在顯存里。哪怕用 LoRA 只訓(xùn)練策略和價(jià)值兩個(gè)獎(jiǎng)勵(lì)和參考兩個(gè)推理態(tài)模型也各占一份權(quán)重。這就是為什么很多團(tuán)隊(duì)在資源受限時(shí)會(huì)轉(zhuǎn)向更輕的對(duì)齊方案。3.3 DPO為什么可以把獎(jiǎng)勵(lì)模型整個(gè)消掉DPO 的推導(dǎo)是這條線上最漂亮的一步值得完整走一遍。帶 KL 約束的策略?xún)?yōu)化問(wèn)題存在閉式最優(yōu)解π*(y|x) ∝ π_ref(y|x) · exp(r(x,y) / β)把它反解獎(jiǎng)勵(lì)可以被策略本身表達(dá)出來(lái)r(x,y) β·log(π*(y|x) / π_ref(y|x)) β·log Z(x)把這個(gè)表達(dá)式代回 Bradley-Terry 的偏好損失配分函數(shù) Z(x) 在同一個(gè)問(wèn)題的兩個(gè)回答相減時(shí)被消掉獎(jiǎng)勵(lì)模型就從式子里消失了。剩下的損失只依賴(lài)策略模型和參考模型對(duì)兩條回答的 log 概率import torch import torch.nn.functional as F def dpo_loss(policy_chosen_logp, policy_rejected_logp, ref_chosen_logp, ref_rejected_logp, beta: float 0.1): policy_*_logp: 當(dāng)前策略對(duì) chosen / rejected 整條序列的 log 概率之和 ref_*_logp: 參考模型通常為 SFT 后的凍結(jié)模型對(duì)同一序列的 log 概率之和 beta: KL 約束強(qiáng)度越小越敢偏離參考模型 # 隱式獎(jiǎng)勵(lì)策略相對(duì)參考模型的概率比取對(duì)數(shù)后即 log(pi / pi_ref) chosen_reward beta * (policy_chosen_logp - ref_chosen_logp) rejected_reward beta * (policy_rejected_logp - ref_rejected_logp) # Bradley-Terry 形式拉大 chosen 與 rejected 的隱式獎(jiǎng)勵(lì)差 loss -F.logsigmoid(chosen_reward - rejected_reward).mean() # 訓(xùn)練中通常監(jiān)控這兩個(gè)量若 chosen 與 rejected 同步上升說(shuō)明模型在整體漂移 return loss, chosen_reward.detach(), rejected_reward.detach()參數(shù)beta是這里唯一需要認(rèn)真調(diào)的東西它同時(shí)扮演兩個(gè)角色既是 KL 約束的強(qiáng)度也是隱式獎(jiǎng)勵(lì)的縮放系數(shù)。beta 取 0.1 是常見(jiàn)起點(diǎn)取太小模型會(huì)激進(jìn)偏離參考分布表現(xiàn)為輸出變得極端或開(kāi)始重復(fù)取太大則幾乎學(xué)不動(dòng)損失曲線貼在 log 2 附近不動(dòng)。DPO 的代價(jià)也要講清楚它是離線的偏好數(shù)據(jù)在訓(xùn)練前就固定了優(yōu)化過(guò)程中不會(huì)生成新樣本再去問(wèn)獎(jiǎng)勵(lì)模型。這意味著它沒(méi)法自我糾偏數(shù)據(jù)集里的標(biāo)注噪聲會(huì)被原樣學(xué)進(jìn)去同時(shí)當(dāng)策略更新后分布已經(jīng)偏離數(shù)據(jù)分布那些樣本提供的梯度信號(hào)會(huì)變?nèi)?。PPO 的在線采樣能覆蓋這個(gè)問(wèn)題但要多付出四模型駐留和采樣吞吐的成本。這是一次典型的取舍用離線換顯存用在線換穩(wěn)定。3.4 RLAIF 與成文原則把標(biāo)注成本轉(zhuǎn)成可 review 的文檔RLAIF 的思路是用一個(gè)能力更強(qiáng)的模型替代人類(lèi)做偏好標(biāo)注成本能下降一到兩個(gè)數(shù)量級(jí)且標(biāo)注一致性更好——同一個(gè)模型對(duì)同一對(duì)回答的判斷不會(huì)因?yàn)槠诙?。代價(jià)是偏見(jiàn)繼承強(qiáng)模型的偏好會(huì)原樣傳遞給被訓(xùn)練的模型尤其在涉及價(jià)值判斷的維度上學(xué)生會(huì)學(xué)到老師的風(fēng)格而非客觀標(biāo)準(zhǔn)。Constitutional AI 在這個(gè)基礎(chǔ)上又推了一步不給模型看人類(lèi)偏好給它一份成文的原則清單讓它按原則批判自己的輸出、修訂再用修訂前后的回答構(gòu)造偏好對(duì)。機(jī)制上的關(guān)鍵點(diǎn)在于原則是一份可以被人逐條 diff、逐條 review 的文本而不是彌散在幾千條標(biāo)注里的隱性偏好。出了問(wèn)題你能定位到是哪條原則寫(xiě)歪了要調(diào)整行為改文檔比重新標(biāo)注便宜得多。風(fēng)險(xiǎn)也隨之轉(zhuǎn)移——原則本身的覆蓋度和表述質(zhì)量成了新的瓶頸一條含糊的原則會(huì)被模型優(yōu)化出各種意料之外的行為。4. 生產(chǎn)環(huán)境的幾個(gè)硬約束幻覺(jué)、偏見(jiàn)與顯存墻的機(jī)制拆解4.1 幻覺(jué)的三個(gè)根源數(shù)據(jù)、解碼、評(píng)估幻覺(jué)不是模型的 bug是訓(xùn)練目標(biāo)的必然結(jié)果。語(yǔ)言模型的預(yù)訓(xùn)練目標(biāo)是最大化下一個(gè) token 的似然它學(xué)的是「什么樣的續(xù)寫(xiě)符合語(yǔ)料的分布」而不是「什么樣的陳述符合事實(shí)」。這兩件事在大部分語(yǔ)料上重合但在長(zhǎng)尾實(shí)體、時(shí)效性信息、具體數(shù)值上會(huì)分叉模型會(huì)用分布上最合理的表述去填補(bǔ)它并不知道的空白。第一層根源在數(shù)據(jù)訓(xùn)練語(yǔ)料里沒(méi)有、或者只出現(xiàn)過(guò)一兩次的事實(shí)模型的表征非常弱檢索時(shí)找不到支撐解碼時(shí)就只能靠鄰近語(yǔ)義猜。第二層在解碼采樣溫度越高、top-p 越寬模型越容易走到低概率但表達(dá)流暢的路徑上這就是為什么同一問(wèn)題問(wèn)兩遍答案會(huì)不一樣。貪心解碼能降低隨機(jī)性但降低不了系統(tǒng)性的事實(shí)錯(cuò)誤。第三層在評(píng)估模型對(duì)自身輸出的正確性沒(méi)有校準(zhǔn)信號(hào)它生成每個(gè) token 時(shí)的概率反映的是語(yǔ)言流暢度不是事實(shí)置信度。對(duì)應(yīng)的緩解手段要按層次拆分檢索增強(qiáng)把答案從參數(shù)里搬到上下文直接消除第一層問(wèn)題約束解碼和結(jié)構(gòu)化輸出限制第二層的發(fā)散空間自一致性投票同一問(wèn)題多次采樣取多數(shù)用采樣成本換準(zhǔn)確率引用溯源則要求每個(gè)結(jié)論都指向原文片段讓第三層問(wèn)題變成可人工復(fù)核的流程。企業(yè)場(chǎng)景里最后這條往往比模型本身更重要——用戶(hù)要的不是「模型不犯錯(cuò)」而是「錯(cuò)了能被發(fā)現(xiàn)」。4.2 偏見(jiàn)從哪來(lái)訓(xùn)練分布、解碼放大、反饋回路偏見(jiàn)的傳導(dǎo)鏈路比幻覺(jué)更長(zhǎng)。第一階段是分布不平衡語(yǔ)料中某些群體、職業(yè)、地域的出現(xiàn)頻率和共現(xiàn)模式本身就帶傾向模型忠實(shí)地學(xué)到了這些共現(xiàn)。第二階段是解碼放大就算模型內(nèi)部表征只是輕微偏斜生成時(shí)高頻 token 的路徑會(huì)更占優(yōu)勢(shì)輸出側(cè)看起來(lái)比內(nèi)部統(tǒng)計(jì)更極端。第三階段是反饋回路如果用模型的輸出繼續(xù)訓(xùn)練后續(xù)模型偏斜會(huì)被一代代放大。工程上能做的是分層攔截?cái)?shù)據(jù)側(cè)做配平與去重對(duì)齊階段用偏好數(shù)據(jù)壓制明顯的刻板表述輸出側(cè)加一層分類(lèi)器過(guò)濾最后用紅隊(duì)測(cè)試把攔截效果量化成指標(biāo)。紅隊(duì)測(cè)試在這條鏈路里的位置很關(guān)鍵它不是上線前跑一次就完事的動(dòng)作而是每次模型或提示詞變更后都要回歸的測(cè)試集。4.3 KV Cache長(zhǎng)上下文真正的成本在顯存不在算力很多人以為長(zhǎng)上下文的瓶頸是注意力復(fù)雜度的平方項(xiàng)實(shí)際上線上更先撞到的是顯存。自回歸解碼時(shí)每一步都要復(fù)用前面所有 token 的 key 和 value這部分緩存隨序列長(zhǎng)度線性增長(zhǎng)def kv_cache_bytes(num_layers: int, num_kv_heads: int, head_dim: int, seq_len: int, batch: int, dtype_bytes: int 2) - int: num_layers: transformer 層數(shù) num_kv_heads: key/value 的頭數(shù)GQA 下小于 query 頭數(shù)這是省顯存的關(guān)鍵 head_dim: 單頭維度 seq_len: 序列長(zhǎng)度batch: 并發(fā)請(qǐng)求數(shù) dtype_bytes: fp16 為 2int8 量化為 1 # K 和 V 各存一份所以乘 2 per_token 2 * num_layers * num_kv_heads * head_dim * dtype_bytes return per_token * seq_len * batch # 32 層、32 個(gè) KV 頭、單頭 128 維、fp16、4K 上下文、并發(fā) 8 print(kv_cache_bytes(32, 32, 128, 4096, 8) / 1024**3, GB)算出來(lái)的數(shù)字是 16GB而模型權(quán)重本身才 14GB。也就是說(shuō)并發(fā) 8 路 4K 上下文的請(qǐng)求KV Cache 的顯存開(kāi)銷(xiāo)已經(jīng)超過(guò)權(quán)重。這個(gè)比例解釋了幾件事為什么長(zhǎng)上下文服務(wù)的并發(fā)數(shù)上不去為什么 batch size 調(diào)大之后吞吐反而不漲為什么同樣的模型在短請(qǐng)求上表現(xiàn)正常、一遇到長(zhǎng)文檔就 OOM。真正有效的優(yōu)化都作用在這個(gè)公式的某個(gè)因子上。GQA 把 num_kv_heads 從等于 query 頭數(shù)降到它的 1/8直接讓 KV Cache 縮到八分之一質(zhì)量損失在多數(shù)任務(wù)上小到測(cè)不出來(lái)這是目前開(kāi)源模型默認(rèn)采用的結(jié)構(gòu)。分頁(yè)管理把 KV Cache 切成固定大小的塊按需分配消除因變長(zhǎng)請(qǐng)求造成的顯存碎片把浪費(fèi)掉的那部分顯存換回并發(fā)。KV 量化把 dtype_bytes 從 2 降到 1再省一半代價(jià)是長(zhǎng)序列上的精度損失需要單獨(dú)驗(yàn)證。分塊預(yù)填充則是在計(jì)算側(cè)做優(yōu)化把長(zhǎng) prompt 的預(yù)填充切段處理避免瞬時(shí)顯存峰值。4.4 長(zhǎng)上下文不是免費(fèi)的午餐即便顯存扛住了把窗口從 4K 拉到 128K 也不等于模型真的能用好這 128K。注意力在長(zhǎng)序列上的權(quán)重分布會(huì)變得平坦中間位置的信息容易在池化過(guò)程中被稀釋形成「開(kāi)頭記得、結(jié)尾記得、中間的忘了」的現(xiàn)象。位置編碼的外推能力也是有限的超出訓(xùn)練長(zhǎng)度之后的相對(duì)位置關(guān)系會(huì)失真。工程上的對(duì)策是別硬撐能靠檢索定位到相關(guān)片段就不要把整份文檔塞進(jìn)上下文必須長(zhǎng)上下文時(shí)把關(guān)鍵指令放在開(kāi)頭和結(jié)尾把待處理材料放中間并顯式要求模型先復(fù)述再回答。這些不是玄學(xué)都是從注意力的實(shí)際行為反推出來(lái)的用法。5. 上線前的排查五條踩過(guò)的坑每條都能讓項(xiàng)目延期一周5.1 訓(xùn)練側(cè)的三筆血淚賬坑一損失曲線漂亮推理輸出全是復(fù)讀機(jī)?,F(xiàn)象是訓(xùn)練 loss 平穩(wěn)下降驗(yàn)證集 perplexity 也好看但模型一上線就開(kāi)始重復(fù) prompt 里的句子。原因幾乎都出在標(biāo)簽構(gòu)造上指令微調(diào)的數(shù)據(jù)里prompt 部分和 answer 部分被一起計(jì)算了損失模型學(xué)到的是「續(xù)寫(xiě)用戶(hù)的話」而不是「回答用戶(hù)的話」。解決辦法是在構(gòu)造 labels 時(shí)把 prompt 對(duì)應(yīng)的位置全部置為 -100讓交叉熵只作用于回答部分。這個(gè)錯(cuò)誤在自建數(shù)據(jù)管線上出現(xiàn)的頻率高得驚人而且從 loss 曲線上完全看不出來(lái)??佣﨤oRA 權(quán)重合并后效果掉一截?,F(xiàn)象是帶著適配器推理一切正常合并進(jìn)主干之后回答質(zhì)量明顯下降。原因通常是縮放系數(shù)在兩處計(jì)算不一致——訓(xùn)練時(shí)旁路乘了 alpha/rank合并腳本里漏乘或者用了 alpha 本身。另一種情況是掛載的層名匹配不完整訓(xùn)練時(shí)正則匹配到了 q、k、v、o合并時(shí)只匹配到 q_proj 和 v_proj剩下的增量被丟掉。解決辦法是把合并后的權(quán)重和「主干 適配器」的輸出在相同輸入上做逐 token 對(duì)比最大絕對(duì)誤差應(yīng)該在小數(shù)點(diǎn)后幾位超出就說(shuō)明合并邏輯有問(wèn)題??尤龑?duì)齊之后模型變啰嗦長(zhǎng)度爆炸?,F(xiàn)象是 DPO 或 PPO 訓(xùn)練幾輪之后輸出長(zhǎng)度持續(xù)增長(zhǎng)回答開(kāi)始堆砌套話。原因是偏好數(shù)據(jù)里 chosen 的平均長(zhǎng)度顯著大于 rejected長(zhǎng)度本身成了區(qū)分兩者的捷徑特征模型優(yōu)化的其實(shí)是「寫(xiě)長(zhǎng)」。解決辦法是在構(gòu)造偏好對(duì)時(shí)做長(zhǎng)度配平或者對(duì)隱式獎(jiǎng)勵(lì)做長(zhǎng)度歸一化用平均 log 概率而非求和。這個(gè)問(wèn)題在人工標(biāo)注數(shù)據(jù)上尤其普遍因?yàn)闃?biāo)注者天然傾向于認(rèn)為更長(zhǎng)的回答更完整。5.2 推理與上線側(cè)的兩條坑四量化之后精度斷崖式下跌?,F(xiàn)象是 4bit 量化后大部分樣例正常但在數(shù)值、日期、專(zhuān)有名詞上錯(cuò)誤率明顯升高。原因是逐張量量化把整個(gè)矩陣壓到同一組縮放因子下而激活值里存在少量幅度極大的離群通道它們會(huì)拉大縮放范圍讓其余通道的有效位寬被壓縮。解決辦法是改用分組量化或逐通道量化把離群通道隔離出來(lái)embedding 層和輸出層保持高精度不動(dòng)量化后用一套固定的評(píng)測(cè)集做回歸重點(diǎn)看數(shù)字和實(shí)體類(lèi)的準(zhǔn)確率而不是只看平均分??游彘L(zhǎng)文檔請(qǐng)求把服務(wù)打掛?,F(xiàn)象是短請(qǐng)求壓測(cè)一切正常一上長(zhǎng)文檔就出現(xiàn)超時(shí)和 OOM。原因是容量規(guī)劃只按平均長(zhǎng)度算而線上長(zhǎng)度分布是長(zhǎng)尾的少數(shù)超長(zhǎng)請(qǐng)求會(huì)瞬間占滿 KV Cache。解決辦法是按分位數(shù)而非均值做容量規(guī)劃給單請(qǐng)求的最大長(zhǎng)度設(shè)硬上限超出的走分塊處理同時(shí)開(kāi)啟分頁(yè)式的 KV 管理和分塊預(yù)填充把峰值攤平。上線前用真實(shí)長(zhǎng)度分布回放一遍流量比任何合成壓測(cè)都準(zhǔn)。6. 設(shè)計(jì)取舍企業(yè)級(jí)方案最后為什么都收斂到「可審計(jì)」把這條鏈走完會(huì)發(fā)現(xiàn)一個(gè)規(guī)律技術(shù)選型的分歧到最后都會(huì)收斂到同一個(gè)判斷標(biāo)準(zhǔn)——這套東西出問(wèn)題時(shí)你能不能查清楚、能不能回滾、能不能向業(yè)務(wù)方解釋。LoRA 勝過(guò)全量微調(diào)一半原因是省顯存另一半原因是適配器是一個(gè)獨(dú)立文件可以按版本灰度、按需加載、出問(wèn)題直接摘掉。DPO 在很多團(tuán)隊(duì)里替代 PPO不只是因?yàn)槭〉羲膫€(gè)模型更因?yàn)樗挠?xùn)練過(guò)程是確定性的、可復(fù)現(xiàn)的同一份數(shù)據(jù)跑兩遍結(jié)果一致。Constitutional AI 的價(jià)值也不在效果本身而在于它把「模型應(yīng)該怎么表現(xiàn)」寫(xiě)成了一份可以逐條評(píng)審、逐條修改的文檔。能力維度風(fēng)險(xiǎn)維度生產(chǎn)約束常見(jiàn)取舍全量微調(diào)的效果上限災(zāi)難性遺忘、不可回滾顯存與訓(xùn)練成本改用低秩適配保留可摘除的增量在線 RL 的探索能力reward hacking、訓(xùn)練不穩(wěn)定四模型駐留、采樣吞吐轉(zhuǎn)離線偏好優(yōu)化換確定性長(zhǎng)上下文的覆蓋度中間遺忘、成本失控KV Cache 顯存、并發(fā)數(shù)檢索優(yōu)先長(zhǎng)上下文兜底Agent 的自主性越權(quán)調(diào)用、循環(huán)失控工具權(quán)限、超時(shí)預(yù)算工具白名單 步數(shù)上限 人工確認(rèn)對(duì)齊的強(qiáng)度過(guò)度拒答、能力損失用戶(hù)滿意度分場(chǎng)景配置不同的對(duì)齊檔位紅隊(duì)測(cè)試在這個(gè)框架里的位置因此變了。它不是安全團(tuán)隊(duì)的一次性驗(yàn)收而是整個(gè)系統(tǒng)的回歸測(cè)試集每改一次提示詞、換一次模型、調(diào)一次對(duì)齊強(qiáng)度都要重跑一遍看拒答率、越獄成功率、敏感信息泄露率有沒(méi)有回退。把這些指標(biāo)做成 CI 里的一道門(mén)禁比寫(xiě)一百頁(yè)安全規(guī)范都管用。Agent 類(lèi)的系統(tǒng)尤其如此自主性越強(qiáng)可執(zhí)行的行動(dòng)越多越需要把權(quán)限邊界和步數(shù)預(yù)算寫(xiě)死在編排層而不是指望模型自己收斂。給 Agent 的每個(gè)工具調(diào)用都留審計(jì)日志是出事之后唯一的后悔藥。從那以后我每次推動(dòng)一個(gè)模型上線都強(qiáng)制走一遍同樣的動(dòng)作先在真實(shí)長(zhǎng)度分布上回放流量再把合并后的權(quán)重與適配器版本做逐 token 對(duì)比最后跑一遍紅隊(duì)回歸集并記錄指標(biāo)變化。這三步花不了半天但攔住過(guò)好幾次本來(lái)會(huì)讓項(xiàng)目延期一周的問(wèn)題。希望幫到你。本文還有配套的精品資源點(diǎn)擊獲取