話微調(diào)”到“智能體決策訓(xùn)練”的實(shí)戰(zhàn)指南)
1. 從一次微調(diào)翻車說(shuō)起Agent場(chǎng)景下SFT為什么不夠用了前幾天我往項(xiàng)目里加Agent能力模型要能自己決定調(diào)哪個(gè)工具、傳什么參數(shù)、看結(jié)果之后決定下一步做什么。一開(kāi)始我很天真想著這不就是指令跟隨的升級(jí)版嗎把工具調(diào)用的輸入輸出整理成對(duì)話樣本跑一輪SFT就完事。結(jié)果模型確實(shí)學(xué)會(huì)了輸出“調(diào)用搜索工具”這幾個(gè)字但參數(shù)經(jīng)常傳錯(cuò)搜索完拿到結(jié)果之后完全不知道該怎么用有時(shí)候甚至在一個(gè)死循環(huán)里反復(fù)調(diào)同一個(gè)接口失敗一次就再來(lái)一次像是被困住了一樣。這個(gè)現(xiàn)象逼著我重新審視一個(gè)基礎(chǔ)問(wèn)題我們平時(shí)說(shuō)的SFT在Agent場(chǎng)景下到底在訓(xùn)練什么傳統(tǒng)SFT的樣本長(zhǎng)這樣用戶問(wèn)“北京的天氣怎么樣”模型答“北京今天晴22度”。一個(gè)輸入一個(gè)輸出答案就結(jié)束了。但在Agent場(chǎng)景里一個(gè)樣本是一條完整的軌跡用戶提出目標(biāo)模型決定先搜索搜索返回結(jié)果模型分析結(jié)果發(fā)現(xiàn)不夠還要再調(diào)用一個(gè)天氣API拿到數(shù)據(jù)后匯總出最終答案。中間每一步都是決策每一步都可能錯(cuò)而且錯(cuò)誤會(huì)像滾雪球一樣累積到最終結(jié)果里。所以Agentic SFT給我的第一課就是它是監(jiān)督微調(diào)但監(jiān)督的不再是“最終的答案”而是“達(dá)成答案的整條決策路徑”。我們要教模型的不只是“該說(shuō)什么”更是“該在什么時(shí)候做什么、做完之后怎么看結(jié)果、結(jié)果不對(duì)勁怎么改”。這篇文章就是我目前對(duì)這個(gè)話題的全部認(rèn)知積累持續(xù)迭代持續(xù)記錄。我盡量寫(xiě)得直白一點(diǎn)把我踩過(guò)的坑、觀察到的現(xiàn)象、還沒(méi)想明白的問(wèn)題都說(shuō)清楚。適合正在做Agent微調(diào)、或者準(zhǔn)備把模型從“對(duì)話模型”改造成“干活模型”的同行參考。2. Agentic SFT到底在“學(xué)”什么從單輪問(wèn)答到多步?jīng)Q策2.1 輸出空間的變化模型從“寫(xiě)答案”變成“做決策”傳統(tǒng)SFT的核心假設(shè)是給定輸入最優(yōu)輸出是唯一的或者至少是高度確定的。SFT要做的就是讓模型去擬合這些輸入輸出對(duì)學(xué)一個(gè)從指令到回復(fù)的映射。Agentic SFT徹底打破了這一點(diǎn)。模型的輸出不再是一段最終回復(fù)而是一個(gè)行動(dòng)序列。它先要判斷“我現(xiàn)在要不要調(diào)用工具”然后決定“調(diào)哪個(gè)工具”再生成“符合接口規(guī)范的參數(shù)”接著閱讀“工具返回結(jié)果”最后綜合所有信息繼續(xù)下一步。這本質(zhì)上是一個(gè)決策過(guò)程而不僅僅是文本生成過(guò)程。舉個(gè)例子一個(gè)典型的Agent軌跡樣本里模型輸出通常長(zhǎng)這樣{ thought: 用戶想知道A股大盤(pán)走勢(shì)我需要先獲取指數(shù)數(shù)據(jù), action: call_tool, tool_name: get_stock_index, params: {index: sh000001, period: today} }關(guān)鍵在于模型要把“調(diào)用工具”這件事當(dāng)成一種正常的文本輸出。它并不真的去調(diào)用任何東西它只是在“生成”一段符合工具接口協(xié)議的結(jié)構(gòu)化文本然后由外層框架去實(shí)際執(zhí)行。這就有意思了我們訓(xùn)練的目標(biāo)本質(zhì)上是讓模型學(xué)會(huì)“說(shuō)人話”之外的另一種語(yǔ)言——工具協(xié)議語(yǔ)言。這就帶來(lái)一個(gè)直接后果SFT的數(shù)據(jù)不能再是簡(jiǎn)單的“問(wèn)題-答案”對(duì)而必須是“目標(biāo)-行動(dòng)-觀察-決策”的完整閉環(huán)。少了任何一環(huán)模型都學(xué)不會(huì)真正的Agent行為。2.2 監(jiān)督信號(hào)的粒度每一小步都要單獨(dú)負(fù)責(zé)傳統(tǒng)SFT里一個(gè)樣本只有一個(gè)監(jiān)督信號(hào)就是最終答案。哪怕模型在中間推理時(shí)胡說(shuō)八道只要最后答案對(duì)了loss就是小的。但Agent場(chǎng)景不一樣錯(cuò)誤會(huì)傳導(dǎo)。我后來(lái)在訓(xùn)練里用了“逐點(diǎn)監(jiān)督”per-step supervision的思路對(duì)軌跡里的每一步分別計(jì)算loss而不是只在最終答案上算loss。具體來(lái)說(shuō)一條軌跡可以拆成多個(gè)訓(xùn)練單元單元一用戶說(shuō)目標(biāo)期望模型輸出“思考調(diào)用工具A”單元二工具A返回結(jié)果期望模型輸出“分析結(jié)果調(diào)用工具B”單元三工具B返回結(jié)果期望模型輸出“匯總最終答案”每一步都是獨(dú)立的監(jiān)督目標(biāo)。這樣做的好處是哪怕最終答案因?yàn)橥獠抗ぞ叩牟淮_定性失敗了模型也能學(xué)到“在這個(gè)狀態(tài)下正確的下一步應(yīng)該是做什么”。這在Agent場(chǎng)景里非常重要因?yàn)楣ぞ邎?zhí)行可能失敗但模型對(duì)于“該調(diào)用哪個(gè)工具”的判斷仍然是有監(jiān)督價(jià)值的。2.3 為什么說(shuō)“會(huì)背答案”不等于“會(huì)用工具”剛跑完第一輪Agentic SFT的時(shí)候我測(cè)了幾個(gè)訓(xùn)練集里的用例表現(xiàn)非常好工具調(diào)用規(guī)范、參數(shù)準(zhǔn)確、多步規(guī)劃也有模有樣。但換到全新的任務(wù)上立馬露餡。后來(lái)我意識(shí)到一個(gè)本質(zhì)問(wèn)題模型在傳統(tǒng)SFT里學(xué)了太多“從問(wèn)題直接到答案”的捷徑。對(duì)Chat模型來(lái)說(shuō)這是優(yōu)點(diǎn)因?yàn)樗芨咝Щ卮?。但?duì)Agent來(lái)說(shuō)這個(gè)先驗(yàn)反而是阻力。模型傾向于自以為是地直接輸出答案而不是先想一想“我需要哪些信息、哪些信息我沒(méi)有、我需要調(diào)用什么工具來(lái)獲取”。我一度以為是數(shù)據(jù)量不夠加了幾千條樣例之后問(wèn)題依然存在。直到我對(duì)比了訓(xùn)練集和評(píng)測(cè)集的分布才發(fā)現(xiàn)模型學(xué)到的是“看到相似的問(wèn)法就模仿相似的軌跡”它并沒(méi)有真正學(xué)到“工具調(diào)用是一個(gè)為了彌補(bǔ)自身知識(shí)不足而采取的手段”。這個(gè)認(rèn)知讓我后來(lái)在設(shè)計(jì)數(shù)據(jù)時(shí)刻意加入了大量“模型不調(diào)用工具就會(huì)答錯(cuò)”的樣例逼迫模型學(xué)會(huì)依賴工具。效果有提升但離真正的泛化還有距離。3. 數(shù)據(jù)為王Agentic SFT的訓(xùn)練數(shù)據(jù)到底怎么造3.1 軌跡數(shù)據(jù)的三種形態(tài)Agentic SFT的數(shù)據(jù)不是天上掉下來(lái)的。目前常見(jiàn)的獲取方式有三種我分別試過(guò)感受很不一樣。第一種人工構(gòu)造軌跡。找?guī)讉€(gè)核心業(yè)務(wù)場(chǎng)景自己模擬Agent的行為手工寫(xiě)完整的多輪軌跡。優(yōu)點(diǎn)是質(zhì)量可控每條數(shù)據(jù)都符合我們想要的Agent行為范式缺點(diǎn)也明顯慢、貴、覆蓋場(chǎng)景有限。適合冷啟動(dòng)不適合撐起大規(guī)模訓(xùn)練。第二種從真實(shí)系統(tǒng)日志里扒軌跡。如果你的Agent已經(jīng)上線跑了一段時(shí)間日志里本身就是大量真實(shí)軌跡。把這部分日志清洗、過(guò)濾挑出高質(zhì)量的會(huì)話記錄下來(lái)直接當(dāng)作訓(xùn)練數(shù)據(jù)。這個(gè)數(shù)據(jù)源最貼近真實(shí)分布但問(wèn)題在于日志里優(yōu)質(zhì)軌跡的比例往往不高需要大量過(guò)濾和重寫(xiě)。而且日志里很多軌跡是帶有外部狀態(tài)依賴的清洗的時(shí)候要額外小心。第三種用更強(qiáng)的模型蒸餾。把任務(wù)描述扔給一個(gè)能力更強(qiáng)的模型讓它扮演Agent生成軌跡然后拿這些軌跡來(lái)訓(xùn)練小模型。這是目前實(shí)踐中最常用、也最容易規(guī)?;囊粭l路。但本質(zhì)上蒸餾是在“壓縮教師模型的行為模式”如果教師模型本身就是錯(cuò)的學(xué)生模型只會(huì)錯(cuò)得更穩(wěn)定。3.2 數(shù)據(jù)里的信號(hào)密度比總量更重要的事我在實(shí)驗(yàn)里發(fā)現(xiàn)一個(gè)反直覺(jué)的結(jié)論Agentic SFT的數(shù)據(jù)量提升帶來(lái)的收益會(huì)迅速進(jìn)入平臺(tái)期但數(shù)據(jù)里的“信號(hào)密度”卻始終顯著影響效果。什么叫信號(hào)密度就是一條軌跡里包含的“關(guān)鍵決策點(diǎn)”的數(shù)量和多樣性。同樣是3000條數(shù)據(jù)如果每條都只有一個(gè)工具調(diào)用、一個(gè)觀察、一個(gè)最終答案模型能學(xué)到的東西非常有限。但如果里面有大量需要三次以上工具調(diào)用、或者中間出現(xiàn)工具失敗和恢復(fù)的軌跡模型的Agent能力會(huì)有質(zhì)的提升。所以我后來(lái)造數(shù)據(jù)時(shí)重點(diǎn)盯這幾個(gè)信號(hào)多步依賴第二個(gè)工具的調(diào)用參數(shù)依賴第一個(gè)工具的輸出而不是獨(dú)立的兩次調(diào)用拼在一起。這類數(shù)據(jù)教會(huì)模型“信息流轉(zhuǎn)”。失敗恢復(fù)工具返回了錯(cuò)誤碼模型需要判斷是換參數(shù)重試還是換工具。這類數(shù)據(jù)教會(huì)模型“容錯(cuò)”。中途改計(jì)劃拿到工具返回后發(fā)現(xiàn)和最初的設(shè)想不一致模型需要基于新信息調(diào)整后續(xù)步驟。這類數(shù)據(jù)教會(huì)模型“plan revision”。拒絕調(diào)用的場(chǎng)景用戶問(wèn)了一個(gè)模型已能回答的問(wèn)題期望模型直接回答而不是非要去調(diào)工具。這類數(shù)據(jù)教會(huì)模型“何時(shí)不應(yīng)該調(diào)用工具”。最后這一點(diǎn)經(jīng)常被忽略。很多團(tuán)隊(duì)造數(shù)據(jù)時(shí)無(wú)限強(qiáng)調(diào)工具調(diào)用結(jié)果模型變成了一個(gè)“調(diào)用工具強(qiáng)迫癥”連“今天星期幾”這種問(wèn)題都要先調(diào)一下日歷API再回答。效率和成本都繃不住。3.3 構(gòu)造數(shù)據(jù)時(shí)我用到的具體配方以我目前在做的客服Agent為例我整理了一套比較實(shí)用的數(shù)據(jù)構(gòu)造流程從歷史工單里挑出100個(gè)高頻場(chǎng)景作為數(shù)據(jù)構(gòu)造的“骨架”對(duì)每個(gè)場(chǎng)景設(shè)計(jì)2到3種不同路徑一條最短路徑、一條帶糾錯(cuò)的路徑、一條需要換工具的路徑人工編寫(xiě)前50條作為質(zhì)量錨點(diǎn)確保風(fēng)格一致把剩余場(chǎng)景交給教師模型批量蒸餾生成后逐條人工審核在最終數(shù)據(jù)集里控制比例多步軌跡不低于40%失敗恢復(fù)軌跡不低于20%單步軌跡控制在30%以下所有工具調(diào)用的參數(shù)值都做隨機(jī)池化防止模型過(guò)擬合具體的參數(shù)字面量這套流程跑下來(lái)的數(shù)據(jù)集規(guī)模也就一萬(wàn)多條但訓(xùn)練出來(lái)的Agent在評(píng)測(cè)集上的表現(xiàn)比我之前用五萬(wàn)條粗糙數(shù)據(jù)訓(xùn)練出來(lái)的結(jié)果要好不少。信號(hào)密度確實(shí)比總量更重要。4. 訓(xùn)練細(xì)節(jié)里藏著魔鬼Loss設(shè)計(jì)與序列建模的取舍4.1 不是所有token都值得同等的監(jiān)督第一版訓(xùn)練我直接把整條對(duì)話歷史拼成一個(gè)序列當(dāng)成普通SFT去fine-tune了。結(jié)果是loss掉得很漂亮但模型行為完全不對(duì)。后來(lái)我才意識(shí)到在Agent軌跡里不同類型的文本監(jiān)督價(jià)值完全不同。用戶指令、工具返回結(jié)果、歷史觀察記錄——這些是模型需要“閱讀”的上下文不應(yīng)該參與loss計(jì)算。模型真正需要學(xué)習(xí)生成的是它的思考、工具調(diào)用指令和最終回復(fù)。如果這部分輸入文本也參與了loss模型會(huì)把大量容量浪費(fèi)在“模仿工具返回格式”這種無(wú)用功上真正要被訓(xùn)練的部分反而被稀釋了。所以第一件事就是加mask。在訓(xùn)練時(shí)把用戶消息、工具返回、系統(tǒng)提示這些部分全部mask掉只對(duì)模型自身生成的token計(jì)算loss。def build_agent_sample(conversation): conversation: List[Dict], 每條記錄包含 role 和 content role 包括 system / user / assistant / tool_result 只對(duì) assistant 的文本計(jì)算 loss其余部分 masked input_ids, labels [], [] for msg in conversation: tokens tokenizer.encode(msg[content]) input_ids.extend(tokens) if msg[role] assistant: labels.extend(tokens) # 參與 loss else: labels.extend([-100] * len(tokens)) # 不參與 loss return input_ids, labels4.2 對(duì)“動(dòng)作關(guān)鍵幀”施加更高的權(quán)重即使是在assistant生成的文本內(nèi)部不同內(nèi)容的重要性也不一樣。思考過(guò)程是軟性的就算措辭不太對(duì)意思到了就行。但工具調(diào)用的參數(shù)是硬性的參數(shù)值一旦錯(cuò)了后面全盤(pán)崩潰。我在實(shí)驗(yàn)里做過(guò)一個(gè)調(diào)整對(duì)工具調(diào)用相關(guān)的token特別是參數(shù)值、函數(shù)名額外提高loss權(quán)重比如乘以2.0。這樣模型會(huì)把更多學(xué)習(xí)容量分配到“準(zhǔn)確生成工具指令”這個(gè)關(guān)鍵行為上。從效果來(lái)看工具調(diào)用的格式正確率有明顯提升而思考部分的質(zhì)量并沒(méi)有因此變差。順帶說(shuō)一句有人會(huì)糾結(jié)要不要給“思考”部分也降低權(quán)重我覺(jué)得不用太極端。思考措辭的質(zhì)量高低對(duì)后續(xù)行為的影響是隱性的保持正常的訓(xùn)練權(quán)重即可重點(diǎn)還是要把工具調(diào)用部分突出出來(lái)。4.3 序列打包的細(xì)節(jié)坑Agent軌跡天然比普通對(duì)話要長(zhǎng)。一條多輪工具調(diào)用軌跡算上所有工具返回結(jié)果動(dòng)輒三四千token。訓(xùn)練時(shí)如果處理不當(dāng)會(huì)遇到兩個(gè)典型問(wèn)題。第一個(gè)問(wèn)題是超長(zhǎng)序列截?cái)?。粗暴截?cái)鄷?huì)把中間的決策上下文切斷模型看到的是前后文不搭的輸入能學(xué)到個(gè)啥。我的做法是滑動(dòng)窗口切分把長(zhǎng)軌跡切成多個(gè)有重疊的窗口保證每個(gè)窗口里都至少包含一個(gè)完整的工具調(diào)用決策段。第二個(gè)問(wèn)題是短軌跡拼接。為了提升訓(xùn)練效率很多框架會(huì)把多段短文本packing到一起。但如果packing不當(dāng)可能會(huì)導(dǎo)致模型跨樣本學(xué)習(xí)本來(lái)不相干的兩段軌跡被模型強(qiáng)行關(guān)聯(lián)。我的處理方式是在packing時(shí)加入分隔符并在計(jì)算attention時(shí)把跨樣本的部分mask掉。如果框架不支持這種mask就干脆不packing單條樣本訓(xùn)練雖然慢一點(diǎn)但穩(wěn)。4.4 超參數(shù)配置的一個(gè)參考基準(zhǔn)我目前的Agentic SFT跑得比較順的超參配置大致是這樣的超參數(shù)值說(shuō)明基礎(chǔ)學(xué)習(xí)率5e-6Agent軌跡訓(xùn)練容易過(guò)擬合務(wù)必用低學(xué)習(xí)率warmup比例3%太少容易前期震蕩太多會(huì)拖慢收斂epoch2超過(guò)2輪loss還在降但評(píng)測(cè)效果開(kāi)始倒退batch size32每條樣本較長(zhǎng)顯存受限時(shí)先用梯度累積工具調(diào)用token權(quán)重2.0突出關(guān)鍵動(dòng)作幀對(duì)話歷史mask開(kāi)啟輸入側(cè)全部不限參與loss這個(gè)配置不一定通用但可以作為起步基準(zhǔn)。我個(gè)人強(qiáng)烈建議從低學(xué)習(xí)率開(kāi)始因?yàn)锳gent軌跡數(shù)據(jù)通常是高度重復(fù)的同樣的工具調(diào)用格式會(huì)反復(fù)出現(xiàn)學(xué)習(xí)率稍微高一點(diǎn)模型就會(huì)開(kāi)始原地打轉(zhuǎn)訓(xùn)練集上的行為非常華麗測(cè)試集上一塌糊涂。5. 評(píng)測(cè)Agentic SFT只看成功率遠(yuǎn)遠(yuǎn)不夠5.1 你測(cè)的到底是“模型的能力”還是“任務(wù)的運(yùn)氣”我一開(kāi)始評(píng)測(cè)Agent效果就盯著一個(gè)指標(biāo)端到端任務(wù)成功率。后來(lái)發(fā)現(xiàn)這個(gè)指標(biāo)單獨(dú)看非常騙人。舉一個(gè)具體的現(xiàn)象。給模型布置一個(gè)“查詢訂單狀態(tài)”的任務(wù)如果最終答對(duì)了我以為是Agent能力好。但翻日志發(fā)現(xiàn)模型第一次調(diào)工具就把訂單ID傳錯(cuò)了工具返回錯(cuò)誤模型居然把錯(cuò)誤信息原樣搬進(jìn)了最終回復(fù)里而用戶恰好能從那段錯(cuò)誤信息里看到訂單狀態(tài)——外部工具的錯(cuò)誤返回“湊巧”包含了正確信息。這種情況下標(biāo)注“成功”會(huì)嚴(yán)重高估模型的真實(shí)Agent能力。所以我現(xiàn)在評(píng)測(cè)時(shí)把成功率拆成多個(gè)維度來(lái)觀察格式合規(guī)率模型輸出的工具調(diào)用是否符合接口規(guī)范是不是每次都能解析出合法的工具名和參數(shù)動(dòng)作正確率在當(dāng)前狀態(tài)下模型選擇的工具是否是合理的工具參數(shù)是否準(zhǔn)確地表達(dá)了用戶意圖信息利用率模型在生成最終回復(fù)時(shí)是否真的用上了工具返回結(jié)果中的關(guān)鍵字段失敗恢復(fù)率工具調(diào)用失敗后模型是選擇了合理的重試/替代方案還是直接擺爛最終任務(wù)成功率整個(gè)流程最終是否解決了問(wèn)題只有這五個(gè)指標(biāo)一起看才能定位所謂的“成功”到底靠的是模型能力還是運(yùn)氣。5.2 構(gòu)建評(píng)測(cè)集的坑不要讓訓(xùn)練數(shù)據(jù)污染評(píng)測(cè)結(jié)果這個(gè)坑我印象太深了。有一次我從同樣的業(yè)務(wù)場(chǎng)景里分別抽訓(xùn)練集和評(píng)測(cè)集只是換了些具體的參數(shù)值、改了點(diǎn)措辭結(jié)果評(píng)測(cè)效果出奇地好。后來(lái)我把訓(xùn)練集和評(píng)測(cè)集的語(yǔ)義相似度算了一下發(fā)現(xiàn)好多評(píng)測(cè)用例和訓(xùn)練用例重疊度很高模型根本就是在模擬訓(xùn)練數(shù)據(jù)里的軌跡評(píng)測(cè)效果自然虛高。正確的做法是評(píng)測(cè)場(chǎng)景必須和訓(xùn)練場(chǎng)景在任務(wù)類型、工具組合、交互模式上有可見(jiàn)的差異。如果訓(xùn)練時(shí)只見(jiàn)過(guò)搜索類工具的調(diào)用評(píng)測(cè)時(shí)就應(yīng)該補(bǔ)充一些調(diào)用計(jì)算器、調(diào)用數(shù)據(jù)庫(kù)查詢接口的場(chǎng)景。另外不要用同一個(gè)Agent框架里的同一條軌跡生成器既產(chǎn)訓(xùn)練數(shù)據(jù)又產(chǎn)評(píng)測(cè)數(shù)據(jù)否則模型的“軌跡模仿”能力會(huì)被誤認(rèn)為Agent規(guī)劃能力。5.3 一個(gè)更細(xì)的做法行為軌跡對(duì)齊我現(xiàn)在在嘗試一種更細(xì)的評(píng)測(cè)方案不再只看結(jié)果而是把模型在評(píng)測(cè)任務(wù)里的完整軌跡和標(biāo)注人員預(yù)寫(xiě)的“專家軌跡”做對(duì)齊。對(duì)齊的計(jì)算方式是序列級(jí)別的編輯距離看模型需要多少步增刪改才能走到專家軌跡的路徑上。這個(gè)指標(biāo)的好處是能區(qū)分兩種看似相同的結(jié)果一種是模型直接完成任務(wù)的路徑和專家路徑一致另一種是模型繞了一大圈、東錯(cuò)西錯(cuò)、最后碰巧完成。兩者的編輯距離差異非常大。前者才是我們想要的行為模式后者說(shuō)明Agent決策質(zhì)量還有很大問(wèn)題。不過(guò)在實(shí)操中要小心一個(gè)點(diǎn)Agent任務(wù)通常有多條合理路徑專家軌跡不能只有一條。我現(xiàn)在的做法是每條評(píng)測(cè)任務(wù)預(yù)寫(xiě)2到3條不同類型的合理路徑只要模型的軌跡和其中任何一條的編輯距離較小就認(rèn)為該步行為合理。6. Agentic SFT和Agentic RAG訓(xùn)練與檢索的分工邊界6.1 Agentic RAG是什么“Agentic RAG”最近被討論得很多簡(jiǎn)單說(shuō)就是讓模型自主決定何時(shí)檢索、檢索什么、從哪個(gè)來(lái)源檢索而不是像傳統(tǒng)RAG那樣在每條用戶請(qǐng)求前面都無(wú)腦做一次向量檢索。區(qū)別于傳統(tǒng)RAG的“固定流程”Agentic RAG是模型根據(jù)問(wèn)題判斷“現(xiàn)在有沒(méi)有足夠信息來(lái)回答”沒(méi)有就去檢索檢索結(jié)果不夠再檢索一輪直到信息充足為止。我在實(shí)踐中的體會(huì)是Agentic RAG里的“Agentic決策”能力恰好就是Agentic SFT需要訓(xùn)練的那部分能力。SFT負(fù)責(zé)把“在信息不足時(shí)主動(dòng)檢索”這件事變成模型的固有能力RAG負(fù)責(zé)提供檢索的基礎(chǔ)設(shè)施和知識(shí)來(lái)源。6.2 SFT和RAG的同與不同能力底座與外部知識(shí)的邊界有人可能會(huì)覺(jué)得既然有了RAG模型不需要再通過(guò)SFT去學(xué)“事實(shí)知識(shí)”SFT就沒(méi)那么重要了。這個(gè)觀點(diǎn)對(duì)傳統(tǒng)RAG場(chǎng)景有一定道理但對(duì)Agent場(chǎng)景完全行不通。需要想清楚一個(gè)分工RAG解決的是“知識(shí)從哪里來(lái)”SFT解決的是“模型如何組織行動(dòng)”。即使查詢都用RAG來(lái)做模型依然需要通過(guò)SFT學(xué)會(huì)“如何格式化一個(gè)檢索查詢”“如何判斷當(dāng)前檢索結(jié)果是否足夠”“如何在檢索結(jié)果不足時(shí)換一種查詢思路”。這些行為模式不是RAG組件能給的而是模型自身需要具備的能力。我做過(guò)一個(gè)對(duì)比實(shí)驗(yàn)在完全相同的RAG檢索鏈路下分別用普通SFT模型和Agentic SFT模型作為控制器前者的檢索行為非常僵化只會(huì)在固定的字段位置做一次檢索而后者的多輪檢索成功率有明顯提升。所以SFT和RAG不是替代關(guān)系而是底座和插槽的關(guān)系。SFT先把“會(huì)檢索”的能力訓(xùn)練出來(lái)RAG再把這個(gè)能力接到真正的知識(shí)源上。6.3 組合使用時(shí)的訓(xùn)練建議我在把SFT和RAG組合到同一個(gè)Agent系統(tǒng)里的時(shí)候有幾個(gè)心得。第一Agentic SFT訓(xùn)練時(shí)不要脫離檢索工具去造數(shù)據(jù)。有些團(tuán)隊(duì)為了簡(jiǎn)化訓(xùn)練把RAG檢索封裝成一個(gè)純文本輸入輸出的黑盒接口只在接口里塞一段檢索結(jié)果。這樣訓(xùn)練出來(lái)的模型對(duì)“檢索結(jié)果可能不完整”“檢索結(jié)果需要二次加工”這類真實(shí)狀態(tài)缺乏感知。建議訓(xùn)練數(shù)據(jù)里的工具返回內(nèi)容盡量保留真實(shí)檢索系統(tǒng)可能產(chǎn)生的不完美狀態(tài)比如返回空結(jié)果、返回低相關(guān)片段、返回超時(shí)錯(cuò)誤讓模型見(jiàn)到真實(shí)世界的噪聲。第二RAG的檢索策略本身也需要SFT數(shù)據(jù)來(lái)覆蓋。我的數(shù)據(jù)里專門(mén)有一類樣本觸發(fā)場(chǎng)景是“第一輪檢索結(jié)果太泛、沒(méi)有命中具體信息”期望模型的行為是“基于第一次的結(jié)果改寫(xiě)檢索詞進(jìn)行第二輪更精確的檢索”。這類行為模型靠提示詞也能寫(xiě)出來(lái)但提示詞控制不穩(wěn)定的情況很多把它作為SFT訓(xùn)練樣本的效果穩(wěn)定得多。第三注意控制“檢索過(guò)快”的行為。我在評(píng)測(cè)時(shí)發(fā)現(xiàn)經(jīng)過(guò)Agentic SFT訓(xùn)練的模型有一種傾向是太容易觸發(fā)RAG檢索什么都想查一下。原因很簡(jiǎn)單訓(xùn)練數(shù)據(jù)里檢索的密度太高了模型的先驗(yàn)變成“看到任務(wù)就先檢索”。所以現(xiàn)在造數(shù)據(jù)時(shí)我會(huì)刻意加入一批“直接回答才是最優(yōu)策略”的樣本告訴模型有些問(wèn)題是可以用自身知識(shí)直接回答的。7. 踩坑實(shí)錄四類典型翻車場(chǎng)景的排查鏈路7.1 翻車一SFT之后模型變“笨”了這是很多做Agent微調(diào)的人都會(huì)遇到的事通用能力跑到Agent能力然后模型在通用任務(wù)上明顯退步。我排查下來(lái)的原因有兩個(gè)方向。第一個(gè)方向是數(shù)據(jù)配比失衡。Agentic SFT數(shù)據(jù)量過(guò)大壓縮了通用數(shù)據(jù)的比例模型把所有容量都花在了擬合工具調(diào)用上把原先學(xué)會(huì)的推理、寫(xiě)作、常識(shí)問(wèn)答技巧沖淡了。解決思路是控制Agentic SFT訓(xùn)練數(shù)據(jù)的配比上限并在訓(xùn)練時(shí)混合一批高質(zhì)量通用指令數(shù)據(jù)。我的做法是7比3的比例七成Agent軌跡數(shù)據(jù)、三成通用對(duì)話數(shù)據(jù)能壓住退化又不影響Agent能力的學(xué)習(xí)。第二個(gè)方向是學(xué)習(xí)率過(guò)高。Agent軌跡里工具調(diào)用格式是高度重復(fù)的高學(xué)習(xí)率會(huì)在極短的步數(shù)內(nèi)把“工具調(diào)用”的模式刻進(jìn)模型同時(shí)把其他能力全部覆蓋掉。把學(xué)習(xí)率降到5e-6甚至更低之后退化現(xiàn)象會(huì)明顯緩解。建議每次微調(diào)前先拿極小的驗(yàn)證集跑一個(gè)50步的實(shí)驗(yàn)觀察通用能力在訓(xùn)練過(guò)程中的變化曲線再做全量訓(xùn)練。7.2 翻車二工具調(diào)用格式像“家族遺傳病”一個(gè)讓我很頭疼的現(xiàn)象當(dāng)訓(xùn)練數(shù)據(jù)里的工具調(diào)用格式統(tǒng)一為“調(diào)用某個(gè)搜索API后將結(jié)果紋絲不動(dòng)粘貼到回答中”時(shí)模型學(xué)到的是“工具調(diào)用就是為了照抄結(jié)果”。換了業(yè)務(wù)場(chǎng)景之后模型的格式完全混亂甚至在沒(méi)有任何工具定義的場(chǎng)景里也隨機(jī)輸出一段形似工具調(diào)用的文本。排查下來(lái)問(wèn)題出在訓(xùn)練數(shù)據(jù)缺乏“對(duì)工具結(jié)果做分析”的樣本。模型只見(jiàn)過(guò)“調(diào)用后原樣搬運(yùn)結(jié)果”沒(méi)學(xué)過(guò)“調(diào)用之后結(jié)合自身理解重新組織答案”。解決方法是造數(shù)據(jù)時(shí)在同一批訓(xùn)練集里增加一類樣本其目標(biāo)行動(dòng)是“閱讀工具返回結(jié)果后提煉關(guān)鍵信息忽略無(wú)關(guān)字段再整合生成回答”。這類數(shù)據(jù)能教會(huì)模型將工具當(dāng)作信息來(lái)源而不是當(dāng)作復(fù)制粘貼的對(duì)象。7.3 翻車三Loss在降評(píng)測(cè)不動(dòng)懷疑人生有一段時(shí)間我的訓(xùn)練loss曲線非常漂亮但評(píng)測(cè)集上的成功率一點(diǎn)沒(méi)變。后來(lái)我把模型在評(píng)測(cè)集上的輸出數(shù)據(jù)和訓(xùn)練集數(shù)據(jù)做了一個(gè)序列相似度對(duì)比發(fā)現(xiàn)模型的高頻輸出軌跡和訓(xùn)練集里的若干條軌跡高度雷同。這個(gè)現(xiàn)象的本質(zhì)是模型把“高頻軌跡”背下來(lái)了而不是把“決策規(guī)則”學(xué)會(huì)了。尤其在數(shù)據(jù)量不多、軌跡模式單一的情況下模型很容易把訓(xùn)練集里有代表性的一條軌跡當(dāng)成標(biāo)準(zhǔn)答案背下來(lái)。于是換一個(gè)場(chǎng)景就崩。解決方法是擴(kuò)充軌跡多樣性。造數(shù)據(jù)時(shí)同一個(gè)任務(wù)多寫(xiě)幾條完全不同的合理路徑訓(xùn)練時(shí)每條軌跡做參數(shù)隨機(jī)化讓相同語(yǔ)義的表達(dá)有不同的措辭。這些手段都能有效壓縮模型“背軌跡”的空間逼它抽象出通用的決策規(guī)則。7.4 翻車四多輪對(duì)話里的上下文污染Agent系統(tǒng)通常要維護(hù)多輪對(duì)話歷史。微調(diào)時(shí)如果沒(méi)有設(shè)計(jì)好跨輪樣本模型很容易被前幾輪會(huì)話里的工具調(diào)用歷史干擾導(dǎo)致行為漂移。我遇到的具體問(wèn)題是第二輪的對(duì)話里模型不該去訪問(wèn)一個(gè)只和第一輪相關(guān)的工具但它還是去了。因?yàn)橛?xùn)練數(shù)據(jù)里很多樣本是從一條完整軌跡直接切出來(lái)的而切分后的第二條樣本的對(duì)話歷史里還殘留著第一輪的“大量工具調(diào)用痕跡”模型就把“看到工具就調(diào)用”的錯(cuò)誤規(guī)則學(xué)回去了。解決方法是構(gòu)造訓(xùn)練樣本時(shí)明確區(qū)分“當(dāng)前任務(wù)的目標(biāo)工具集”和“歷史會(huì)話中已經(jīng)用過(guò)的工具集”。我給每條樣本標(biāo)注了哪些工具在當(dāng)前輪次是可用的哪些是歷史遺留的不可用工具并刻意構(gòu)造一些“歷史工具調(diào)用記錄和當(dāng)前目標(biāo)沖突”的場(chǎng)景。這樣模型才能在真實(shí)的多輪環(huán)境中學(xué)會(huì)正確判斷上下文邊界。8. 持續(xù)記錄的下一步方向目前這套Agentic SFT流程已經(jīng)在我的兩個(gè)項(xiàng)目里跑通了效果穩(wěn)定但遠(yuǎn)談不上終極方案。我還沒(méi)想明白但準(zhǔn)備接下來(lái)重點(diǎn)實(shí)驗(yàn)的問(wèn)題還有幾個(gè)一個(gè)是“軌跡長(zhǎng)度對(duì)泛化的影響”。現(xiàn)有數(shù)據(jù)里決策步數(shù)大多在3到8步之間如果任務(wù)需要12步以上的長(zhǎng)程決策模型表現(xiàn)依舊不穩(wěn)定。我在考慮是否要構(gòu)造更長(zhǎng)鏈條的數(shù)據(jù)但長(zhǎng)軌跡不僅標(biāo)注成本高訓(xùn)練時(shí)也更容易被前面的決策錯(cuò)誤帶偏需要單獨(dú)設(shè)計(jì)對(duì)“偏離修正”的監(jiān)督方式。另一個(gè)是“外部狀態(tài)是否應(yīng)該作為模型輸入的一部分”。比如工具返回的實(shí)時(shí)數(shù)據(jù)、當(dāng)前時(shí)間、用戶所在城市這些外部狀態(tài)變量在訓(xùn)練數(shù)據(jù)里很多時(shí)候是缺位的真實(shí)部署時(shí)又必需。把外部狀態(tài)注入訓(xùn)練樣本理論上能提升模型的泛化能力但具體以什么格式注入、注入哪些狀態(tài)、狀態(tài)缺失時(shí)怎么辦我還在摸索。還要想的是“如何讓SFT和強(qiáng)化學(xué)習(xí)階段配合得更好”。SFT訓(xùn)練出來(lái)的Agent決策穩(wěn)定性直接影響后續(xù)RL階段的探索效率。目前我的思路是把SFT階段做“保守訓(xùn)練”只教會(huì)模型做出正確決策的最低必要能力把更激進(jìn)的探索空間留給RL。但這個(gè)邊界到底劃在哪里還需要更多實(shí)驗(yàn)來(lái)驗(yàn)證。這次關(guān)于Agentic SFT的記錄就先寫(xiě)到這里。