ArcLibrary

Function Calling (函数调用)

AI 连接外部工具的底层协议 —— 输出 JSON,由本地执行。

ToolsFunctionCalling
核心 · Key Idea

一句话:Function Calling 让 LLM 不再只能输出文字 —— 它可以输出一段「结构化的工具调用 JSON」,由你的程序去真正执行(查天气、调 API、查数据库),再把结果回喂模型。

是什么#

你提前告诉模型「我有这些工具可用」:

{
  "name": "get_weather",
  "description": "查指定城市的天气",
  "parameters": {
    "type": "object",
    "properties": {
      "city": { "type": "string", "description": "城市拼音或名字" }
    },
    "required": ["city"]
  }
}

模型决定要调用时,不直接说话,而是输出:

{
  "tool_calls": [
    { "name": "get_weather", "arguments": { "city": "Beijing" } }
  ]
}

你的程序看到这段 JSON,真的去调 get_weather("Beijing"),把返回 "26°C, 多云" 拼回给模型,模型再用人话回答用户。

打个比方#

打个比方 · Analogy

没有 Function Calling,模型像个只会动嘴的客户:「你帮我查一下天气吧」。
有了 Function Calling,它像个会下单的客户:「给我执行 get_weather(city="Beijing")」 —— 程序按订单办事。

关键概念#

Tool Definition工具定义
name + description + JSON schema 参数 —— 喂给模型的「工具说明书」。
Tool Call工具调用
模型输出的结构化 JSON,告诉运行时该调哪个工具、传什么参数。
Tool Result工具结果
你的程序执行后返回的内容,作为新一轮 prompt 喂回模型。
Parallel Tool Calls并行调用
现代模型能一次输出多个独立调用,运行时并发执行后一起回喂。

怎么工作#

模型负责「决策」,运行时负责「执行」 —— 这是 Agent 的根基。

实操要点#

  • 工具描述要写工具的 用途:「查天气」不如「根据城市名查询当日天气,用于回答用户出行建议」 —— 模型选工具的准头几乎全在这里。
  • 参数 schema 要严:枚举值用 enum、必填用 required、格式用 pattern —— 模型几乎不会乱填。
  • 失败要返回结构化错误:不要 throw,而是返回 {error: "city not found"},模型才能根据错误改参数重试。
  • 并行执行省时间:现代 SDK 支持一次 N 个工具调用并发,比串行快几倍
  • 别给太多工具:> 20 个工具时模型选错率飙升。先做意图分类,再路由到该领域的工具子集

易混点#

Function Calling
每个产品**自定义的工具 schema**。
模型 ↔ 工具是 1:1 绑定。
MCP
**跨产品的标准化协议**。
任意 MCP server 都能即插即用。
Function Calling
**底层协议**:模型层面的 JSON 输出。
Plugin / Action
**应用层封装**:ChatGPT Plugin / Action 都是 Function Calling + 商店分发。

延伸阅读#

  • MCP —— Function Calling 的「USB-C 化」
  • Skills —— 把若干工具打包成「能力」
  • Code Interpreter —— 模型执行任意代码的特殊「工具」
  • ReAct —— 在循环里反复调用 tool 的范式