大模型 Function Calling 调用失败率高,你怎么排查?
面试怎么回答
我会先从 Trace 里抽样,把失败分成没调用直接编答案、选错工具、参数错误、结果没用好、工具本身失败、循环调用几类,看哪类占比最高。然后按类型找原因:没调用多半是提示里没要求数据必须走工具、或者工具描述没写清楚能回答什么;选错工具是工具太多太相似;参数错误是类型太宽松、格式没说明、ID 从上下文拿不到;工具失败要看错误信息是否可读可行动。修复包括改描述、合并工具、参数用枚举和严格模式、精简返回、改写错误信息、加步数上限。最后把失败案例做成评测集,每次改动跑回归,看工具选择准确率、参数正确率和任务完成率。
先把这段讲顺;面试官追问时,再展开下面的原理和细节。
详细讲解
上线了一个能调工具的 AI 助手,监控显示工具调用的失败率有 15%:有的选错工具,有的参数填错,有的根本没调用就直接编了答案。面试官问这题,想看你能不能像排查数据链路一样,把失败分类、定位、逐个解决。
第一步:把失败分类
从 Trace 和日志里抽样,把失败分成几类:
- 没调用:应该调工具却直接回答,往往是编造数据;
- 选错工具:调了功能相近但不对的工具;
- 参数错误:格式不对、必填缺失、取值越界、ID 是编的;
- 调用成功但结果没用好:工具返回了,模型理解错了或者没用上;
- 工具本身失败:超时、限流、后端报错;
- 循环调用:同一个工具、同样的参数反复调用。
先看哪类占比最高,优先解决。
第二步:按类型定位原因
- 没调用:系统提示有没有明确要求「涉及数据必须通过工具获取」?工具描述是不是没说清楚它能回答什么?
- 选错工具:工具是否太多、太相似?描述里有没有写清楚边界和区别?
- 参数错误:参数类型是否宽松(字符串代替枚举)?日期、ID 的格式有没有说明和示例?需要的 ID 模型是否能从上下文中拿到?
- 结果没用好:返回的数据是不是太大、字段名太晦涩、缺少单位和口径说明?
- 工具失败:错误信息是否返回给了模型?是不是可读、可行动的?
- 循环:有没有步数上限和重复调用检测?
第三步:修复
- 改工具描述,加「何时使用」「何时不用」;
- 合并相似工具,减少每次加载的工具数量;
- 参数用枚举和严格类型,开启结构化输出或严格模式;
- 工具返回精简,带口径说明;
- 错误信息写成「哪里错了、应该怎么改」;
- 加步数上限和重复检测。
第四步:用评测集回归
把失败的案例整理成评测集,每次改动后跑一遍,统计工具选择准确率、参数正确率、任务完成率。不要凭几个案例的感觉判断好坏。