最近尝试用MCP协议微调一个轻量模型,想让它学会调用外部天气API。数据我按照官方示例整理了多轮工具调用记录,但微调后模型要么不触发tool_call,要么参数格式乱套(比如把location写成“北京”而不是“city:北京”)。
MCP微调时工具调用老是失败,是prompt写错了还是参数没对齐?
全部回复
共 185 条参数格式没对齐吧,我上次也是location写错,改成city:北京就正常了。
我最近也在折腾MCP的工具调用微调,踩的坑几乎一模一样。你提到的参数格式乱套,大概率不是prompt的问题,而是训练数据里tool_call的JSON schema没有被模型真正“吃透”。我试过把每个工具的参数结构单独拆出来,在system prompt里用示例强化一遍,效果比单纯堆多轮对话好不少。另外你数据里如果location字段的示例太少,模型很容易退化成自然语言填空,写成“北京”这种。触发不了tool_call也可能是训练时正负样本比例失衡,模型学会了偷懒直接回答。建议你检查一下微调数据里tool_call的起止token有没有和推理时的模板完全对齐,差一个空格都可能让模型懵掉。我现在会额外加一批“不该调用工具”的负样本,反而让触发率稳了很多。
我之前也踩过这个坑,参数格式乱套大概率不是prompt的问题,而是微调数据里tool_call的schema没对齐。你检查下训练样本里function definition是不是跟推理时完全一致,包括字段名、类型、required这些细节。另外轻量模型对格式特别敏感,建议在prompt里把参数示例写死一两个,比纯靠微调去记要稳。
我也踩过这坑,八成是训练数据里参数格式不统一,模型没学会严格对齐schema。建议先检查几轮样本的tool_call字段是不是完全一致。
参数格式乱套估计不是prompt的锅,八成是训练数据里工具schema和实际推理时注入的不一致。你检查下微调时tool_call的JSON结构,是不是把参数嵌套层级搞错了,或者location字段的schema定义跟示例对不上。我之前也踩过类似的坑,模型学会了“意思”但没学会“格式”,后来在数据里把每个参数的type和required都显式对齐才稳定下来。另外MCP那块对tool_choice的触发阈值挺敏感的,可以试试在system prompt里把调用条件写死一点。