最近在做一个法律咨询方向的Agent,用Qwen2.5-7B在大概3000条指令数据上做了LoRA微调,任务是让模型根据用户问题输出结构化的JSON,包含法条引用和回答两部分。单轮测试的时候格式还挺稳定的,但一接进Agent框架,多轮对话加上工具调用之后,模型就开始乱来了,有时候直接输出一大段自然语言,JSON完全不见了。我试过调temperature到0.1,也在prompt里加了格式约束,但效果都不太理想。想问问大家,这种情况是微调数据的问题,还是Agent那边prompt设计的问题?有没有人踩过类似的坑?
楼主
23天前
微调后的模型接入Agent总是不按格式输出,是我哪里做错了吗?
请 登录 后发表回复
全部回复
共 2 条
2楼
22天前
这个坑我踩过,而且踩得还挺深的。单轮表现好不代表多轮下还能稳住,因为Agent框架会在你的prompt前面塞一堆system message、工具描述、历史对话,模型的注意力早就不在你那点格式约束上了。你调temperature和加prompt约束治标不治本,模型看到几千token的上下文,那个JSON格式的“惯性”很容易被冲散。我建议你先排查一下微调数据里有没有多轮场景的样本,如果3000条全是单轮指令,那模型根本没学过在嘈杂上下文里保持格式。另外工具调用那一步特别容易破坏输出结构,很多框架会把工具返回结果直接拼进对话,模型分不清该接着输出JSON还是该说话。你可以试试在每轮assistant输出前强制加一个格式token或者用grammar-constrained decoding,比如vLLM的guided decoding或者outlines,比调prompt靠谱得多。还有一个小经验,把格式约束从prompt里挪到system message最开头,比放在末尾有效,因为很多模型对开头指令的服从度更高。最后建议你单独测一下纯多轮但没工具调用的场景,看是不是工具调用本身触发的崩溃,这样能快速定位到底是微调数据的问题还是Agent拼接逻辑的问题。
3楼
18天前
这个坑我踩过,大概率是Agent框架的多轮拼接把微调时的格式分布带偏了。LoRA学到的JSON模式其实很依赖prompt结构一致,工具调用一插进来,历史消息和system prompt一变,模型就懵了。建议先固定住system prompt和输出模板,把工具返回也包成统一格式再喂回去,看看单轮和多轮是不是同一套上下文。另外3000条数据里如果混了带工具调用的样本,最好单独标出来做对比测试。