并行工具调用 工具与循环
别名:
并行调用
模型在同一轮返回多个 `tool_calls`,这些调用之间相互独立。执行时可用 `Promise.all` 并发跑,但回填必须按 `tool_calls` 数组的原始顺序排列结果、按 `id` 一一配对 `tool_call_id`,否则第二轮模型看到的结果与它请求的顺序对不上。
它是什么
模型可以在同一轮返回多个 tool_calls——比如用户问「北京和上海天气怎么样」,模型一次请求两个 get_weather,参数分别是北京和上海。前提是这些调用之间相互独立:不需要任何一方的结果才能执行另一方。OpenAI 接口里可用 parallel_tool_calls 参数控制:默认允许(false 则强制每轮至多一个工具调用)。
执行与回填的纪律
并发执行用 Promise.all 即可,但有两条硬纪律:
- 顺序由数组决定:结果必须按
tool_calls数组的原始顺序排列,不能按「谁先跑完」排——Promise.all的结果数组本身保序,直接用下标对齐即可; - 配对由 id 决定:每条
role: 'tool'消息的tool_call_id与对应的tool_calls[].id一一配对,配错或漏配,第二轮模型就无法把结果与请求对上。
什么时候该禁用
并行调用省掉了几乎所有的等待时间(「一次问 5 个城市」靠的就是它),但同一工具的多次并行调用在某些模型/快照上可能不稳,官方文档对此有专门提醒。需要严格确定性(测试、判题)时,可以显式关掉并行退化为串行——串行永远可行,只是慢。完整实现见第 06 章。