🔀 Function Calling 和 Tool Calling:到底啥区别
模型侧它俩是同一件事,但概念范围不同。拆清术语、演进、执行主体和三个易错点。
先记住:模型侧是同一件事
📖 官方口径直接说了
OpenAI 文档第一句就写:Function calling, also known as tool calling。
在模型侧,两者就是同一个东西——模型都只输出意图,不执行代码。
区别不在执行能力,而在概念范围。
🧩 Google / Anthropic 同口径
Google Gemini:模型能返回 functionCall JSON,但「不会自行执行函数,应用程序负责处理」
Anthropic:模型从不自己执行任何东西,只 emit 结构化请求,你的代码跑操作、把结果塞回对话。
那差异到底在哪?概念范围
| 维度 | 🧠 Function Calling | 🛠️ Tool Calling |
|---|---|---|
| 定位 | 早期/狭义:模型输出「调哪个函数 + JSON 参数」 | 现代/广义:工具箱里选工具 + Agent 循环 |
| 范围 | 函数是工具的一种 | 函数、搜索、代码执行、MCP 都是工具 |
| API 形态 | functions / function_call(老 API) | tools / tool_choice / tool_calls(新 API) |
| 并行/多类型 | 主要单个函数 | 支持并行 tool_calls + 多工具类型 |
| 执行主体 | 模型侧不执行 | 模型侧也不执行,是应用/框架/平台跑 |
「升级」是概念升级,不是执行升级。
历史上 OpenAI 最早叫 functions / function_call,后来改成 tools / tool_calls。
老 function calling 主要表达「我能调一个函数」;新 tools 是一个更大的概念——function 是 tool 的一种,tool 还可能有 code interpreter、retrieval、web_search、MCP、custom tool 等。
原来
模型只能说「我要调这个函数」
现在
模型说「我用工具箱里的某个工具」
本质
「函数」太窄了——改数据库不是函数?搜网页不是工具?MCP server 不是工具?所以行业往 Tool / Tool Calling 这个更大词汇归一。
执行主体:四个「执行」别混成一层
⚠️ 错觉从哪来
「tool calling 真执行、function calling 只输出参数」这个错觉,来自把三层「执行」混成一层。
真拆开,执行主体有好几个。
🧑💻 谁在真执行?
• 你的代码:收到 tool_call 后跑函数
• 框架(LangChain 等):包了 executor
• 平台 server tool:Anthropic 服务端执行
• 模型本体:永远只出意图,不执行
准确版本,焊死这句:
Function Calling 是早期/狭义说法——模型输出「调哪个函数 + 啥 JSON 参数」。
Tool Calling 是现代/广义说法——模型在「工具箱」里选工具,输出 tool call;再由应用/Agent 循环去执行、回传、继续推理。
两者在模型侧都不执行代码;执行代码的是你、框架、或服务商 server tool。
一条链路全打通
OpenAI 官方 tool calling flow 就是这五步:Make request with tools → Receive tool call → Execute code on app side → Send tool output back → Receive final response。
Anthropic 也是经典 agentic loop:模型 stop_reason: tool_use → 你执行 → 你 tool_result 塞回去 → 继续 loop。
保留精华、修掉 bug
对的部分
Tool Calling 确实是 Function Calling 的概念/生态升级——functions → tools、单函数 → 多工具 → Agent loop、模型只吐 JSON → 框架帮你做成可调用的 Tool 抽象。
要修的部分
不是「Tool Calling 里模型执行了代码」。准确说 Tool Calling 指整套工具使用系统:模型决策 + schema + runtime executor + result feedback + agent loop;Function Calling 指模型生成函数调用 JSON 这个机制。
终极一句话
模型永远只产结构化意图,真正摸数据库的永远是你的代码 / 平台沙箱。
Function Calling 和 Tool Calling 在模型侧是同一件事(官方口径 also known as tool calling),差异在概念范围:FC 是早期/狭义说法(模型输出调哪个函数 + JSON 参数),Tool Calling 是现代/广义说法(工具箱选工具 + Agent 循环)。两者模型侧都不执行代码,执行的是你的应用、框架或平台 server tool。
在模型侧它俩其实是同一个东西,OpenAI 文档直接写 Function calling also known as tool calling,模型都只输出意图不执行代码。区别在概念范围:Function Calling 是早期狭义的说法,指模型输出调哪个函数加 JSON 参数;Tool Calling 是现代广义的说法,指模型在工具箱里选工具,再加 Agent 循环去执行回传。函数是工具的一种,工具还可以是搜索、代码执行、MCP。
不会。这是个常见误区。模型永远只输出一个结构化的调用意图,真正执行的是我们的应用代码、框架,或者平台的服务端 tool。比如 LangChain 把 @tool 装饰器、schema、executor、结果回传全包了,你写 agent.invoke 它自动完成调用,看起来像模型会执行,其实是框架帮你写了 if tool_calls 的循环。Anthropic 的 server tool 是官方白名单能力,但那也不是 Claude 本体跑你业务代码。
这是一个概念升级。最早 OpenAI 的 API 是 functions 和 function_call,主要表达我能调一个函数;后来改成 tools、tool_choice、tool_calls,因为函数太窄了——改数据库不是函数、搜网页不是工具、MCP server 也不是函数。新的 tools 是一个更大的概念,function 只是 tool 的一种,tool 还可能有 code interpreter、retrieval、web_search、MCP、custom tool。所以整个行业在往 Tool / Tool Calling 这个更大的词汇归一。