Function Calling 到底是什么?一张图讲清
很多人以为 Function Calling 是"模型会调用函数"。不是。
模型不会执行任何函数。它只会输出一段结构化文本:「我要调用
get_weather,参数是{"city":"Beijing"}」。真正执行的是你的代码。
Function Calling(工具调用)的本质就一句话:
把"让模型输出一段 JSON 工具请求"变成标准能力,然后由你的程序去执行、再把结果喂回去。
它没有改变上一篇的老朋友——那个循环:
用户提问
↓
[模型] 决定:直接回答?还是调用工具?
↓ 要调用
你的代码执行工具(查数据库、调 API、读传感器…)
↓
把结果回喂给模型
↓
[模型] 给出最终答复
三步,就这三步
① 你把"工具清单"告诉模型 —— 一张用 JSON Schema 写的说明书:
tools = [{
"type": "function",
"function": {
"name": "get_weather",
"description": "查询某城市当前天气",
"parameters": {
"type": "object",
"properties": {"city": {"type": "string", "description": "城市名"}},
"required": ["city"],
},
},
}]
② 模型决定调用哪个工具、带什么参数 —— 它输出的不是自然语言,而是一个结构化的 tool_calls:
{"name": "get_weather", "arguments": {"city": "Beijing"}}
③ 你的代码执行,再把结果喂回去,模型据此给出人话答复。
30 行跑通
(用 OpenAI 兼容接口,DeepSeek 也行)
import json, os
from openai import OpenAI
client = OpenAI(base_url="https://api.deepseek.com", api_key=os.environ["DEEPSEEK_API_KEY"])
def get_weather(city): # 你自己写的真函数
return {"Beijing": "晴 22°C", "Shanghai": "小雨 19°C"}.get(city, "未知")
TOOLS = [{
"type": "function",
"function": {
"name": "get_weather",
"description": "查询某城市当前天气",
"parameters": {"type": "object",
"properties": {"city": {"type": "string"}},
"required": ["city"]},
},
}]
def run(name, args):
if name == "get_weather":
return json.dumps(get_weather(args["city"]), ensure_ascii=False)
return "unknown tool"
def agent(q):
messages = [{"role": "user", "content": q}]
while True:
msg = client.chat.completions.create(
model="deepseek-chat", messages=messages, tools=TOOLS
).choices[0].message
messages.append(msg)
if not msg.tool_calls:
return msg.content # 没有工具调用 → 结束
for call in msg.tool_calls: # 执行工具 → 回喂结果
args = json.loads(call.function.arguments)
messages.append({"role": "tool",
"tool_call_id": call.id,
"content": run(call.function.name, args)})
print(agent("北京现在天气怎么样?"))
看,还是那个循环:问模型 → 跑工具 → 回喂。
三个常见误区
- "模型执行了函数" —— 没有。它只"说要调用什么",执行永远是你的代码;
- "必须用官方 SDK" —— 不必。Function Calling 只是约定好的 JSON 格式,你手写 HTTP 也能玩;
- "工具越多越好" —— 反了。工具越多,模型越容易选错。少而精、描述写清楚才对。
和 MCP 什么关系?
一句话:MCP = 标准化的 Function Calling。
- Function Calling 解决"模型怎么要工具";
- MCP 解决"工具怎么跨应用复用"(把工具变成独立进程)。
先懂这篇,再看 用 30 行看懂 MCP 就顺了。
为什么这对嵌入式重要
因为"工具"不只是查天气——它可以 读温度、控 GPIO、重启服务、刷固件:
给模型一张工具清单,它就能"操作你的设备"。
这就是"边缘 Agent"的起点:模型负责决策,工具负责碰硬件。下一篇我们聊怎么把 Agent 部署到 Jetson。
💬 你打算给 Agent 配什么工具?评论区聊聊。 🛠️ 需要嵌入式 / 边缘 AI / Agent 定制与咨询?见 关于页。
评论 0
还没有评论,来抢沙发~
登录 登录后即可参与评论