
现在做 AI Agent谁都离不开 Function Calling。看起来很简单给大模型几个工具定义它就会自己决定什么时候调用哪个工具。真做过项目的人都知道实际跑起来全是坑。我自己做了几个Agent项目踩了不少坑今天把最容易忽略的五个坑列出来给刚上手的朋友避避雷。坑一工具描述写得太模糊很多人写工具定义的时候就写个名字加个功能{ name: search_user, description: 搜索用户信息 }这种定义大模型根本不知道什么时候该调用。比如用户说我要查一下张三的订单大模型就懵了我是该调用search_user还是search_order它不知道。好的工具描述要写清楚这个工具是干什么的什么时候该用它什么时候不该用它每个参数是什么意思比如刚才那个search_user正确的描述应该是“根据用户姓名、手机号、用户ID查询用户的基础信息包括注册时间、会员等级。当用户需要了解某个用户的基本资料时使用当用户需要查询订单、余额、消费记录时不要调用本工具。”描述写得越清楚大模型选错工具的概率就越低。我们之前测过光是把工具描述写清楚工具调用准确率就从60%升到了90%。下面是工具描述对调用决策的影响流程模糊清晰用户提出需求大模型解析意图工具描述是否清晰大模型无法判断该调用哪个工具选错工具或拒绝调用大模型准确匹配工具正确调用工具并返回结果坑二参数格式经常错大模型调用工具的时候最容易犯的错就是参数格式不对数字参数给了字符串日期格式不对必填参数漏了枚举值给了不存在的选项这个真的没有太好的办法只能做参数校验。大模型传过来的参数先做一层JSON校验格式不对就直接告诉大模型“你传的参数不对xxx参数应该是数字格式请重新调用。”不要一看到格式不对就报错给用户看把错误信息返回给大模型让它自己重新生成它一般第二次就对了。下面是参数校验与重试的流程格式错误校验通过大模型生成参数JSON 参数校验把错误信息返回给大模型大模型重新生成参数调用工具返回结果给用户坑三大模型会循环调用同一个工具这个坑特别隐蔽比如用户问“今天天气怎么样”大模型调用了天气工具拿到结果之后不知道怎么回事又调用了一次然后又调用一次循环五六次才停下来。为什么会这样因为大模型看到天气工具返回了结果但它觉得自己还没完成任务就会反复调用。解决方法很简单加个调用次数限制同一个工具连续调用超过 3 次就强制结束把最后一次的结果给用户。不要让它无限循环下去白白浪费 token。下面是防止循环调用的流程否是大模型调用工具记录调用次数连续调用是否超过 3 次继续执行强制结束循环把最后一次结果返回给用户坑四工具太多大模型选不过来一开始做 Agent 的时候恨不得给大模型配十几个工具查用户、查订单、发邮件、查天气、查物流……结果发现工具一多大模型就乱了经常选错工具。这个问题也很真实大模型的上下文窗口是有限的你塞进去十几个工具定义占了几千个 token它就记不住每个工具是干嘛的了选错概率直线上升。解决方法工具超过 5 个的时候不要全部塞给大模型。先让大模型判断用户的意图根据意图只把相关的几个工具给它。比如用户问天气就只给天气和地图工具不要把发邮件的工具也塞进去。下面是按意图筛选工具的流程用户提出需求大模型判断用户意图根据意图筛选相关工具只把相关工具传给大模型大模型从少量工具中选择准确调用工具坑五不做错误重试大模型调用工具失败是常态不是意外。网络超时、接口报错、参数不对各种情况都可能发生。很多人写代码的时候工具调用失败就直接把错误返回给用户了。正确的做法是工具调用失败了把错误信息返回给大模型让它自己想办法解决。比如调用天气接口超时了就告诉大模型接口超时了请你告诉用户网络不好稍后再试或者换个方式回答。大模型自己就能处理大部分错误比你直接报错给用户体验好太多了。写在最后Function Calling 现在看起来很简单但真到生产环境里全是细节。你把这些坑都踩过一遍做出来的 Agent 才是真能用的不是demo级别的玩具。常见的错误类型及对应的处理策略如下网络超时调用接口迟迟没有响应直接报错给用户体验很差。处理策略把接口超时的错误信息返回给大模型让它告诉用户网络不太好、稍后再试或者换一种方式回答比如先给一个基于已有数据的临时答复。接口报错服务端返回 4xx/5xx 错误可能是服务不可用或权限不足。处理策略把具体的错误码和错误信息返回给大模型让它判断是换个参数重试还是提示用户稍后再试避免把原始报错直接甩给用户。参数格式错误大模型生成的参数类型不对、必填项缺失或枚举值非法。处理策略做一层 JSON 校验把哪个参数错了、应该是什么格式明确告诉大模型让它重新生成参数通常第二次就能通过。业务逻辑错误参数格式都对但业务上不成立比如查一个不存在的用户。处理策略把业务校验失败的原因返回给大模型让它换个查询条件或者如实告诉用户查不到而不是硬着头皮继续调用。