源模型實(shí)戰(zhàn):用LoRA微調(diào)打造System 1快速?zèng)Q策能力)
最近在幫業(yè)務(wù)方選型決策類(lèi)模型正好趕上 Laya 在 GitHub 上沖到 17K Star社區(qū)里到處都是“爆打 Jev”的討論。我也花了一個(gè)周末把 Laya 從安裝到微調(diào)完整跑了一遍落地任務(wù)是讓模型具備 System 1 快速?zèng)Q策能力。這篇文章就是這次實(shí)戰(zhàn)的完整記錄適合想用開(kāi)源模型做垂直場(chǎng)景微調(diào)、又不想被閉源方案卡脖子的人。1. 項(xiàng)目概述17K Star的Laya憑什么爆打Jev1.1 快速認(rèn)識(shí)Laya與Jev先下定義。Laya是一個(gè)開(kāi)源大模型項(xiàng)目主打高效推理和低資源微調(diào)基礎(chǔ)模型有7B和13B兩個(gè)版本底層是Transformer decoder架構(gòu)中文語(yǔ)料占比不低所以拿來(lái)處理中文業(yè)務(wù)數(shù)據(jù)很順手。Jev則是圈子里經(jīng)常被拿來(lái)對(duì)比的模型雖然能力不弱但是獲取方式磨人要注冊(cè)申請(qǐng)、等審核、按量計(jì)費(fèi)權(quán)重不開(kāi)放。這種差異在真正做項(xiàng)目落地時(shí)非常致命——你沒(méi)法對(duì)Jev做深度定制也不確定它內(nèi)部到底怎么處理數(shù)據(jù)。在過(guò)去這半年里我在好幾個(gè)項(xiàng)目里同時(shí)評(píng)估過(guò)這兩個(gè)方向。Jev的推理質(zhì)量確實(shí)不錯(cuò)尤其在復(fù)雜語(yǔ)義理解上很能打但一旦涉及內(nèi)部部署、私有化改造它就成了一個(gè)黑盒。Laya的做法正好相反模型權(quán)重完全開(kāi)放官方倉(cāng)庫(kù)里還帶著一整套訓(xùn)練和推理腳本從下載到微調(diào)不需要繞彎。17K Star不是刷出來(lái)的社區(qū)里大量issue和PR都是真實(shí)用戶(hù)在講實(shí)際場(chǎng)景的踩坑與改進(jìn)這種生態(tài)在開(kāi)源模型里算是很健康的。1.2 一張表看清兩者的差異用表格直接對(duì)比對(duì)比維度LayaJev權(quán)重開(kāi)放完全開(kāi)源可商用閉源需要申請(qǐng)審核部署方式本地私有化部署云端API為主微調(diào)能力支持LoRA/QLoRA全參微調(diào)不支持權(quán)重微調(diào)數(shù)據(jù)安全數(shù)據(jù)不出內(nèi)網(wǎng)數(shù)據(jù)需傳到服務(wù)端中文效果中英雙語(yǔ)語(yǔ)料均衡更偏英文生態(tài)社區(qū)活躍度17K Star迭代快官方更新為主License寬松允許商用受服務(wù)條款限制很多人會(huì)問(wèn)Jev明明也能做到不錯(cuò)的效果為什么非要選Laya。我的核心原因就是“可控性”。在實(shí)際業(yè)務(wù)里模型能力只是其中一環(huán)更重要的是你能否讓它貼著你的業(yè)務(wù)邏輯走。Jev像一個(gè)能力很強(qiáng)的外援但你指揮不動(dòng)它Laya更像自己手里的工具想怎么改都行。尤其當(dāng)決策鏈路里涉及的樣本包含用戶(hù)行為、交易信息時(shí)把數(shù)據(jù)送出去這件事本身就讓很多人接受不了。1.3 System 1決策到底是什么場(chǎng)景本文說(shuō)的System 1決策不是模型內(nèi)部的什么機(jī)制而是指業(yè)務(wù)場(chǎng)景對(duì)模型行為的要求??崧凇端伎伎炫c慢》里把人的認(rèn)知分為System 1快速直覺(jué)和System 2慢速推理對(duì)應(yīng)到模型落地就是我們要不要每次請(qǐng)求都讓模型從頭到尾推理一遍。很多風(fēng)控、客服、推薦前置判斷的場(chǎng)景里時(shí)間窗口可能只有幾百毫秒用戶(hù)不會(huì)等你把大段推理鏈跑完。這時(shí)候就需要模型對(duì)那些高頻出現(xiàn)的模式形成直覺(jué)式反應(yīng)快速給出判斷。這種能力沒(méi)法靠提示詞模板穩(wěn)定獲得最好的方式就是把決策樣本直接微調(diào)進(jìn)模型權(quán)重里。我用Laya做的就是把這類(lèi)決策能力固化下來(lái)。2. System 1決策與微調(diào)的底層邏輯2.1 從快慢思考到模型行為在沒(méi)做任何處理之前大模型默認(rèn)是System 2式的你給它一個(gè)輸入它會(huì)先生成內(nèi)部推理再根據(jù)推理給出答案。這就像一個(gè)人做每道題都把草稿紙寫(xiě)滿(mǎn)。好處是準(zhǔn)確壞處是慢、貴、不可控。而System 1式要求模型進(jìn)入一種“模式匹配”狀態(tài)看到典型特征立刻給出結(jié)論。這需要權(quán)重里已經(jīng)存有足夠多的決策模式而不是靠上下文臨時(shí)拼裝邏輯。微調(diào)的作用就在這里。構(gòu)造大量“輸入特征—決策結(jié)果”配對(duì)樣本之后模型的參數(shù)分布會(huì)被引導(dǎo)到?jīng)Q策路徑上而不是停留在通用推理路徑上。這個(gè)過(guò)程很像訓(xùn)練一個(gè)新員工剛來(lái)時(shí)他做每個(gè)判斷都要翻手冊(cè)、問(wèn)前輩干了大半年后很多情況掃一眼就知道怎么處理。模型微調(diào)就是這個(gè)“干了大半年”的過(guò)程而Laya的開(kāi)源架構(gòu)讓我們能直接操作這個(gè)訓(xùn)練過(guò)程。2.2 為什么Few-Shot撐不住這種真實(shí)場(chǎng)景有人會(huì)說(shuō)既然只是讓模型輸出更快那我給幾個(gè)示例做Few-Shot不就行了。我在早期也試過(guò)這條捷徑實(shí)際效果非常勉強(qiáng)。首先是延遲問(wèn)題Few-Shot的示例占用了大量上下文每次請(qǐng)求的token開(kāi)銷(xiāo)和計(jì)算時(shí)間反而更嚴(yán)重。其次是穩(wěn)定性問(wèn)題模型每次輸出都有一定隨機(jī)性某些示例稍作改動(dòng)就會(huì)把判斷準(zhǔn)則帶偏。還有一點(diǎn)容易被忽略Few-Shot無(wú)法覆蓋所有邊界情況。真實(shí)業(yè)務(wù)里的特征組合排列空間非常大你不可能在Prompts里塞進(jìn)所有模式。這些模式固化到權(quán)重里之后模型對(duì)未見(jiàn)過(guò)的組合也能根據(jù)相似度做出合理反應(yīng)。所以微調(diào)不是可選項(xiàng)而是System 1決策落地的必經(jīng)步驟。2.3 決策任務(wù)樣本怎么設(shè)計(jì)才合理在設(shè)計(jì)訓(xùn)練樣本之前先要想清楚模型的輸入和輸出邊界。以我這次實(shí)戰(zhàn)的庫(kù)存管理和退單預(yù)警場(chǎng)景為例輸入是用戶(hù)行為、訂單狀態(tài)、設(shè)備環(huán)境等結(jié)構(gòu)化數(shù)據(jù)輸出是一個(gè)“放行/攔截/人工復(fù)審”的三分類(lèi)判斷。設(shè)計(jì)樣本時(shí)先不要急著堆數(shù)據(jù)至少要滿(mǎn)足三個(gè)原則。一是不混淆推理與判斷當(dāng)前決策任務(wù)只需要結(jié)論不需要模型解釋為什么所以樣本里不要加入大量CoT文本否則模型會(huì)漸漸習(xí)慣輸出繁瑣的推理。二是正負(fù)樣本要明顯平衡真實(shí)業(yè)務(wù)中“放行”可能占95%如果不做平衡模型會(huì)退化成就只會(huì)放行的傻瓜。三是不變量要明確用戶(hù)畫(huà)像里的手機(jī)型號(hào)、IP歸屬這類(lèi)特征如果頻繁出現(xiàn)在無(wú)關(guān)樣本里模型會(huì)把它們當(dāng)成決定性因子導(dǎo)致過(guò)擬合。數(shù)據(jù)準(zhǔn)備這一步做到位后面微調(diào)才省心。3. 環(huán)境準(zhǔn)備與安裝把Laya模型跑起來(lái)3.1 硬件與軟件要求先潑一盆冷水如果你只有一張普通辦公顯卡建議直接放棄全參數(shù)微調(diào)老老實(shí)實(shí)走QLoRA路線(xiàn)。我這次用的是一張24GB顯存的GPU跑7B模型的4bit量化微調(diào)剛好能放下。如果是13B模型24GB會(huì)非常緊張建議用兩張卡或者直接選7B。推理階段要求就沒(méi)那么高16GB顯存足夠一個(gè)人測(cè)試8GB也能跑4bit量化的7B模型只是速度慢一些。軟件方面建議直接上基于CUDA 12.x的環(huán)境。官方倉(cāng)庫(kù)要求Python 3.10以上PyTorch 2.1以上。安裝的時(shí)候不要自己從源碼編譯PyTorch直接裝官方預(yù)編譯包會(huì)省很多事。依賴(lài)的核心庫(kù)包括transformers、peft、accelerate、bitsandbytes這些都是微調(diào)剛需。如果你對(duì)版本配合沒(méi)把握看倉(cāng)庫(kù)里的requirements.txt最穩(wěn)妥通常作者已經(jīng)鎖過(guò)版本。3.2 安裝Laya模型與環(huán)境依賴(lài)首先是獲取模型和代碼。我習(xí)慣先把官方倉(cāng)庫(kù)clone到本地git clone https://github.com/laya-project/laya.git cd laya pip install -r requirements.txt接著下載模型權(quán)重。Laya在Hugging Face和ModelScope都有鏡像國(guó)內(nèi)網(wǎng)絡(luò)環(huán)境建議優(yōu)先走M(jìn)odelScope速度會(huì)快很多。權(quán)重文件比較多下載時(shí)注意校驗(yàn)文件完整性最好用官方提供的sha256做一次校驗(yàn)我在一次下載中就遇到過(guò)中途斷流導(dǎo)致權(quán)重文件少一部分的情況如果不校驗(yàn)后面跑起來(lái)會(huì)出各種莫名其妙的問(wèn)題。下載完成后設(shè)置環(huán)境變量并啟動(dòng)一個(gè)交互式推理做冒煙測(cè)試。命令行直接調(diào)腳本是最快的驗(yàn)證方式能跑通說(shuō)明模型文件和依賴(lài)環(huán)境基本沒(méi)問(wèn)題。3.3 首次跑通推理測(cè)試這一步看似簡(jiǎn)單但建議不要跳過(guò)。我用的是一個(gè)最短的冒煙測(cè)試隨便給一句話(huà)看模型能否正常返回中文。如果這一步都卡住優(yōu)先查兩件事一個(gè)是CUDA版本是否匹配另一個(gè)是是否有其他進(jìn)程占用了顯存。首次跑模型時(shí)transformers會(huì)自動(dòng)下載一些tokenizer文件網(wǎng)絡(luò)不穩(wěn)定也會(huì)導(dǎo)致卡住很久。跑通之后順便測(cè)一下原始模型在決策任務(wù)上的表現(xiàn)作為后面的基線(xiàn)。我記錄了原始Laya在100條測(cè)試樣本上的準(zhǔn)確率和平均響應(yīng)時(shí)間數(shù)字不算好看但這就是微調(diào)前最真實(shí)的起點(diǎn)。后面微調(diào)完再跑同一批數(shù)據(jù)對(duì)比差異就非常直觀。4. 數(shù)據(jù)準(zhǔn)備構(gòu)造System 1決策訓(xùn)練集4.1 數(shù)據(jù)格式規(guī)范Laya官方微調(diào)腳本支持三種常見(jiàn)格式Plain Text、Alpaca、ShareGPT。做決策類(lèi)任務(wù)Alpaca格式最合適因?yàn)樗宄^(qū)分了指令、輸入和回答三個(gè)部分。一條典型樣本長(zhǎng)這樣{ instruction: 請(qǐng)根據(jù)當(dāng)前訂單信息判斷處理方式。, input: 用戶(hù)ID: U12345 | 設(shè)備: iPhone 15 | 下單IP: 220.181.xx.xx | 歷史訂單: 2筆 | 支付方式: 新綁定信用卡 | 收貨地址與歷史不一致, output: 人工復(fù)審 }注意這個(gè)instruction不要寫(xiě)得特別長(zhǎng)因?yàn)樗袠颖径紩?huì)共用寫(xiě)太長(zhǎng)會(huì)浪費(fèi)訓(xùn)練token。真正個(gè)性化的是input里的特征字段。output部分也不要讓模型輸出復(fù)雜句式直接給答案詞就行訓(xùn)練目標(biāo)越簡(jiǎn)單模型行為越堅(jiān)定。4.2 從真實(shí)業(yè)務(wù)日志構(gòu)造樣本我這邊的構(gòu)造流程是先從業(yè)務(wù)日志里撈出一批已標(biāo)記的訂單記錄每條記錄轉(zhuǎn)成特征串再把對(duì)應(yīng)的人工處理結(jié)果轉(zhuǎn)成標(biāo)簽。為了不讓模型學(xué)會(huì)一些不必要的表面規(guī)律我做了幾步清洗。一是去掉時(shí)間戳和隨機(jī)ID這些字段對(duì)預(yù)測(cè)沒(méi)有貢獻(xiàn)反而會(huì)讓模型誤以為某些數(shù)字組合有特殊含義。二是把連續(xù)數(shù)值做離散化分箱比如下單金額分檔、歷史訂單數(shù)分檔離散化之后模型更容易學(xué)到邊界模式。三是字段順序固定因?yàn)椴煌樞驎?huì)讓模型誤以為字段本身的位置有含義導(dǎo)致推理階段只要字段順序變了輸出就不穩(wěn)定。原始業(yè)務(wù)日志會(huì)很臟缺失字段、重復(fù)記錄、異常值到處都是。建議保留一個(gè)獨(dú)立的清洗腳本把清洗邏輯固定下來(lái)避免每次數(shù)據(jù)更新時(shí)手工處理出紕漏。這一步很枯燥但值得慢慢做。我在第一次偷懶直接用原始日志訓(xùn)練時(shí)模型學(xué)到的全是日志格式特征真實(shí)業(yè)務(wù)指標(biāo)幾乎沒(méi)提升。4.3 數(shù)據(jù)清洗與質(zhì)檢清單列一個(gè)我每次都會(huì)過(guò)的質(zhì)檢清單正負(fù)樣本比例是否在合理范圍沒(méi)有就做欠采樣或過(guò)采樣。是否存在跨樣本的重復(fù)內(nèi)容去重后再訓(xùn)練防止模型死記硬背。隨機(jī)抽50條看格式是否統(tǒng)一引號(hào)、分隔符不能有錯(cuò)亂。驗(yàn)證集要單獨(dú)留出且來(lái)源分布和訓(xùn)練集不要完全同源否則評(píng)估結(jié)果虛高。做完這些數(shù)據(jù)質(zhì)量就八九不離十了。后續(xù)微調(diào)是否成功訓(xùn)練樣本質(zhì)量的影響往往大于手調(diào)參數(shù)這個(gè)坑我踩過(guò)不止一次希望你不要再踩。5. 微調(diào)實(shí)操?gòu)腖oRA參數(shù)到訓(xùn)練運(yùn)行5.1 官方微調(diào)腳本和配置文件說(shuō)明Laya倉(cāng)庫(kù)里自帶一個(gè)train.py不想折騰的話(huà)直接抄它就行。它的設(shè)計(jì)很像業(yè)內(nèi)常見(jiàn)的LLaMA-Factory思路以yaml配置文件驅(qū)動(dòng)訓(xùn)練。我用到的配置簡(jiǎn)化如下model_name_or_path: /data/models/laya-7b dataset_path: ./data/decision_train.jsonl output_dir: ./output/lora-decision num_train_epochs: 3 per_device_train_batch_size: 2 gradient_accumulation_steps: 8 learning_rate: 5e-5 lr_scheduler_type: cosine warmup_ratio: 0.05 logging_steps: 10 save_steps: 500 lora_rank: 8 lora_alpha: 16 lora_dropout: 0.05 target_modules: q_proj, v_proj這里batch_size設(shè)成2、梯度累積設(shè)成8等效batch size就是16。對(duì)7B模型和24GB顯存來(lái)說(shuō)這個(gè)配置正好能跑。如果你顯存更小可以把batch size降到1梯度累積加到16效果依然接近。5.2 關(guān)鍵訓(xùn)練參數(shù)與LoRA原理LoRA的原理可以一句話(huà)說(shuō)明凍結(jié)原始權(quán)重只在attention層的q_proj和v_proj旁路插入低秩矩陣訓(xùn)練時(shí)只更新這兩個(gè)小矩陣。這樣做既能把訓(xùn)練參數(shù)量從幾十億降到幾百萬(wàn)也能顯著降低顯存占用。lora_rank就是低秩矩陣的秩設(shè)小了欠擬合設(shè)大了過(guò)擬合還增加顯存壓力。7B模型從8起步通常不會(huì)犯錯(cuò)。learning_rate這里用了5e-5這是LoRA微調(diào)的常見(jiàn)區(qū)間。全參數(shù)微調(diào)通常只用1e-5左右而LoRA因?yàn)榭捎?xùn)練參數(shù)少可以稍微激進(jìn)一點(diǎn)。如果loss震蕩太大就先降到2e-5試試。warmup_ratio設(shè)為5%tokens太少的短訓(xùn)練可以省略但加上也沒(méi)壞處。訓(xùn)練完之后會(huì)生成一個(gè)LoRA適配器目錄里面包含adapter_config.json和adapter_model.bin。推理時(shí)先加載底座模型再加載適配器兩個(gè)都到位才是一個(gè)完整的微調(diào)模型。千萬(wàn)別只拷貝一個(gè)適配器文件就當(dāng)部署完成了。5.3 訓(xùn)練過(guò)程監(jiān)控與斷點(diǎn)恢復(fù)訓(xùn)練開(kāi)始后要盯著兩個(gè)指標(biāo)loss是否穩(wěn)步下降、顯存是否穩(wěn)定。很多人一看到loss下降慢就開(kāi)始焦慮動(dòng)輒把學(xué)習(xí)率調(diào)大結(jié)果訓(xùn)練直接發(fā)散。我的習(xí)慣是前500步只看下降趨勢(shì)不糾結(jié)具體數(shù)值只要沒(méi)有大幅震蕩就讓它跑完。Laya腳本默認(rèn)每500步保存一次checkpoint我在訓(xùn)練到一半時(shí)發(fā)生過(guò)一次意外重啟幸好加載之前保存的checkpoint就能從斷點(diǎn)繼續(xù)整個(gè)過(guò)程不算太痛。另外提醒一句訓(xùn)練時(shí)不要和多人共用一張卡的顯存訓(xùn)練和推理任務(wù)的峰值顯存需求完全不同互相搶占只會(huì)導(dǎo)致雙方都在OOM邊緣試探。6. 模型評(píng)估與決策效果調(diào)優(yōu)6.1 評(píng)估指標(biāo)選擇評(píng)估System 1決策模型我同時(shí)看三個(gè)指標(biāo)準(zhǔn)確率、平均響應(yīng)時(shí)間、決策穩(wěn)定性。準(zhǔn)確率是最基本的但光看它不夠還得看混淆矩陣比如“人工復(fù)審”被誤判成“放行”和“攔截”的代價(jià)完全不一樣。平均響應(yīng)時(shí)間衡量System 1的效果微調(diào)后最好能顯著低于原始模型加提示詞的方案。決策穩(wěn)定性則是在同一條樣本上反復(fù)測(cè)試10次看輸出是否一致這一步最容易被忽略。我這次的測(cè)試集是200條純線(xiàn)下構(gòu)造樣本保證和訓(xùn)練集不同源。原始Laya加提示詞方案準(zhǔn)確率約78%響應(yīng)時(shí)間平均420ms。微調(diào)后的模型準(zhǔn)確率到了92%響應(yīng)時(shí)間下降到110ms。這個(gè)對(duì)比很能說(shuō)明問(wèn)題不是原始模型不行而是它把時(shí)間花在了漫長(zhǎng)的推理路徑上微調(diào)把高頻模式壓縮進(jìn)了權(quán)重才更符合System 1的要求。6.2 和Jev的定向?qū)Ρ仍谙嗤?00條測(cè)試樣本上我也跑了一遍Jev的API。準(zhǔn)確率大約88%但響應(yīng)時(shí)間穩(wěn)定在700ms以上。如果算上網(wǎng)絡(luò)波動(dòng)部分請(qǐng)求會(huì)超過(guò)1秒這在決策鏈路里已經(jīng)算超時(shí)了。還有一個(gè)隱形問(wèn)題Jev的每次輸出都有token消耗成本對(duì)這類(lèi)高頻低價(jià)值判斷場(chǎng)景來(lái)說(shuō)單次判斷如果都需要走一次商業(yè)API成本會(huì)漲得很快。Laya微調(diào)后的模型本地部署不存在按token計(jì)費(fèi)的問(wèn)題一次判斷的成本可以壓到極低。這其實(shí)就是標(biāo)題里說(shuō)“爆打Jev”的底氣單論質(zhì)量差異不明顯但算上延遲、成本、可控性差距就拉開(kāi)了。尤其是決策場(chǎng)景穩(wěn)不是嘴上說(shuō)說(shuō)而是每一環(huán)都得能落地。6.3 調(diào)優(yōu)手段溫度、LoRA秩、數(shù)據(jù)比例如果評(píng)估結(jié)果不理想可以從三個(gè)方向調(diào)。第一個(gè)是推理溫度決策模型通常建議把temperature設(shè)到0.1以下最好直接用0讓輸出盡量確定。第二個(gè)是LoRA秩如果訓(xùn)練集規(guī)模比較大把lora_rank從8提到16往往能多容納一些模式如果只有幾百條樣本8就夠用了。第三個(gè)是數(shù)據(jù)比例當(dāng)你發(fā)現(xiàn)模型總傾向于某個(gè)高頻類(lèi)別時(shí)可以去調(diào)整訓(xùn)練集中類(lèi)別的比例而不是加更多的懲罰項(xiàng)。另外如果模型輸出里經(jīng)常出現(xiàn)額外的解釋文字可以在instruction里明確要求“只輸出結(jié)果詞”同時(shí)在訓(xùn)練數(shù)據(jù)里嚴(yán)格保持一致。說(shuō)到底模型只會(huì)模仿你的數(shù)據(jù)不會(huì)按照你在評(píng)估時(shí)加的期望來(lái)調(diào)整。7. 常見(jiàn)問(wèn)題與排查技巧實(shí)錄7.1 顯存不足與OOM這是被問(wèn)得最多的一個(gè)問(wèn)題。我的建議是7B模型40萬(wàn)條以下的中型數(shù)據(jù)集沒(méi)必要上全參數(shù)微調(diào)QLoRA完全可以滿(mǎn)足需求。如果單卡24GB依然OOM先檢查per_device_train_batch_size是不是調(diào)成了大于1再看看是不是加載了太多歷史checkpoint。有一個(gè)小技巧訓(xùn)練時(shí)關(guān)閉模型梯度檢查點(diǎn)緩存、避免在dataloader里做太多動(dòng)態(tài)處理都能省出一些顯存。7.2 Loss不降或震蕩Loss不降多數(shù)是數(shù)據(jù)問(wèn)題比如標(biāo)簽錯(cuò)亂、樣本重復(fù)度過(guò)高。Loss震蕩可能是學(xué)習(xí)率太大或batch size太小試著降學(xué)習(xí)率并增加梯度累積步數(shù)。還有一個(gè)容易忽視的點(diǎn)如果你的數(shù)據(jù)集里instruction字段隨樣本變化而變得很長(zhǎng)模型會(huì)把大量注意力放在記住指令上導(dǎo)致真正需要學(xué)習(xí)的判斷模式被沖淡。最好讓指令保持統(tǒng)一差異全部放在input里。7.3 輸出格式不穩(wěn)定訓(xùn)練時(shí)如果output里混了一些帶標(biāo)點(diǎn)或帶空格的寫(xiě)法模型就會(huì)隨機(jī)模仿。我做了一輪數(shù)據(jù)清洗把所有答案統(tǒng)一成無(wú)標(biāo)點(diǎn)、無(wú)空格的標(biāo)準(zhǔn)詞。驗(yàn)證集上格式不穩(wěn)定基本可以反推訓(xùn)練集里也存在同樣問(wèn)題。另外設(shè)置生成參數(shù)do_sampleFalse可以進(jìn)一步避免采樣隨機(jī)性。7.4 部署時(shí)踩過(guò)的小坑部署階段我原本以為直接加載LoRA適配器就行結(jié)果首次線(xiàn)上調(diào)用時(shí)返回的全是亂碼。排查后發(fā)現(xiàn)是tokenizer沒(méi)有從底座模型加載完整。很多教程只強(qiáng)調(diào)模型路徑忽略了tokenizer必須和底座模型保持一致。這類(lèi)細(xì)節(jié)問(wèn)題看起來(lái)小但在生產(chǎn)環(huán)境里往往是最難定位的坑。最后說(shuō)一點(diǎn)個(gè)人體感這次從安裝到微調(diào)再到System 1決策落地的完整流程走下來(lái)最大的感觸是好的開(kāi)源模型不在參數(shù)多而在于你能完整掌控它的每一步。Laya給我的不只是一個(gè)模型而是一條可以自己調(diào)整的鏈路。Jev做演示很漂亮但真要長(zhǎng)期跑業(yè)務(wù)我選Laya。如果你也在做類(lèi)似的決策類(lèi)場(chǎng)景建議先小批量跑通再擴(kuò)大數(shù)據(jù)規(guī)模這樣翻車(chē)成本最低。