大模型本身只会生成文字,查天气、读文件、发消息这些实际动作,都靠工具调用完成。AI 智能体的每个实际动作,都要走一条从「模型决定调用」到「框架执行」再到「结果回传」的完整链路。把这条链拆开看,很多怪现象就有了答案。
模型决定调用,框架负责执行
先纠正一个常见误会:模型不直接执行任何工具,它只输出「我想调用某工具、参数是什么」的声明,真正执行的是外层的框架程序。模型负责决策,框架负责动手,两者分工明确。
流程是这样转的:系统提示词里附上工具清单,包括每个工具的名字、用途、参数格式;模型读完当前对话,如果判断需要外部信息或动作,就输出一段结构化的调用请求;框架解析这段请求,校验参数,然后去真的执行。
一次调用的完整旅程
第一步,出参数:模型按工具定义填参数,比如搜索工具要填「查询词、条数、时间范围」。第二步,校验:框架检查参数类型对不对、必填项全不全,不合格就打回去让模型重填。第三步,执行:框架按参数调用真实工具,拿到原始返回。第四步,回填:执行结果被格式化后,作为一条「工具消息」插回对话历史。
这条链上每一步都可能失败,参数错、工具超时、返回超长,所以框架要为每一步准备兜底动作,而不是让异常直接炸掉整个任务。
四步依次过手,坏起来的方式各不相同。
| 步骤 | 谁在做 | 具体动作 | 这一步会怎么坏 |
|---|---|---|---|
| 出参数 | 模型 | 按工具定义填参数,如搜索工具填查询词、条数、时间范围 | 参数错,比如日期填成「昨天」 |
| 校验 | 框架 | 查参数类型对不对、必填项全不全 | 不合格被打回,模型重填 |
| 执行 | 框架 | 按参数调用真实工具,拿到原始返回 | 工具超时 |
| 回填 | 框架 | 结果格式化后作为「工具消息」插回对话历史 | 返回超长,塞不下 |
结果怎么递回模型手里
工具返回的东西未必适合直接塞给模型:可能是一万行的表格,可能是一段带噪声的网页文本。通常要先加工——截断、提炼、转格式——再交回模型。模型读到的是加工后的结果,据此决定下一步:继续调用、换个思路,还是开始组织最终回答。
这就是为什么同一个工具在不同智能体里效果差很多:差的往往不是工具本身,而是返回结果被消化的方式。通义千问、文心一言等助手接插件时,返回内容的裁剪策略直接影响回答质量。
参数填错的两种兜底
模型偶尔会填错参数:把日期填成「昨天」而不是具体日期,把不存在的工具名写进去。兜底有两种路子。硬校验:框架定义参数的格式和取值范围,不合格直接返回错误说明,让模型看着报错重填,通常第二次就对了。软提示:在工具描述里写清「日期必须为 YYYY-MM-DD 格式」,从源头减少错误。
两种路子配合用效果最稳:描述写得细,校验守底线。用扣子(Coze)搭工作流时,插件参数说明写完整,调用失败率会明显下降。
调用失败之后走哪条路
执行失败不代表任务终止。框架可以原地重试、换备用工具、或者把失败信息如实告诉模型让它调整计划。走哪条路应该在框架层预先定义好,而不是每次临时决定。调用记录全部留痕,方便事后回看每一步的参数与返回。
工具调用链路五步
- 模型按工具清单输出结构化调用声明
- 框架校验参数,不合格退回重填
- 框架执行真实调用,返回原始结果
- 结果加工后作为消息插回对话
- 模型据此决定下一步动作
排查调用问题时,沿这五步走一遍,卡在哪一步就查哪一步的记录。
相关词条:失败后的补救路径,见什么是失败补偿?做一半怎么收场;调用前的步骤从哪来,参考任务规划是怎么生成的?先列提纲;返回结果如何被消化,见观察结果是怎么被消化的?关键步骤一次讲清;整条链何时收口,看循环是怎么退出的?完成判据,从原理到落地。
关于工具调用,问得最多的三个
- 一次能同时调用多个工具吗?:可以。没有依赖关系的调用并行发出更省时间,有依赖的必须串行,框架会按声明里的顺序处理。
- 工具越多模型越强吗?:不是。工具清单太长反而稀释模型注意力,挑高频常用的挂上,清单精简往往效果更好。
- 模型会乱编一个不存在的工具吗?:偶尔会,尤其清单刚改过。框架对未知工具名直接返回错误并附上可用清单,模型自我纠正得很快。


