Tool Calling 与 Function Calling 有何区别?
简单来说,Tool Calling(工具调用)是 Function Calling(函数调用)的进化版和超集。
在 OpenAI 的 API 演进过程中,Function Calling 是最早推出的概念,而 Tool Calling 是后来推出的新标准。目前,OpenAI 官方强烈建议使用 Tool Calling,而将 Function Calling 视为“遗留(Legacy)”功能。
以下是两者的核心区别详解:
1. 概念范围与灵活性 (Scope)
- Function Calling:
- 单一性: 主要是指模型调用用户自定义的外部函数。
- 局限: 它主要专注于“执行代码函数”这一件事。
- Tool Calling:
- 通用性: “工具”是一个更广泛的容器。目前,
function是tool的一种类型。 - 扩展性: Tool Calling 不仅支持用户自定义的函数(Function),还支持 OpenAI 内置的工具,如 Code Interpreter(代码解释器) 和 File Search(文件搜索/RAG)。
- 通用性: “工具”是一个更广泛的容器。目前,
2. 并行执行能力 (Parallelism) —— 这是最大的功能区别
- Function Calling:
- 单线程: 在一次对话轮次中,模型通常只能请求调用一个函数。
- 例子: 如果你问“波士顿和旧金山的天气怎么样?”,旧版的 Function Calling 可能需要往返两次(先问波士顿,得到结果后再问旧金山)。
- Tool Calling:
- 多线程(并行): 模型可以在一次回复中同时请求调用多个函数。
- 例子: 同样问“波士顿和旧金山的天气”,Tool Calling 可以一次性返回两个函数调用请求:
get_weather(Boston)和get_weather(San Francisco)。这大大减少了 API 的往返次数(Latency)。
3. API 结构 (Syntax)
在代码实现上,参数的名称和结构发生了变化:
Function Calling (旧版 API):
- 参数名:
functions - 结构:直接传入函数定义的列表。
- 指定方式:
function_call="auto"或指定具体函数名。
- 参数名:
Tool Calling (新版 API):
- 参数名:
tools - 结构:列表中的每个元素需要包含
type。目前通常是type: "function",然后把原来的函数定义包裹在function字段里。 - 指定方式:
tool_choice="auto"或指定具体工具。
- 参数名:
代码对比示例:
旧版 (Function Calling):
json
{
"functions": [
{
"name": "get_weather",
"description": "Get the weather",
"parameters": { ... }
}
]
}
新版 (Tool Calling):
json
{
"tools": [
{
"type": "function", // 明确指定类型
"function": {
"name": "get_weather",
"description": "Get the weather",
"parameters": { ... }
}
}
]
}
4. 总结对比表
| 特性 | Function Calling (旧) | Tool Calling (新) |
|---|---|---|
| 状态 | 已弃用 (Deprecated/Legacy) | 推荐标准 (Current Standard) |
| 并行调用 | 不支持 (通常一次一个) | 支持 (一次可调用多个) |
| 支持类型 | 仅限自定义函数 | 自定义函数 + 代码解释器 + 文件搜索 |
| API 参数 | functions, function_call |
tools, tool_choice |
| ID 管理 | 较简单 | 每个 Tool Call 都有唯一的 tool_call_id,用于精确匹配结果 |
结论
如果你正在开发新的 AI 应用:请直接使用 Tool Calling。
它不仅包含了 Function Calling 的所有功能,还解决了并行调用的问题,并且是未来接入更多内置 AI 能力(如联网搜索、绘图等)的标准接口。