KEEL · 龙骨 · A CURRICULUM FOR THE AI ERA

07. 多工具和流式调用怎样不乱? — keel 龙骨

掌握单次循环后,才进入两个更复杂的传输问题:一个响应里可能有多个工具请求,流式响应中的工具字段可能分批到达。

掌握单次循环后,才进入两个更复杂的传输问题:一个响应里可能有多个工具请求,流式响应中的工具字段可能分批到达。

多个请求不等于可以并发

相互独立的只读查询通常可以并发;依赖前一步结果、修改同一资源、需要审批或无法回滚的动作应保持顺序。并发是 Harness/Executor 的决定,不是看到多个 tool call 就自动 gather()。

每个调用都要独立关联

assistant.tool_calls[0] -> call-0 -> result-0
assistant.tool_calls[1] -> call-1 -> result-1

只有工具名称不够区分两个相同工具的调用。内部事件和结果必须保留独立 call_id、参数摘要和执行状态。

部分成功必须有明确语义

四个只读查询中三个成功、一个超时,Harness 要预先定义:是否把三个结果交给模型、是否等待重试、最终回答是否标记部分完成、哪个 deadline 控制整组调用。不能让模型从缺失消息里猜。

流式工具调用只能在完整后执行

flowchart TD
    A[chunk] --> B[累积 thinking/content/tool fields]
    B --> C{流结束?}
    C -->|否| A
    C -->|是| D[组装完整 assistant 消息]
    D --> E[协议与 schema 校验]
    E --> F[执行完整 ToolCall]
    C -->|失败/取消| G[保留事件,不执行半成品]

不要在只收到半个工具名称或参数时执行。流式 chunk 是增量传输,不是完整调用。

运行实验

python courses/foundation/tool-calling/course/project/examples/05_parallel_tools.py
python courses/foundation/tool-calling/course/project/examples/06_streaming_tools.py

运行前先预测:一个请求失败后,另一个请求是否还能返回?流中断后,部分文本是否能标记为最终答案?用输出和事件检查你的判断。

下一章:副作用工具怎样进入审批边界?

进入 keel 阅读