1. 先把Agentic SFT这件事的来龙去脉捋一遍
Agentic SFT这个词,我这半年在不少技术讨论里反复看到,一开始我以为它就是把普通指令数据换成带工具调用的数据,拿同一个微调流程跑一遍而已。真正上手之后才发现,这个认知太浅了——Agentic SFT训练的不仅是"模型会调用工具"这个表面动作,它是在通过模仿学习,让模型具备一种在环境反馈中持续决策的行为模式。这个过程和传统SFT教模型"按格式输出一段话"有本质区别。
我理解的Agentic SFT,简单说就是:用"智能体执行任务的完整轨迹数据"(包括思考、动作、环境反馈),对基座模型做有监督微调,让模型学会在回合制交互中做规划、调工具、读结果、再决策。它解决的问题很具体:普通SFT教出来的模型只会"回答"问题,但不会"做事"。比如你让它查一个需要调API、翻文档、分步骤完成的复合任务,普通模型要么一口气编个答案,要么就停在第一步说"我无法访问外部信息"——而Agentic SFT训练过的模型,知道什么时候该调用什么工具,调用完之后怎么解读返回结果,观察不满足时下一步该追问还是该换个工具。
这篇东西不是什么权威教程,而是我边做边记的"持续记录",适合三类人看:一是准备给模型加"智能体能力"但还在犹豫要不要上Agentic SFT的工程同学;二是已经在训练但效果不理想、想对照看看自己哪里踩坑的调参选手;三是对Agentic SFT到底是什么这件事还没彻底搞清,想有个系统性认知的产品和技术负责人。
1.1 从普通SFT到Agentic SFT到底变了什么
普通的SFT,数据长这样:一条指令,对应一条标准回答。训练目标简单粗暴——让模型输出的条件概率逼近人类标注。模型学会的是"信息检索型"的答题习惯:把知识浓缩,组织成结构化答案。这种训练里不存在"下一步"的概念,模型没有状态,也不需要考虑自己上一轮输出的东西造成了什么后果。
Agentic SFT的数据形态完全不同。它是一条轨迹,轨迹里包含多个轮次,每个轮次内部又有角色切换。典型的ReAct风格轨迹长这样:
用户提问:请帮我对比Q1和Q2的销冠产品,并出一个周报摘要。 助手思考:需要先获取两个季度的销售数据,调用get_sales_quarter接口。 助手动作:get_sales_quarter({"quarter": ["Q1", "Q2"]}) 环境返回:{Q1销售额数据..., Q2销售额数据...} 助手思考:数据拿到了,但市场占有率字段缺失,需要再查竞品表。 助手动作:query_competitor({"quarter": "Q2"}) 环境返回:{竞品数据...} 助手回答:根据两个季度对比,Q2销冠产品变化如下……注意这里的训练粒度:模型不是一次到位输出最终答案,而是在"值得调用工具的位置"停下来、输出结构化动作、等待环境反馈、再根据反馈继续。这正是Agentic SFT和普通SFT在行为层面上的分水岭——前者在训练"多轮决策策略",后者在训练"单轮语言映射"。
1.2 Agentic SFT真正在训练的四项底层能力
按我现在的理解,Agentic SFT实际上在同时塑造四种能力,缺一不可:
- 停止生成的能力:模型要知道哪些话可以直接说,哪些话不该硬编答案,而应该输出工具调用格式。这个"我该停了,把控制权交给环境"的判断,是很多微调模型崩溃的重灾区。因为普通SFT的监督信号里,模型永远是"把话说完"的,很少见到"话说到一半就交给外部系统"的样本。
- 动作格式化的能力:即便模型决定了要调工具,还要保证动作以严格的JSON或函数调用schema输出。这一步看着简单,实际上在数据不平衡、训练不充分时非常容易崩,动不动就少了右括号、参数名写错、或者把解释文本和动作参数混在一起。
- 观察解读的能力:环境返回的内容是高度异构的——有JSON,有日志串,可能还有报错信息。模型需要学会"读懂"这些反馈,区分哪些信息有用、哪些是噪声,而不是直接把原始返回复制粘贴进下一轮。
- 多步规划的能力:根据系统提示里给定的目标,结合当前已经走到的步骤,决定接下来是继续采集信息、换一条路径,还是已经足以生成最终答案。这一步最难,因为它依赖前两项能力稳定发挥,某种意义上规划是"涌现"出来的,没法靠几条样本强行教会。
这里我也要诚实地说,这四项能力并不是独立训练的,它们共享一套参数,互相影响。后面所有数据设计、损失函数设计、评估指标,本质上都是围绕"这四项能力谁能保住、谁先崩"来展开的。
2. 数据工程:Agentic SFT的大头重来不在训练
我可以很直接地说,在我目前做过的几个Agentic SFT实验里,训练环节花的时间不到20%,剩下80%全砸在数据上了。数据决定成败这件事,在这种需要表达"完整决策序列"的学习场景里体现得格外明显——因为轨迹数据的获取成本、错误率、分布偏差,都比普通指令数据高出一个量级。
2.1 轨迹数据的三种来源与优劣对比
造Agentic SFT数据,市面上主流的路径有三条,每条我都试过,直接上对比:
| 数据来源 | 优势 | 劣势 | 适合场景 |
|---|---|---|---|
| 真实业务日志 | 分布最真实,覆盖线上实际调用模式 | 噪声大,中间步骤错误多,需大量清洗;冷启动期根本攒不够量 | 产品已经上线、有日志回流的中大规模团队 |
| 专家人工标注 | 质量最高,轨迹逻辑清晰,动作决策合理 | 成本惊人,一条复杂任务轨迹可能写几百上千字 | 精修少量"金标轨迹"作为对齐参照 |
| 大模型合成+环境验证 | 可批量生产,成本可控,覆盖度高 | 有"教师模型偏见",弱基座抄不到强基座的推理过程 | 绝大多数团队的实际首选路线 |
我个人最推荐的组合是"大模型合成+环境验证"为主线,辅以少量真实日志精修。这里有个关键点:合成数据生成之后,不是拿去训练就完事,而是必须放到真实环境里跑一遍验证。轨迹里"想一想、调一个工具、看反馈"这些步骤是否真的能执行,环境说了算。跑不通的轨迹,不管文字写得再漂亮,都得丢掉或者截断重造。
我踩过最大的坑就是存侥幸心理,把教师模型生成的高质量文本轨迹直接拿去训练,结果模型学了一堆"用正确格式调用不存在参数"的幻觉行为。后来我才理解:Agentic SFT数据的“事实正确性”锚点在环境里,而不在文本里。一条轨迹只有真实执行成功过,才能作为正样本。
2.2 合成轨迹的完整生产流水线
我自己最后沉淀下来的一套批量生产流程,分成五个环节,每个环节都有值得注意的细节:
第一步,构造任务集。任务集决定数据的覆盖度,要刻意做"难度分层",不能全是简单单步调用,也不能全是变态的多步推理。我一般按"单步查询:多步规划:具身操作类"用6:3:1的比例铺。任务描述要写完整,包括上下文背景、用户目标、以及可用工具列表。
第二步,教师模型采样。把任务丢给教师模型,加上ReAct格式约束和工具schema,用不同温度并行采样。温度我喜欢在0.7到1.0之间打几个档位,低温拿到稳定保守路径,高温探索出一些"绕远路但最终成功"的轨迹,这类多样性能有效防止模型在训练后只会一条路走到黑。
第三步,环境回放验证。这一步是整个流水线的质检关卡。每条采样轨迹都必须真实执行,按这种标准打分过滤:执行完全成功、部分步骤失败但最终修正成功、执行失败。我通常只保留前两类,丢到训练集的比重大概是6:4——就算要保留"最终修正成功"的轨迹,也得确保轨迹里是模型自己发现了错误并走了修正路径,这是很宝贵的教学样本。
第四步,轨迹截断与对齐。很多轨迹在真正有用的信息到达之前,夹杂了大量"试探性"操作。截断要保留完整的"开头—过程—结尾"叙事结构,不能一刀切。我通常保留完整逻辑链,只在确实存在冗余时做精简,因为训练目标本来就是模仿完整决策过程。
第五步,去重与配比。轨迹去重不能靠文本完全一致,要用embedding做语义相似度去重,阈值设在0.85左右。配比环节在后面训练部分细说。
2.3 格式化里的几个隐蔽深坑
轨迹数据格式也是一大坑。现在实际上流行两套风格:一套是OpenAI函数调用的"消息数组"风格,每个tool消息带独立role和tool_call_id;另一套是开源社区常见的ReAct纯文本风格。在构造Agentic SFT数据时,我的建议是跟实际推理部署代码严格保持一致——训练时用什么格式,上线时就必须用什么格式。很多团队死在"训练用老式纯文本,上线发现新引擎不兼容"这种低级问题上。
格式化的另一个坑是特殊标记的数量控制。工具调用的开始、结束、参数块,都要用专用token包起来,数量别太多,控制在两到三个以内。我见过用四五个特殊标记的格式设计,各种嵌套,训练既有收敛速度问题,推理时还有解码稳定性隐患。这个"代码能跑、模型学不会"的典型场景,值得大家引以为戒。
3. 训练细节:格式、损失与超参的取舍
数据准备利索之后,训练本身反而像"搭积木"。但搭积木也有讲究,尤其是Agentic SFT这种"行为克隆"性质的训练,和普通指令微调在损失函数设计、样本组织方式上差别很大。
3.1 损失函数:别对思考过程一视同仁
传统的SFT对整个输出序列计算交叉熵损失。但在Agentic SFT里,轨迹里的文本是分角色的:有模型自己的思考、有工具调用、有环境返回的observation。它们一旦混在一起同等对待,模型就会把大量概率分配给"读observation和复述思考"这种语言建模任务,真正需要稳的动作输出反而学不扎实。
业界从AgentTuning等早期工作里总结出的一个有效做法是action-aware loss:只在"动作"相关token上计算损失,思考和观察部分要么直接mask掉,要么给一个极低的权重。我自己的实验也验证了这一点——采用动作掩码之后,工具调用的格式正确率从87%左右跳到了96%上下,代价是思考文本变得更短更干净,这其实是个意外收获。
实现动作掩码时要注意按token粒度对齐,别按字符或按消息粒度算错了,否则掩码错位会导致模型学得歪七扭八。我排查过一个诡异现象:模型能流畅输出动作,但参数名疯狂出错,查了两天,最后发现是mask漂移,把动作的右半边给盖住了。
3.2 数据配比:拒绝灾难性遗忘的底线
Agentic数据通常只占总训练数据的一部分。如果100%全是轨迹数据,模型原有的问答、写作、总结能力很快会退化。我目前常用的配比分三块:
| 数据类别 | 占比 | 作用 |
|---|---|---|
| Agentic轨迹数据 | 50%~60% | 学习工具调用与多步决策 |
| 一般指令数据 | 25%~30% | 保持基础对话和推理能力 |
| 工具schema/单步调用数据 | 10%~15% | 复习各工具的独立调用方式 |
| 纯话术/拒答数据 | 5% | 教会模型"不用工具也该回答问题" |
这个配比不是说死的,要看基座和Agentic数据的差异度。基座本身工具能力就强的话,Agentic比例可以降到40%,弱一些则要提到70%,但一般别超75%,除非你根本不在乎模型失去通用能力。另外,配比要在每个batch内随机混合,不要分阶段训练——我试过"先训智能体数据再训通用数据"的法子,结果模型把前面学的又还回去了,效果很差。
3.3 超参数与长序列训练的现实问题
Agentic SFT的样本普遍比较长,动不动就三四千token,多步轨迹可以上万。这带来两个直接问题:
- 学习率要更保守。我喜欢用1e-5到2e-5的区间,峰值学习率比普通SFT低一倍左右。原因很简单:轨迹数据里"经验密度"太高,学习率大了非常容易过拟合到轨迹的微观语言模式,而学不到决策结构。
- 训练轮数不宜多。普通SFT跑3到5个epoch很常见,轨迹数据我控制在1到3个epoch。超过3个epoch,验证集上格式正确率可能还在涨,但各种泛化指标开始掉——典型的过拟合信号,会被"格式学好了"这个表象掩盖。
处理长序列还有一个训练效率问题:如果按传统方式把每条样本补零到统一长度,计算浪费巨大。业界解决方法是packing——把多条轨迹按长度排序后拼接成一个超长样本,用attention mask隔开。注意拼接时要在frame边界处加padding和mask,否则模型会跨样本"串门",出现上一个样本的observation影响下一个样本决策的幻觉污染,这也是我实际踩过的坑。pack对提升吞吐量非常明显,我从每条独立训练改成pack训练之后,训练时间直接缩短了40%以上。
4. Agentic RAG和Agentic SFT的纠缠关系
现在社区热词里经常能看到Agentic RAG,我第一次看到这个词的时候愣了一下——RAG和Agentic SFT有什么关系?后来想透了:Agentic RAG是应用形态,Agentic SFT是它背后"智能"的训练来源之一。两者根本不是对立概念,而是上下游关系。
4.1 拆解Agentic RAG多出来的那点"智能"
传统RAG流程是固定的:用户问-检索-拼接-生成。它没有"选择题",不会根据问题复杂度调整检索策略,也不会判断检索结果够不够。而Agentic RAG引入的是自主决策:模型先判断这个问题需不需要检索,需要的话怎么拆成子查询,拿到结果后自己判断相不相关,不相关就改写查询再来一轮,相关就进入生成阶段。这个"判断—行动—再判断"的循环,本质上就是一个智能体行为,只是行动空间换成了检索工具。
关键问题是:这种复杂的决策模式,靠纯prompt能教会一个中号模型吗?我实测下来,7B到14B这个量级的模型,光靠提示词拿捏不住"多轮检索-判断"的稳定循环,经常出现检索完了不会判断、或者明知答案不够还要强行答的情况。反过来,如果用Agentic SFT把决策轨迹直接教给模型,同样的模型参数量下,行为稳定性会有非常显著的提升。这也是我认为Agentic SFT在近期最实际的一个落地点——它能让中小模型跑动Agentic RAG这类的复杂循环。
4.2 一个Agentic RAG训练数据的构造案例
假设我们要训练一个带"检索判断能力"的模型,Agentic SFT的数据设计可以这么拆:
把一次Agentic RAG的完整交互分解成路由阶段、查询改写阶段、相关性判断阶段、生成阶段。对应到SFT数据,每条样本都要包含这四个阶段的轨迹标注。比如:
用户提问:帮我对比一下A框架和B框架在长文本任务上的表现。 助手思考:这个需要外部知识,走检索,关键词拆分为【A框架长文本表现】和【B框架长文本表现】。 助手动作:search({"query": "A框架 长文本 性能", "top_k": 5}) 环境返回:[5条摘要] 助手动作:search({"query": "B框架 长文本 性能", "top_k": 5}) 环境返回:[5条摘要] 助手思考:两轮检索结果都拿到了,覆盖了对比维度,可以直接综合生成答案。 助手回答:A框架在……注意这里我特意设计了两轮检索,而不是一次检索就完事——这就是在教模型"复杂问题需要分解成多个子检索",是Agentic RAG和普通RAG最大的行为差异。实际构造时,还需要在数据里混入另一种负样本:用户问题本身已经足够清楚,模型调用检索函数后返回了一堆无关结果,模型学会"这轮结果不相关,换关键词再试一次"。
这种数据构造的工作量不小,但收益直接。我印象特别深的一个实验是:拿一套混合了"无需检索直接回答"、"单轮检索"、"多轮检索"三种类型的数据做Agentic SFT之后,模型在评测集上的"是否需要检索"判断准确率提升了接近20个点,而且最妙的是它学会了在答案已经齐全时主动停止检索,这一点在纯prompt版本里几乎做不到。
4.3 先想清楚Agentic RAG和SFT的边界
也不能把Agentic SFT神化成解决Agentic RAG的全部。要区分清楚:SFT负责教行为模式,不负责加工线上新知识。Agentic SFT训练完的模型,如果拿到一批出厂后新增的工具或知识库,它照样不知道怎么用——那是RAG或者工具库要去解决的实时性问题。换句话说,Agentic SFT教的是"怎么做决策",RAG负责的是"决策时拿什么数据"。两边配合才是完整方案。
还有一点容易混淆的地方:很多人以为Agentic RAG只要在prompt里加一句"你是个智能体,可以多次检索",就等于完成了Agentic改造。这个想法在强模型上确实能沾点边,但在资源和成本受限的场景,或者说对响应时延有严格要求的场景里,靠SFT把决策过程固化下来,无论从性能还是稳定性来说都更可靠。
5. 评估与迭代:怎么知道模型是真的会了
Agentic SFT最容易出现的幻觉是"训练loss很低,评测paper漂亮,一上真实环境就原形毕露"。原因很简单:轨迹数据里有太多"纸面上成功"的样本,模型可能在考试时背答案但没真正掌握决策能力。所以评估不能只看最终答案对没对,必须深入到行为层面。
5.1 离线评测:按层级拆解成功率
我自己习惯把Agentic评估指标拆成四个层级,每一层可以单独观测、单独定位问题:
| 指标层级 | 具体示例 | 观察重点 |
|---|---|---|
| 格式正确率 | 动作JSON合法、工具名匹配、参数schema正确 | 模型是否学到了"如何表达动作" |
| 单步决策正确率 | 给定状态,该调哪个工具、参数选得对不对 | 模型是否学到了"该做什么" |
| 路径效率 | 成功完成任务所用步数 vs 最优步数 | 有没有绕路、重复调用、无效搜索 |
| 任务成功率 | 最终是否达成用户目标 | 全局行为是否闭环 |
这四个指标经常出现矛盾信号,比如格式正确率高但任务成功率低,说明问题出在决策层面;任务成功率高但路径效率低,说明模型在硬闯,路径优化空间大。这种分层评估法的好处是,迭代时有明确的方向感,而不是面对一个笼统的"效果不好"发呆。
5.2 从失败案例倒推数据问题的三板斧
评测发现问题之后的修正路径,我一般走三板斧:
第一板斧:看错误类型分布。把所有失败轨迹按错误点打标,归类成"格式错误""工具不存在""参数不合法""检索结果未用""没判断完就收尾"等几类。如果某种错误占比超过30%,直接去数据里找到对应场景补样本,效果立竿见影。我遇到过"参数不合法"占35%的情况,补了800条相关轨迹后这个比例立刻腰斩。
第二板斧:看基座模型本身的"跳板能力"。有些决策错误不是SFT数据不够,而是基座模型压根没见过这种任务的中间状态,它理解不了"Observation返回的是键值对,下面该用哪个键做下一步判断"。这时候补轨迹作用不大,得考虑换更强的基座,或者在合成数据时故意加入更多的"观察解读"训练样本。
第三板斧:盯住泛化盲区。用一个没进训练集的新任务集做评测,看模型能不能把已学的工具调用模式迁移过去。如果训练集上任务成功率90%,新任务直接掉到30%,说明模型学的是"背路径"而不是"学策略"。规避方法是在合成数据时把任务描述做大量paraphrase,同一工具多换几种说法、多换几种组合路径,逼模型学工具的语义而不是背任务模板。
5.3 把"持续记录"做成团队资产
标题里有"持续记录"四个字,这个意识我觉得在评估环节特别重要。我现在的习惯是每次实验都建一个独立的实验记录文件,固定记录几样东西:基座型号与版本、数据配比与条数、损失mask策略、超参数、评测指标明细、以及我追加标注的"这次实验让我产生了什么新假设"。这个文件不光是给自己看的,团队里新同学进来之后,翻完记录就能避开我踩过的七八个坑,这种累积效应非常可观。
实验记录的一个关键细节是保留失败的trajectory快照。每次评测跑出的失败样例,我不只记一句"失败原因:参数错误",而是连当时的完整输入输出、工具返回都存下来。积累几百条之后再去聚类,你会发现很多失败模式在初次定位时看不到:它们往往是"组合型"的,比如"参数错误源于上一步思考不充分",单看快照根本发现不了。
6. 踩坑实录与现阶段的一些没想明白的事
这篇文章既然定位是"持续记录",最后就按我自己的习惯,把踩过的坑和还没想通的问题原样摊开。
6.1 常见问题速查表
| 现象 | 常见原因 | 我验证过的解决办法 |
|---|---|---|
| 工具调用格式崩,输出缺括号或参数名错 | 动作token没做掩码、数据量不足、特殊标记过多 | 改用action-aware loss,增加单步调用数据,精简格式标记 |
| 模型疯狂调工具,连"今天天气怎么样"都先查库 | 轨迹数据里"无需工具"样本太少 | 在配比中专门加入5%~10%的"直接回答"样本 |
| 模型总在第二步放弃,轨迹中途断掉 | 失败轨迹被错误标记为成功、数据结尾处理不当 | 重新校验轨迹执行结果,丢掉的捡不回来就重建 |
| 训练loss下降漂亮,上环境后表现拉胯 | 数据有采样偏置,环境验证环节没过关 | 每条正样本都真实跑一遍环境,并保留失败轨迹做对照 |
| 模型学会了工具调用但忘了写自然语言回答 | 配比失衡,通用指令数据太少 | 回退配比,把通用指令数据比例提到25%以上 |
| 长轨迹里"串门"污染,上一个任务的状态影响下一步 | packing时mask没加对 | 检查attention mask,每条样本边界补pad并重新mask |
6.2 我现在还没完全想清楚的问题
首先,Agentic SFT和强化学习的分工边界在哪里。短期看,SFT作为模仿阶段几乎不可少,但从更长期的角度,如果想让模型在训练数据覆盖不到的极端路径上也能稳住,单靠SFT的"模仿上限"肯定不够。下一步应该是SFT+偏好优化+强化学习的组合,但三者在数据配比、训练轮次上的最优配合,我还在实验。
其次,合成数据里的"教师偏见"问题。虽然环境验证能筛掉"执行失败"的轨迹,但没法筛掉"教师模型特有的思维惯性"。比如强教师模型习惯在观察足够时多做一轮"确认性检索",学生模型学到后会在线上环境里多浪费一步调用。怎么在数据合成时引入更多样的教师策略,我暂时没有好的解法。
最后是评估指标本身能不能被"刷"。任务成功率是终极指标,但单测任务成功率容易刷高,真实任务泛化又会崩。我最近在尝试"新任务成功率"和"路径效率"两个附加指标,感觉方向是对的,但还没有形成一套完整的判断标准。
6.3 现阶段我可以给出来的实操建议
基于目前这些实验记录,如果有人现在要启动Agentic SFT项目,我个人最想划重点的是:
先做小规模闭环,再谈大规模上线。不要一上来就铺十万条轨迹,先把几百条高质量数据、配合一个真实的工具环境,走完"数据生产-训练-评估-修正"整个闭环。这个闭环跑通之后,你才知道自己环境里哪类任务会是重灾区,然后再去扩充数据,成功率会高很多。
数据验证环节的成本不能省。无论是用API还是本地环境,轨迹合成了必须执行,执行不了就得返工。这个环节慢一点、贵一点都值得,它是数据质量的总闸门。
基座选型上要多留一个心眼。我发现Agentic SFT对基座的要求和普通SFT不完全一样:除了基础语言能力,基座自身的"结构化推理"能力更重要,同一个数据集在不同基座上的结果差异非常明显,不一定最强的基座效果就最好。值得做一轮小规模的基座筛选实验再定。
这篇记录写到这里,其实只是把现阶段能看明白的部分固化了。Agentic SFT这个方向还在快速变化,昨天觉得对的理解,明天可能就被新的实验推翻。但有一件事我越来越确定:不管前面还有什么新SOTA方案冒出来,"把行为决策过程变成可学习的监督信号"这个思路本身,一定会在这波智能体浪潮里长久占据核心位置。后续有新进展我会继续补充进来,也希望这篇记录能帮同行们少走几个我走过的弯路。