最近在做一个内部知识库的Agent,用Llama-3-8B做了LoRA微调,训练集是大概5000条指令数据,都是“根据文档X回答Y”这种格式。验证集loss降得挺好看,但一接到真实Agent工作流里就崩:工具调用参数经常编造不存在的键,或者直接跳过工具调用开始瞎编答案。我怀疑是不是微调时把工具调用的system prompt格式给稀释了?还是说需要把工具返回结果也拼进训练样本里?求有经验的大佬指点下,这种场景下微调数据该怎么构造才不破坏Agent原有的能力?
微调后的模型总在Agent任务里胡言乱语,是数据问题还是我姿势不对?
全部回复
共 30 条这情况太典型了,我去年搞客服Agent时也踩过一模一样的坑。你那个5000条“根据文档X回答Y”的指令数据,本质上是在教模型做闭卷问答,跟Agent需要的“先思考调哪个工具、再解析返回结果、最后组织答案”完全是两种肌肉记忆。验证集loss好看恰恰说明它在拟合你的数据分布,但工具调用的system prompt和few-shot示例在微调时很可能被当成普通上下文给冲淡了。我的经验是必须把完整的交互轨迹拼进样本里,包括工具调用的原始JSON、工具返回的模拟结果、以及基于返回结果的最终回复,让模型学会“看到工具描述→输出正确调用→处理返回值”这个闭环。另外你可以在训练数据里混入20%左右的通用Agent指令数据,比如ReAct格式的,防止灾难性遗忘。还有个容易忽略的点:微调时system prompt的模板要跟推理时完全一致,包括特殊token和换行,不然模型会学到错误的格式边界。建议先别急着加数据量,拿100条真实Agent轨迹做个小实验,看工具调用准确率能不能拉回来。
大概率是微调把工具调用的格式带偏了,建议训练数据里混入工具返回结果和system prompt,不然模型只学会了背文档。
我踩过一模一样的坑,验证集loss好看真不代表Agent能力保住了。你这种纯“文档问答”格式的微调,其实是在教模型忽略工具调用的system prompt,因为训练样本里压根没出现过工具定义和调用轨迹。建议把训练数据改成完整的多轮格式,把工具schema、调用结果、最终回答都拼进去,让模型学会什么时候该调、调完怎么用返回值。另外5000条里最好混一部分通用Agent轨迹,不然灾难性遗忘跑不掉。
训练数据里得混入工具调用的样本,光喂问答会把Agent能力冲掉。
微调数据里最好混入工具调用和返回结果的完整轨迹,光靠指令格式确实容易把Agent能力带偏。
验证集loss好看但Agent崩,大概率是训练数据里只有“问答对”没有工具调用的完整轨迹。你那些“根据文档X回答Y”的样本把模型往纯文本生成方向带了,工具调用的特殊token和参数格式根本没在微调里出现过,推理时自然就乱编键名。建议把工具调用前后的system、assistant tool_calls、tool返回结果拼成多轮样本混进去,比例别低于三成,不然原始能力会被冲掉。
5000条全是问答格式,工具调用肯定被冲掉了。建议掺点带函数调用的样本,不然模型根本学不会啥时候该停。
工具调用样本也得混进训练集,不然格式全忘了。
训练样本里没带工具调用轨迹吧?光教它答文档,它自然忘了怎么调工具,得把完整对话和工具返回拼进去。
5000条全是问答格式,工具调用能力肯定被冲掉了。建议混入一部分带工具返回的完整轨迹数据再训。