你问 AI:“北京今天天气怎么样?”
AI 回答:“北京今天晴,气温 22°C。” 听起来很准,但这是它编的:模型没有能力访问实时天气数据。
你又说:“帮我订一张明天去上海的机票。”
AI 回答:“好的,我帮你订好了。” 但其实什么也没发生:它只是生成了一段”听起来像做了事 ” 的文字。
Function Calling(函数调用)改变了这一切。它让 AI 真正 “动手做事”:查实时天气、操作数据库、发送邮件、订票。
本文要点
- Function Calling 的核心原理
- 从用户提问到执行完成的完整流程
- 工具定义的最佳实践
- 多工具协作和并行调用
- Computer Use:AI 操作电脑
- Function Calling 与 MCP 的关系
一、核心原理:LLM 做决策,应用做执行
一个关键认知:LLM 本身不会执行任何代码。它做的是两件事:决策和参数提取。
LLM 返回的是一段 JSON,描述 “调用哪个函数、传什么参数”。真正执行函数的是你的应用代码,不是 LLM。
类比一下:LLM 是指挥官,你的代码是士兵。指挥官下达命令 “查北京天气”,士兵去执行并把结果汇报回来。
二、完整工作流程
一次典型的 Function Calling 经历 7 个步骤。
Step 1:定义工具。 告诉 LLM 有哪些工具可用,每个工具的名称、描述和参数格式。
Step 2:用户提问。 用户发出请求。
Step 3:LLM 分析决策。 LLM 判断是否需要调用工具,提取参数,发现缺少必填参数时追问。
Step 4:执行工具。 应用代码调用实际的 API。
Step 5:结果返回。 把执行结果告诉 LLM。
Step 6:生成回复。 LLM 把工具返回的结果用自然语言呈现给用户。
三、工具定义最佳实践
工具定义决定了 LLM 能否正确理解和使用工具。
tools = [ { "type":"function", "function": { "name":"get_weather", "description":"获取指定城市的当前天气,返回温度、湿度和天气状况 ", "parameters": { "type":"object", "properties": { "city": { "type":"string", "description":"城市名称,如:北京、上海 " }, "unit": { "type":"string", "enum": ["celsius","fahrenheit"], "description":"温度单位,默认 celsius" } }, "required": ["city"] } } }]四条原则:
描述要清晰具体。 “获取指定城市的当前天气,返回温度、湿度和天气状况” 比 获取天气 好得多。LLM 靠描述理解工具用途。
参数要有明确约束。 用 enum 限制可选值,设置 required 必填参数,提供参数示例。
工具粒度要适中。 太粗(一个工具做太多事)→ 参数复杂,LLM 容易搞错。太细(工具太多)→ LLM 选择困难。一个工具做一件事。
错误处理要完善。 参数校验失败时返回清晰提示,工具执行失败时有 fallback,设置超时。
四、多工具协作
定义多个工具后,LLM 会根据用户意图自动选择调用哪个。
tools = [ {"function": {"name":"search_web","description":"搜索互联网获取实时信息 "}}, {"function": {"name":"query_database","description":"查询公司内部数据库 "}}, {"function": {"name":"send_email","description":"发送邮件给指定收件人 "}}]用户说:“帮我查一下上季度的销售数据,然后发邮件给销售总监。”
LLM 会自动规划执行顺序:先调用 query_database 查数据,再调用 send_email 发邮件。这已经有了 Agent 的雏形。
五、并行函数调用
2023 年底,OpenAI 推出了并行函数调用(Parallel Function Calling)。LLM 可以在一次响应中同时请求调用多个工具。
用户:"北京和上海今天天气怎么样?"
传统方式(串行): 第 1 轮:调用 get_weather(city="北京"),等结果 第 2 轮:调用 get_weather(city="上海"),等结果
并行方式: 一次返回两个调用: [get_weather(city="北京"), get_weather(city="上海")] 应用同时执行,一次返回两个结果并行调用减少了请求往返次数,响应速度更快。适合多个独立工具调用的场景。
六、Computer Use:AI 操作电脑
2024 年,Anthropic 推出了 Computer Use(计算机使用)功能,让 Claude 直接操作电脑界面。
原理:
这不是传统的 API 调用,而是让 AI 像人一样 看屏幕、点鼠标、打字。
应用场景:
- 自动化测试:模拟用户操作进行 UI 测试
- 数据录入:从一个系统复制数据到另一个系统
- 网页操作:填写表单、下载文件
当前局限: 速度较慢(每步需要截屏和分析)、偶尔点错位置、复杂操作链容易出错。但这个方向代表了 AI 工具使用的未来:不再需要 API,AI 可以使用任何有界面的软件。
七、Function Calling vs MCP
Function Calling 和 MCP(Model Context Protocol,模型上下文协议)都让 AI 使用工具,但解决的问题不同。
| 维度 | Function Calling | MCP |
|---|---|---|
| 定义方 | 每个应用单独定义 | 统一标准协议 |
| 复用性 | 每个应用重新写 | 一次接入,多个应用共用 |
| 类比 | 每个充电器配专属插头 | USB-C 通用接口 |
| 适用 | 简单场景、快速开发 | 生态建设、企业级 |
关系: MCP 是 Function Calling 的 “标准化升级版”。Function Calling 定义了 “AI 如何调用工具”的机制,MCP 定义了 ” 工具如何以标准方式暴露给 AI” 的协议。
选择建议: 如果只有一两个工具,直接用 Function Calling。如果要构建工具生态或对接多个 AI 应用,考虑 MCP。
图解
7.1 工具调用全景
┌──────────────────────────────────────────────────┐│ 工具调用能力演进 │├──────────────────────────────────────────────────┤│ ││ 2023 年中:Function Calling ││ └── LLM 调用预定义 API ││ ││ 2023 年底:并行调用 ││ └── 一次请求多个工具 ││ ││ 2024 年底:MCP 标准化 ││ └── 工具接入标准化协议 ││ ││ 2024 年底:Computer Use ││ └── AI 直接操作电脑界面 ││ │└──────────────────────────────────────────────────┘常见问题 FAQ
Q1:Function Calling 安全吗?AI 会不会乱调?
A:LLM 只是 建议 调用哪个函数。实际执行由你的代码控制。你可以加参数校验、权限检查和确认步骤。高风险操作(如删除数据)应加入人工确认环节。
Q2:所有模型都支持 Function Calling 吗?
A:主流模型都支持:GPT-4o、Claude 3.5、Gemini 2.0、DeepSeek V3、Qwen 2.5。不同模型的实现格式略有差异,但核心原理一致。
Q3:工具定义越多越好吗?
A:不是。工具太多会让 LLM 选择困难,准确率下降。建议控制在 10~20 个以内。如果工具很多,可以分组,先让 LLM 选组再选工具。
Q4:Function Calling 和普通 API 调用有什么区别?
A:普通 API 调用是程序员写代码决定 调用什么、传什么参数。Function Calling 是LLM 根据自然语言指令决定调用什么、传什么参数。核心区别在于 谁做决策。
小结
Function Calling 让大模型从 “只会说话” 变成 “能做事”。核心模式是:LLM 做决策(调用什么、传什么参数),应用做执行(真正调用 API)。
从基本的单工具调用,到多工具协作、并行调用,再到 Computer Use 直接操作电脑界面,AI 使用工具的能力在快速进化。
下篇预告
Function Calling 让 AI 能用工具,但每次都需要人来下指令。如果 AI 能自己规划任务、自己决定用什么工具、做完还能反思改进呢?
参考资料
支持与分享
如果这篇文章对你有帮助,欢迎支持作者或分享给更多人
部分信息可能已经过时






