建AI工程能力:大模型訓(xùn)練、數(shù)據(jù)與推理實(shí)戰(zhàn)指南)
最近開(kāi)源社區(qū)和社交媒體上關(guān)于“AI engineering”的討論熱度又上了一個(gè)臺(tái)階。很多人私信我問(wèn)得最多的就是“我想從零開(kāi)始搞AI工程到底該學(xué)什么是不是調(diào)幾個(gè)開(kāi)源模型、包裝一下API就算入門了”說(shuō)實(shí)話這個(gè)問(wèn)題背后折射出的焦慮我很能理解——大模型相關(guān)的工具鏈太豐富了每天都有新框架、新論文、新SOTA刷屏普通人很容易被淹沒(méi)在信息流里反而不知道真正該抓的重點(diǎn)是什么。今天我特別想聊聊“ai-engineering-from-scratch”這條路。我自己的背景是傳統(tǒng)軟件開(kāi)發(fā)出身后來(lái)轉(zhuǎn)算法再后來(lái)開(kāi)始自己動(dòng)手訓(xùn)練模型、做推理優(yōu)化、搭A(yù)gent系統(tǒng)一路踩坑無(wú)數(shù)也積累了一套自認(rèn)為還算靠譜的“從零到一”方法論。這篇博文不會(huì)給你羅列一百個(gè)教程鏈接也不會(huì)上來(lái)就丟給你一套看不懂的數(shù)學(xué)公式而是想用一個(gè)過(guò)來(lái)人的視角拆解從零構(gòu)建AI工程能力的完整路徑底層原理要懂到什么程度、工程化怎么落地、算力不夠怎么辦、評(píng)估體系怎么搭、以及我最想強(qiáng)調(diào)的一件事——怎么從“跑通Demo”跨越到“真正生產(chǎn)可用”。無(wú)論你是剛轉(zhuǎn)行的新人還是已經(jīng)在用LangChain之類框架的工程師我相信這篇文章里都有一些你平時(shí)文檔里看不到但實(shí)測(cè)下來(lái)非常關(guān)鍵的東西。1. “從零開(kāi)始”到底是在解決什么問(wèn)題先認(rèn)清四個(gè)層次1.1 為什么很多人的AI學(xué)習(xí)路徑一直是散的我在帶團(tuán)隊(duì)和回答社區(qū)提問(wèn)時(shí)發(fā)現(xiàn)一個(gè)普遍現(xiàn)象大部分人的學(xué)習(xí)路徑是“從框架倒推”。比如看到LangChain火了就先去學(xué)LangChain看到RAG流行就回去研究向量數(shù)據(jù)庫(kù)看到Agent很燙又開(kāi)始看ReAct論文。這種“淘寶式”學(xué)習(xí)最大的問(wèn)題在于——你永遠(yuǎn)在學(xué)別人的解決方案而不是建立自己的問(wèn)題框架。真正的“從零開(kāi)始”不是指從線性代數(shù)開(kāi)始重新學(xué)而是指你能否在不依賴任何框架的前提下徒手構(gòu)建一個(gè)最小可用的AI系統(tǒng)這個(gè)系統(tǒng)可以是一個(gè)Transformer的精簡(jiǎn)實(shí)現(xiàn)也可以是一個(gè)完整的RAG流水線甚至可以是一個(gè)從數(shù)據(jù)標(biāo)注到模型微調(diào)上線的小閉環(huán)。它不需要處理千萬(wàn)級(jí)用戶但每個(gè)環(huán)節(jié)都必須經(jīng)過(guò)你的手而不是靠現(xiàn)成的SDK糊過(guò)去。我在自己的開(kāi)源項(xiàng)目里設(shè)定了四個(gè)考核層次我建議想走這條路的人也拿來(lái)自測(cè)層次一在制品層你能看懂、能改、能調(diào)現(xiàn)有模型和框架。大部分人停在這一層。層次二生產(chǎn)層你獨(dú)立做出的系統(tǒng)能經(jīng)得起真實(shí)數(shù)據(jù)考驗(yàn)有人用有問(wèn)題能追蹤。層次三自設(shè)計(jì)層你根據(jù)需求設(shè)計(jì)適合的模型結(jié)構(gòu)、訓(xùn)練策略、推理優(yōu)化而不是只會(huì)套用現(xiàn)成的。層次四工程美學(xué)層你開(kāi)始考慮系統(tǒng)的成本、延遲、可維護(hù)性、迭代效率——也就是工程化審美。1.2 從ChatGPT的“能聊天”到“我做出來(lái)的系統(tǒng)”之間的鴻溝打個(gè)比方用別人訓(xùn)練好的模型做應(yīng)用類似買了一套精裝房拎包入住很容易而“從零開(kāi)始”的AI工程是你自己從地基開(kāi)始蓋這棟樓。你可能只是蓋個(gè)小平房不需要像OpenAI那樣蓋摩天大樓但你得知道每一根梁柱承的是什么力。大模型時(shí)代的AI工程本質(zhì)上有兩條技術(shù)棧一條是“模型棧”Model-centric關(guān)心怎么訓(xùn)練、怎么調(diào)優(yōu)一個(gè)基礎(chǔ)模型另一條是“系統(tǒng)?!盨ystem-centric關(guān)心怎么把模型嵌入到更大的業(yè)務(wù)系統(tǒng)里處理數(shù)據(jù)、記憶、工具調(diào)用、權(quán)限控制等問(wèn)題。現(xiàn)代AI工程師的最大挑戰(zhàn)是——你要在這兩條棧之間來(lái)回穿梭。一會(huì)兒你是算法工程師要盯著loss曲線一會(huì)兒你是后端工程師要設(shè)計(jì)并發(fā)架構(gòu)。這正是“從零開(kāi)始”項(xiàng)目的價(jià)值所在。它強(qiáng)迫你在模型棧和系統(tǒng)棧的交界處反復(fù)橫跳直到你建立起完整的“端到端心智模型”。2. 地基工程Token、注意力機(jī)制和損失函數(shù)到底決定了什么2.1 Token化語(yǔ)言模型的“像素”單位很多人一提Transformer就說(shuō)注意力機(jī)制卻忽略了token化才是模型理解語(yǔ)言的起點(diǎn)。Tokenization決定了模型的“拼圖塊”有多精細(xì)。我見(jiàn)過(guò)不少新人用現(xiàn)成Tokenizer很順手但遇到領(lǐng)域?qū)S忻~、中英文混排、代碼符號(hào)時(shí)分詞結(jié)果一塌糊涂模型效果自然好不起來(lái)。從工程視角看Tokenizer不只是一個(gè)工具而是一個(gè)需要測(cè)試、需調(diào)優(yōu)的模塊。你需要知道BPEByte-Pair Encoding的核心邏輯是把語(yǔ)料里的高頻字節(jié)對(duì)逐步合并成子詞單元詞匯表的大小直接影響模型的嵌入表大小和推理速度。比如把 vocab size 從 32k 調(diào)到 100k嵌入層參數(shù)量可能多出幾千萬(wàn)顯存消耗立刻上升中文場(chǎng)景下單字token和詞token各有優(yōu)劣。字級(jí)別token天然抗噪音但序列長(zhǎng)度更長(zhǎng)、計(jì)算開(kāi)銷更大詞級(jí)別token語(yǔ)義更濃但對(duì)未登錄詞不友好。我的建議是不要默認(rèn)用某個(gè)模型的默認(rèn)Tokenizer。跑一次你自己的領(lǐng)域數(shù)據(jù)統(tǒng)計(jì)token覆蓋率看看有沒(méi)有大規(guī)模未登錄詞。### 2.2 注意力機(jī)制為什么位置編碼和掩碼同樣重要注意力機(jī)制的核心公式你可能已經(jīng)背熟了[ Attention(Q,K,V) softmax(\frac{QK^T}{\sqrt{d_k}})V ]但工程實(shí)現(xiàn)上真正決定模型質(zhì)量的往往是兩個(gè)細(xì)節(jié)位置編碼和注意力掩碼。位置編碼是在給模型傳遞“順序感”。早期的絕對(duì)正弦編碼到后來(lái)的相對(duì)位置編碼如RoPE、ALiBi各有各的工程考量。RoPE通過(guò)旋轉(zhuǎn)矩陣攜帶位置信息天然支持超出訓(xùn)練長(zhǎng)度的外推雖然外推效果還要看訓(xùn)練策略ALiBi則是直接給注意力得分加線性偏置實(shí)現(xiàn)更簡(jiǎn)單對(duì)長(zhǎng)文本也更魯棒。我的實(shí)測(cè)經(jīng)驗(yàn)是如果你要做長(zhǎng)文本任務(wù)ALiBi的工程下限更低——它不會(huì)像RoPE那樣在長(zhǎng)序列下出現(xiàn)復(fù)雜的插值問(wèn)題。注意力掩碼則是因果語(yǔ)言模型的命門。訓(xùn)練時(shí)你要保證每個(gè)token只能看到它之前的token這個(gè)mask如果寫錯(cuò)整個(gè)訓(xùn)練過(guò)程就毀了。有些實(shí)現(xiàn)會(huì)在服務(wù)端忘記關(guān)掉雙向注意力導(dǎo)致模型“偷看未來(lái)”線上表現(xiàn)出現(xiàn)詭異的好——比如變成“作弊”的翻譯器。這屬于典型的、很難排查的bug。2.3 損失函數(shù)你真的理解交叉熵在干什么嗎訓(xùn)練大模型絕大多數(shù)場(chǎng)景就是交叉熵?fù)p失函數(shù)。表面上它只是衡量預(yù)測(cè)分布和目標(biāo)分布的差異但工程上有幾個(gè)細(xì)節(jié)值得你注意Label Smoothing標(biāo)簽平滑幾乎每個(gè)生產(chǎn)級(jí)模型都要用。它不是為了提升acc而是防止模型過(guò)分自信。把它理解成給正確答案的one-hot向量“摻水”模型就天然不會(huì)出現(xiàn)過(guò)擬合式的死記硬背。我常用的值是0.1但如果你在蒸餾場(chǎng)景下反而要調(diào)小甚至關(guān)掉。Loss Scaling與混合精度訓(xùn)練FP16訓(xùn)練時(shí)梯度下溢是個(gè)大隱患。你需要在損失函數(shù)里手動(dòng)乘以一個(gè)scale factor或者依賴AMP自動(dòng)混合精度里的dynamic loss scaler。這一步做不好你看到的loss曲線就會(huì)毫無(wú)規(guī)律地跳變。我見(jiàn)過(guò)很多所謂的“從零實(shí)現(xiàn)”把注意力、FFN、LayerNorm都寫得能跑但遇到訓(xùn)練發(fā)散就完全不知道怎么排查。本質(zhì)上是他們沒(méi)有把損失函數(shù)、數(shù)值穩(wěn)定性、梯度流這幾件事串起來(lái)看。真正動(dòng)手實(shí)現(xiàn)一遍反向傳播哪怕只是手動(dòng)實(shí)現(xiàn)一個(gè)簡(jiǎn)化版Transformer你才能對(duì)“為什么學(xué)習(xí)率不能太大”“為什么要做梯度裁剪”這些教科書結(jié)論有切身痛感。# 一個(gè)典型的混合精度訓(xùn)練loop骨架PyTorch風(fēng)格 scaler torch.cuda.amp.GradScaler() for step, batch in enumerate(train_loader): with torch.cuda.amp.autocast(): logits model(batch[input_ids]) loss criterion(logits, batch[labels]) scaler.scale(loss).backward() scaler.unscale_(optimizer) torch.nn.utils.clip_grad_norm_(model.parameters(), max_norm1.0) scaler.step(optimizer) scaler.update()這段代碼看起來(lái)平平無(wú)奇但我真的見(jiàn)過(guò)不下五個(gè)工程組因?yàn)闆](méi)加clip_grad_norm_導(dǎo)致訓(xùn)練不穩(wěn)定。別小看這些細(xì)節(jié)它們才是從“能用”到“能訓(xùn)”之間的分水嶺。3. 真實(shí)項(xiàng)目里最難啃的骨頭數(shù)據(jù)工程和訓(xùn)練管線3.1 數(shù)據(jù)清洗決定模型質(zhì)量上限的“臟活累活”如果你問(wèn)我在AI工程里花費(fèi)時(shí)間最多的是什么我的答案非常確定數(shù)據(jù)。不是搭模型不是調(diào)參而是數(shù)據(jù)清洗、去重、質(zhì)量過(guò)濾、配比調(diào)整。業(yè)界常說(shuō)“Garbage in, garbage out”但在大模型時(shí)代這句話的殺傷力被放大了無(wú)數(shù)倍——因?yàn)槟P蜁?huì)“記住”數(shù)據(jù)里的錯(cuò)誤模式并在推理時(shí)以非常有邏輯的方式復(fù)現(xiàn)它們。以構(gòu)建中文語(yǔ)料為例我總結(jié)出四個(gè)必須過(guò)的關(guān)卡去重MinHash去重和SimHash去重是常用的技術(shù)。為什么必須去重因?yàn)橹貜?fù)數(shù)據(jù)會(huì)扭曲訓(xùn)練分布導(dǎo)致模型對(duì)某些片段產(chǎn)生“機(jī)械記憶”。我見(jiàn)過(guò)一個(gè)案例語(yǔ)料里某段新聞重復(fù)了上千次模型最后能一字不差地背誦出來(lái)但對(duì)其他新聞的概括能力反而下降。過(guò)濾噪聲HTML標(biāo)簽、廣告模版、亂碼、全角半角混用。這些不處理模型學(xué)到的語(yǔ)言分布里就會(huì)混入大量“非自然文本”規(guī)律。質(zhì)量分級(jí)不是所有文本都有同樣的訓(xùn)練價(jià)值。我習(xí)慣用“困惑度”perplexity或者弱分類器先給語(yǔ)料打分把高質(zhì)量數(shù)據(jù)集中抽樣。你會(huì)發(fā)現(xiàn)把數(shù)學(xué)課本和貼吧評(píng)論混在一起訓(xùn)練效果會(huì)互相干擾。配比多語(yǔ)種、多領(lǐng)域的數(shù)據(jù)配比是“煉丹”的核心參數(shù)。代碼、數(shù)學(xué)、通用文本、對(duì)話數(shù)據(jù)各有各的最佳比例。這個(gè)沒(méi)有人能給你公式只能靠小規(guī)模實(shí)驗(yàn)去摸。3.2 預(yù)訓(xùn)練還是微調(diào)算力不夠時(shí)的現(xiàn)實(shí)解法很多個(gè)人開(kāi)發(fā)者或小團(tuán)隊(duì)一上來(lái)就想著“我也要預(yù)訓(xùn)練一個(gè)10B模型”但我勸你先冷靜。預(yù)訓(xùn)練一個(gè)哪怕是1B參數(shù)的模型也要幾百?gòu)圙PU卡、幾十TB的高質(zhì)量數(shù)據(jù)。如果沒(méi)有這個(gè)資源更現(xiàn)實(shí)的做法是兩條腿走路繼續(xù)預(yù)訓(xùn)練Continue Pretraining如果你有很強(qiáng)的領(lǐng)域數(shù)據(jù)比如法律、醫(yī)療、金融可以對(duì)一個(gè)開(kāi)源基座模型做領(lǐng)域自適應(yīng)訓(xùn)練。用低學(xué)習(xí)率大概1e-5到3e-5量級(jí)配合高質(zhì)量領(lǐng)域語(yǔ)料讓模型在原有能力基礎(chǔ)上“補(bǔ)課”。這種做法成本可控效果立竿見(jiàn)影。指令微調(diào)SFT用幾千到幾十萬(wàn)條高質(zhì)量的指令回答對(duì)去調(diào)整模型行為。這里我強(qiáng)烈建議你關(guān)注數(shù)據(jù)配比和任務(wù)多樣性而不是一味追求數(shù)據(jù)量。我曾經(jīng)用2萬(wàn)條精心設(shè)計(jì)的SFT數(shù)據(jù)效果超過(guò)另一個(gè)團(tuán)隊(duì)用20萬(wàn)條爬來(lái)的雜數(shù)據(jù)訓(xùn)出的模型。3.3 并行策略從單卡到多卡每一步都有一堆坑數(shù)據(jù)并行Data Parallelism最簡(jiǎn)單但大家很快會(huì)遇到通信瓶頸。張量并行Tensor Parallelism把單個(gè)Transformer層切到多卡上能解決超大批次但通信開(kāi)銷也不小。流水線并行Pipeline Parallelism把一個(gè)batch切成多個(gè)micro-batch串行流過(guò)不同設(shè)備吞吐利用率上去了但代碼復(fù)雜度也會(huì)爆炸。我個(gè)人的建議是如果你的訓(xùn)練腳本跑在4張卡以下先用原生DDP超過(guò)4張卡且模型大到單卡裝不下再考慮FSDPFully Sharded Data Parallel或DeepSpeed ZeRO系列。不要一開(kāi)始就堆大詞穩(wěn)定跑通比炫技重要得多。# 一個(gè)DDP訓(xùn)練的最小啟動(dòng)示例 torchrun --nproc_per_node4 train.py \ --model_name meta-llama/Llama-3.2-1B \ --batch_size 8 \ --gradient_accumulation_steps 8 \ --learning_rate 2e-5這里的gradient_accumulation_steps是另一個(gè)容易踩坑的地方。它能在不增大單卡內(nèi)存的前提下模擬大batch但當(dāng)你的實(shí)際batch size單卡batch × 卡數(shù) × 梯度累積步數(shù)超過(guò)某個(gè)閾值時(shí)模型訓(xùn)練會(huì)變得極不穩(wěn)定甚至loss直接飛掉。我自己習(xí)慣是目標(biāo)batch size在512左右就夠用了過(guò)大的batch反而不容易收斂。3.4 基于社區(qū)實(shí)踐補(bǔ)充的評(píng)估思路別用一次性評(píng)測(cè)集大多數(shù)教程會(huì)推薦你用幾個(gè)公開(kāi)benchmark比如MMLU、GSM8K、HumanEval來(lái)評(píng)估模型。這些做橫向?qū)Ρ葲](méi)問(wèn)題但作為模型迭代的決策依據(jù)遠(yuǎn)遠(yuǎn)不夠。我更建議你建立自己的“黃金評(píng)估集”——從你的目標(biāo)業(yè)務(wù)里抽取一批高價(jià)值樣例每50~100條一批覆蓋不同的輸入類型、邊界情況、典型失敗場(chǎng)景。每次訓(xùn)練迭代后在這些樣例上人工打分或者用更強(qiáng)的模型自動(dòng)打分看指標(biāo)是否真的在改善。我在自己的項(xiàng)目里就是這么干的把線上用戶反饋的高頻問(wèn)題整理成200條“護(hù)衛(wèi)樣例”每個(gè)版本都優(yōu)先跑它。有時(shí)候模型在Big Bench上成績(jī)漲了但是在我的護(hù)衛(wèi)集上反而變蠢了這時(shí)候我就知道——是數(shù)據(jù)配比有問(wèn)題。4. 從“預(yù)訓(xùn)練”到“推理增強(qiáng)”復(fù)現(xiàn)一個(gè)Reasoning Model的落地路徑4.1 推理模型到底“特化”在哪最近“構(gòu)建推理模型”的熱度一直非常高比如build a reasoning model from scratch相關(guān)的討論。很多人以為推理模型就是更大版本的ChatGPT其實(shí)關(guān)鍵區(qū)別在于推理模型學(xué)會(huì)了在回答問(wèn)題前先生成一段“思考過(guò)程”并利用這段思考來(lái)規(guī)劃、驗(yàn)證和修正答案。這也是為什么你會(huì)看到有些模型在你面前展示CoTChain-of-Thought——它不是在做“心理活動(dòng)”而是在結(jié)構(gòu)化的自我對(duì)話中搜索更優(yōu)答案路徑。從零構(gòu)建一個(gè)推理模型你至少需要攻克三件事可驗(yàn)證獎(jiǎng)勵(lì)信號(hào)沒(méi)有標(biāo)準(zhǔn)答案的開(kāi)放式問(wèn)題怎么讓模型知道“自己思考得好不好”常見(jiàn)的做法包括結(jié)果驗(yàn)證答案是數(shù)學(xué)題判對(duì)錯(cuò)、過(guò)程驗(yàn)證每一步推導(dǎo)是否符合規(guī)則以及模型獎(jiǎng)勵(lì)用一個(gè)強(qiáng)大模型去給思考質(zhì)量打分。策略梯度優(yōu)化直接學(xué)RLHF里的PPO算法對(duì)推理場(chǎng)景來(lái)說(shuō)太重了很多人轉(zhuǎn)向了GRPOGroup Relative Policy Optimization這類輕量方案。核心思想是讓模型對(duì)一個(gè)prompt生成多個(gè)候選答案然后用它們的相對(duì)好壞來(lái)更新策略。工程上實(shí)現(xiàn)比PPO簡(jiǎn)單很多也不用維護(hù)一個(gè)巨大的critic model。傾向性/過(guò)程獎(jiǎng)勵(lì)的獲取你需要一個(gè)“判官”來(lái)決定思考過(guò)程的好壞。這個(gè)判官可以是你手里的最強(qiáng)模型也可以是你用人工打分訓(xùn)練的小獎(jiǎng)勵(lì)模型。我在早期復(fù)現(xiàn)時(shí)直接用了現(xiàn)成API模型當(dāng)判官效果意外地穩(wěn)。4.2 一個(gè)可落地的復(fù)現(xiàn)流程四階段法第一階段在一個(gè)較強(qiáng)的基礎(chǔ)模型上連續(xù)預(yù)訓(xùn)練推理型語(yǔ)料數(shù)學(xué)題代碼題邏輯鏈。只用SFT低學(xué)習(xí)率、高批量、多輪epoch先把模型“調(diào)教”出生成CoT的穩(wěn)定性。第二階段自帶質(zhì)量控制用現(xiàn)成的API或者規(guī)則構(gòu)造一批高質(zhì)量思維鏈做SFT。這時(shí)候的重點(diǎn)是多樣性讓模型學(xué)會(huì)不同的思考風(fēng)格。第三階段引入GRPO在可驗(yàn)證任務(wù)上數(shù)學(xué)、代碼做RL強(qiáng)化。你需要跑起一個(gè)rollout generator不斷地讓模型生成多個(gè)回答再用規(guī)則判分。這段我認(rèn)為是最難但收益最大的一步模型會(huì)突然在某個(gè)時(shí)間點(diǎn)出現(xiàn)推理能力的躍升。第四階段在不可驗(yàn)證任務(wù)上引入獎(jiǎng)勵(lì)模型用RLHF或DPO做價(jià)值對(duì)齊。這一步要極其小心很容易把前面辛辛苦苦培養(yǎng)出來(lái)的推理能力給洗掉。如果你把這個(gè)流程都走完一遍邁過(guò)去你對(duì)所謂“o1式模型”的底層恐懼幾乎會(huì)消失——你會(huì)發(fā)現(xiàn)它并沒(méi)有魔法而是一個(gè)工程化的搜索策略被粗糙地塞進(jìn)了語(yǔ)言模型的推理循環(huán)里。4.3 推理增強(qiáng)后的工程代價(jià)延遲和成本必須給你打預(yù)防針推理模型在生產(chǎn)環(huán)境里是很昂貴的。它不僅要生成最終答案還要先生成幾百到幾千token的CoT。這意味著首token延遲會(huì)明顯變長(zhǎng)有些強(qiáng)推理模型的CoT長(zhǎng)度可能在幾千token級(jí)別用戶感知就是“轉(zhuǎn)圈圈”顯存和算力消耗同步上升你需要評(píng)估線上部署時(shí)的吞吐瓶頸對(duì)Agent類應(yīng)用來(lái)說(shuō)一個(gè)工具調(diào)用也要經(jīng)過(guò)完整推理整個(gè)系統(tǒng)的端到端時(shí)延會(huì)被拉高。所以我的建議是不要所有流量都走推理模型。用路由策略做分流——簡(jiǎn)單問(wèn)題直接上輕量快模型復(fù)雜推理才切到重模型。這個(gè)判斷在工程上很實(shí)用本質(zhì)上是一個(gè)小分類器加上規(guī)則兜底。5. AI工程中真正核彈級(jí)的經(jīng)驗(yàn)評(píng)估、版本與“可解釋的失敗”5.1 “評(píng)測(cè)集”是一套系統(tǒng)工程不是跑個(gè)分如果只能給一條建議我會(huì)說(shuō)盡早建立自己的評(píng)測(cè)體系。沒(méi)有評(píng)測(cè)體系你所有的“改進(jìn)”都是在撞大運(yùn)因?yàn)槟愀静恢栏耐晁兒昧诉€是變壞了。一個(gè)能用的評(píng)測(cè)體系至少包含三層工具層自動(dòng)化跑分腳本、數(shù)據(jù)層多個(gè)人類驗(yàn)證過(guò)的評(píng)測(cè)集、決策層版本是否符合上線標(biāo)準(zhǔn)的閾值。我在一個(gè)項(xiàng)目里曾被“模型效果變好但產(chǎn)品體驗(yàn)變差”的現(xiàn)象狠狠教訓(xùn)過(guò)——后來(lái)發(fā)現(xiàn)是評(píng)測(cè)集里都是對(duì)話場(chǎng)景但產(chǎn)品里真正的堵點(diǎn)是長(zhǎng)文檔處理評(píng)測(cè)集沒(méi)覆蓋到。從那以后每次迭代我都要先從線上日志里搜幾百條真實(shí)、復(fù)雜的用戶請(qǐng)求把它們變成固定評(píng)測(cè)集。5.2 模型版本管理像管理軟件依賴一樣管理權(quán)重文件大模型工程的版本管理是很多團(tuán)隊(duì)做得最差的地方。代碼有Git但權(quán)重文件往往只有一串日期命名的文件夾“final_v2”、“真的最后一次”。一旦你調(diào)了訓(xùn)練數(shù)據(jù)、改了超參、變了推理代碼你很可能不知道當(dāng)前模型對(duì)應(yīng)的是哪一套數(shù)據(jù)/代碼/評(píng)估集。我自己一直堅(jiān)持三個(gè)原則每次訓(xùn)練都必須記錄一份“訓(xùn)練卡”數(shù)據(jù)版本、超參數(shù)、代碼commit號(hào)、評(píng)測(cè)腳本版本、評(píng)測(cè)結(jié)果一行都不能少權(quán)重文件名和訓(xùn)練卡要聯(lián)動(dòng)不能改名亂放推理服務(wù)端必須鎖定模型的唯一標(biāo)識(shí)不能出現(xiàn)“代碼更新了但模型還是舊的”這種線上事故。5.3 失敗是稀疏的但“可解釋的失敗”是無(wú)價(jià)的我在這個(gè)項(xiàng)目里的最大收獲不是模型效果有多好而是建立了一套“可解釋的失敗”流程。每次模型在某個(gè)例子上表現(xiàn)不對(duì)我會(huì)立刻把它丟進(jìn)“失敗池”并標(biāo)注三點(diǎn)期望輸出是什么模型給的是什么你覺(jué)得模型為什么這么給積攢到一定數(shù)量后你會(huì)發(fā)現(xiàn)自己對(duì)數(shù)據(jù)、評(píng)測(cè)、訓(xùn)練的認(rèn)知會(huì)有一次飛躍。比如我遇到過(guò)這樣一個(gè)案例模型在數(shù)學(xué)推理題上失敗得非常規(guī)律——所有含“9”的題目都容易出錯(cuò)。排查后發(fā)現(xiàn)是訓(xùn)練數(shù)據(jù)的token序列里數(shù)字9被切分的模式太單一導(dǎo)致模型對(duì)這個(gè)數(shù)字的泛化很差。這種結(jié)論只有“可解釋的失敗”流程才能幫你穩(wěn)定沉淀出來(lái)。6. 從零到一的心得整理跳過(guò)的步驟都是要還的債說(shuō)了這么多最后想分享一些個(gè)人體會(huì)。很多人期望“從零開(kāi)始”意味著“一個(gè)月速成”但我想說(shuō)的是真正扎實(shí)的AI工程能力是用一次次失敗換來(lái)的。你能越快暴露自己的知識(shí)盲區(qū)成長(zhǎng)反而越快。所以我特別鼓勵(lì)你把過(guò)程“寫出來(lái)”——不是說(shuō)要做漂亮的文檔而是像發(fā)“開(kāi)發(fā)日志”一樣把每一個(gè)決策的前因后果記錄下來(lái)。等三個(gè)月后再回看你會(huì)發(fā)現(xiàn)自己當(dāng)時(shí)的很多判斷都是錯(cuò)的而這就是最好的成長(zhǎng)證據(jù)。我目前的公開(kāi)項(xiàng)目里保留了大量這種“復(fù)盤式”的記錄。比如初期我在數(shù)據(jù)清洗上偷懶結(jié)果后期評(píng)測(cè)時(shí)模型總是混淆兩個(gè)長(zhǎng)得像的專有術(shù)語(yǔ)又比如我一開(kāi)始過(guò)度依賴某個(gè)知名微調(diào)框架后來(lái)發(fā)現(xiàn)它在處理長(zhǎng)序列時(shí)默認(rèn)實(shí)現(xiàn)有缺陷被我換成了手動(dòng)改造的版本——這些經(jīng)驗(yàn)如果我當(dāng)時(shí)沒(méi)有寫下來(lái)后面十有八九會(huì)再踩一遍。如果你想走這條路我建議你選擇一個(gè)足夠小但有真實(shí)價(jià)值的起點(diǎn)。不要一上來(lái)就“復(fù)現(xiàn)Llama 3”而是從“用一個(gè)1B模型在你的垂直領(lǐng)域里做出一個(gè)推理能力明顯增強(qiáng)的Agent”開(kāi)始。你會(huì)發(fā)現(xiàn)一旦你親手走完數(shù)據(jù)處理、訓(xùn)練、推理、評(píng)測(cè)、迭代優(yōu)化的全流程你以后再看到任何新框架都不會(huì)發(fā)怵——因?yàn)槟阋呀?jīng)知道那些框架都在解決什么底層問(wèn)題。最后說(shuō)一個(gè)很多人忽視的細(xì)節(jié)千萬(wàn)不要跳過(guò)日志和監(jiān)控。尤其是推理服務(wù)的輸入輸出日志、延遲指標(biāo)、用戶反饋收集。沒(méi)有這些你的下一輪迭代相當(dāng)于在黑暗里繡花一切都是憑感覺(jué)。有了這些哪怕你只是做一個(gè)很小的模型你也能逐步逼近生產(chǎn)級(jí)系統(tǒng)的質(zhì)量。我在實(shí)際項(xiàng)目中深有體會(huì)大部分“看起來(lái)厲害”的優(yōu)化最后靠的不是天才靈感而是清晰的數(shù)據(jù)反饋循環(huán)。