外观
Tool Calling 与 Function Calling:请求与执行
核心答案:Function Calling 通常指调用由应用定义、带参数 Schema 的函数工具;Tool Calling 是更宽泛的工具使用说法。 不同厂商可能把两者交替使用,不能强行说成两个互斥技术。OpenAI 的调用流程把模型请求与应用执行分开;Claude 的工具文档还区分客户端工具和厂商托管工具。
边界与数据
| 阶段 | 输入 | 输出 | 负责者 |
|---|---|---|---|
| 提供能力 | 工具名、说明、参数 Schema | 模型可见工具集合 | 应用 |
| 请求调用 | 任务和上下文 | 调用 ID、函数名、参数 | 模型 |
| 校验执行 | 调用请求、角色与版本 | 结果或分类错误 | 服务端 |
| 继续推理 | 调用结果及关联 ID | 后续调用或文本 | 模型 |
模型生成 make_audio 请求,并不意味着音频已经生成。供应商托管搜索等工具可能由厂商执行;本项目的图片、TTS 和 FFmpeg 工具由应用控制执行,不能套用“所有工具都在模型内部运行”的说法。
最小例子:模型请求没有执行权
python
allowed = {"writer": {"make_audio"}, "reviewer": set()}
request = {"name": "make_audio", "arguments": {"text": "你好"}}
def authorize(role, call):
if call["name"] not in allowed[role]:
raise PermissionError("tool_not_allowed")
if not isinstance(call["arguments"].get("text"), str):
raise ValueError("invalid_arguments")
return True
assert authorize("writer", request)
try:
authorize("reviewer", request)
except PermissionError:
print("评审角色不能制作素材")这段独立程序演示服务端权限门。它不是完整工具调度器,也没有声称调用真实 TTS。权限应来自可信服务端身份,不能让模型在参数中自称 role=writer 获权。
教材系统中的选择与替代
生成角色可以提出素材制作意图;审核角色只拥有其工作所需能力。服务端校验工具名、参数、内容版本和人工通过状态,再创建异步任务;worker 才调用外部接口。模型不负责重试退避、任务抢占与版本提交。
工具少且固定时,本地注册表足够。多个应用共享工具目录时才考虑 MCP;它不会取代权限检查。固定业务步骤也可直接调用程序函数,不必每一步都让模型“决定一次”。参见系统架构。
自测与故障判断
把示例角色改为 reviewer,必须拒绝;将 text 改为数字,必须出现参数错误。进一步说明为什么“提示词要求评审者不要调用图片工具”不能代替这两次校验。
排查工具调用失败时,先判断模型没有发请求、参数非法、权限被拒绝、任务未执行、供应商失败中的哪一层,再查看调用 ID 和任务 ID。不能看到 tool_call 就统计为素材成功。
官方资料与版本边界
- OpenAI Function Calling:请求、执行、结果回传。
- Claude Tool use:不同执行位置与术语语境。
核验日期:2026-11-03。Responses、Chat Completions 与 Messages API 的消息封装不同,概念可以比较,字段不可直接混用。真实能力需对项目配置的具体端点验证。