跳到正文
Elaine Blog
返回

一次工具调用怎样完成:执行循环、结果回填与多工具协作

更新于:
Tool Calling 与 MCP

模型返回了 get_order(A1042)。应用查询成功后,如果直接把 JSON 展示给用户,一次工具执行已经完成,但一次完整的助手回答还没有完成。应用通常需要把结果交回模型,让它结合问题继续判断。

工具循环管理这种往返:请求模型、识别调用、校验执行、回填结果,再请求模型。每轮都可能产生新的信息,也可能失败,因此循环需要明确状态和终止条件。

从一条调用轨迹开始

用户询问退货运费,第一轮模型请求查询 A1042;结果包含签收十天、质量尚未核实。第二轮请求政策,返回三十天内且经核实的条件;第三轮生成条件性回答。

这个过程不是让模型一次性写出完整执行脚本。每次新结果进入下一轮上下文,模型才有机会根据已经得到的信息选择下一步。若订单不存在,第二步就不应该假装查到了订单类别。

tool_loop.py下载 用预置轨迹演示这个循环,方便观察消息变化。固定轨迹不是模型推理,真实版本另在模型接入文件中实现。

回填为什么需要调用 ID

假设模型同一轮提出两个独立查询:订单状态 call-A 与库存状态 call-B。库存先返回,订单后返回。若按完成顺序与原数组顺序配对,两个结果就会被交换。

应以 call ID 为键保存执行结果,再按模型协议生成回填消息。一些接口还要求先保留包含调用的 assistant 消息,再紧接工具结果;不能只塞一段自然语言“订单结果是……”并丢掉协议关联。

MCP 请求 ID 则属于另一层。一个模型调用经适配器形成 MCP 请求,适配器保存映射即可,不必强求两个 ID 相同。请求重试与多轮补充输入还可能产生多个协议往返。

并行成立的条件是什么

查询订单签收时间和读取不依赖订单类别的通用说明可以独立进行。如果适用政策查询需要先知道商品类别和购买日期,就必须先取得订单结果。

即使两个工具都只读,也可能受同一后端速率限制;即使都声明 concurrencySafe,也不保证业务快照一致。执行器需要配置并发上限,并决定是否要求共同版本或读取时效。

写工具不能仅因参数不同就并行。同一订单两次退款可能竞争剩余额度,需要业务服务在事务或条件更新中约束。并发调度解决吞吐,业务层解决合法性。

流式参数什么时候才完整

一个工具参数可能分成多段到达:{"order_id":"A1042"}。前两段不是完整 JSON,不能执行,也不应通过补括号猜测剩余内容。

应用按调用索引或 ID 累积片段,收到接口定义的完成事件后再解析和校验。如果流中断,即使当前字符串碰巧可以解析,也不代表调用已正式完成。

配套 streamed_arguments.py下载 使用人工片段展示缓冲、大小限制和完成状态。它不连接真实模型流;供应商事件格式由适配层转换成统一事件,正文不会把教学字段当成所有 API 的标准。

执行器面对错误怎样回填

未知工具名应拒绝分发,不能用 eval() 或动态导入猜测实现。参数错误可以返回具体字段与要求,允许模型在有限预算内修正。权限拒绝不能触发不断尝试其他订单 ID。

业务结果如“订单不可用”可回填为受控错误,方便模型解释缺口。未知异常则内部记录 trace,对模型只返回安全的故障码,避免堆栈和访问令牌进入上下文。

模型收到错误后可能仍然继续请求相同调用。执行器需要记录重复意图、错误次数与总预算,到达阈值时停止,并明确说明哪一步未完成。

循环什么时候结束

正常终止是模型返回符合当前任务的最终回答;异常终止包括轮数、工具次数、总时长或费用预算耗尽,用户取消,以及关键权限或数据缺失。

这些上限应由程序检查。Prompt 中“最多三次”有提示作用,但不能替代循环条件。每轮最多一个工具与每轮最多十个工具,总成本完全不同,模型轮数和工具次数应分别统计。

如果生成因为输出限制被截断,不能把残缺内容当作完整答复。真实 API 适配器需要检查停止原因;本系列接入示例对非预期停止状态明确报错,避免假装任务成功。

总时间预算还要传递给下游。一个剩余两秒的任务不该给工具新开三十秒超时。超时是否能真正停止底层工作,又是下一篇需要解释的问题。

ReAct 与固定工作流的关系

ReAct 可以理解为推理与行动交替的任务组织方式,但不要求应用取得或展示模型的私有思维链。工程上需要的是可观察的工具请求、结果和停止决定。

若流程确定为查订单、生成草稿、等待批准、提交,状态机就能表达关键顺序。模型可以协助理解问题和填写草稿,不必决定是否绕过审批。

开放式故障诊断可能需要根据结果改变下一步工具,适合在受控边界内让模型选择。两者可以结合:自由查询阶段结束后,进入固定的审批和执行流程。

回填什么也属于上下文工程

工具返回几千行日志,不应该无条件全部追加。可以保留当前所需字段、来源版本和受限原文引用,但不能压掉影响下一步的错误状态或适用条件。

回看 上下文生产模块,工具运行时产生结果,上下文模块选择和组织结果,模型适配器遵循消息协议。职责明确后,某次错误更容易定位在执行、选择还是生成阶段。

继续阅读

上一篇:怎样设计一个好用的工具:名称、参数、结果与业务契约

下一篇:工具调用失败以后:超时、重试、幂等与取消

下载文件、依赖与运行边界见配套指南下载


分享这篇文章:

上一篇
怎样设计一个好用的工具:名称、参数、结果与业务契约
下一篇
工具调用失败以后:超时、重试、幂等与取消