AI 通关攻略 · 第 6 关 | Function Calling:让 AI 从"会说话"进化到"会做事"
故事从一个问题说起
LLM 本身只能输出文本。但在实际应用中,我们经常需要:
- 查询数据库返回准确数据
- 执行代码得到计算结果
- 发送邮件、创建日历事件
- 调用第三方 API 获取实时信息
Function Calling 就是让 LLM 能够"调用函数"的技术。 它是 Tool Calling 的一种具体实现方式。
1. 什么是 Function Calling?
Function Calling(函数调用)是一种让 LLM 生成结构化指令的技术。
具体来说:
- 开发者预先定义好函数的名称、参数格式(schema) 和功能描述
- 用户提问时,LLM 判断是否需要调用某个函数
- 如果需要,LLM 生成符合 schema 的参数(不是普通文本,而是结构化的 JSON)
- 系统执行函数,把结果返回给 LLM
- LLM 整合结果,再生成最终回答
类比:LLM 就像一个只会说话但不会做饭的厨师。Function Calling 就是给这个厨师配了一个厨房——厨师说出"需要切菜",厨房就自动切好菜递给他。
2. Function Calling 的工作流程
完整流程图
用户提问
↓
LLM 判断:这个问题需要调用函数吗?
↓
[不需要] → 直接生成文本回答
[需要] → LLM 生成函数名 + 参数(JSON)
↓
系统执行函数,获取结果
↓
把函数结果作为上下文返回给 LLM
↓
LLM 整合结果,生成最终回答
具体例子
用户问:"北京今天的天气怎么样?"
Step 1:假设我们给 LLM 提供了一个 get_weather 函数:
{
"name": "get_weather",
"description": "获取指定城市的实时天气",
"parameters": {
"type": "object",
"properties": {
"city": {
"type": "string",
"description": "城市名称"
}
},
"required": ["city"]
}
}
Step 2:LLM 理解问题,生成调用:
{
"name": "get_weather",
"arguments": {
"city": "北京"
}
}
Step 3:系统执行函数,得到结果:
{
"city": "北京",
"weather": "晴",
"temperature": "18°C",
"humidity": "45%"
}
Step 4:LLM 整合结果,生成自然语言回答:
"今天北京天气晴朗,气温 18°C,湿度 45%,比较舒适。"
3. Function Calling vs Tool Calling
很多人容易混淆这两个概念:
| 对比项 | Function Calling | Tool Calling |
|---|---|---|
| 定义 | LLM 生成结构化函数调用的技术 | 更广义的概念,任何让 LLM "使用工具"的技术 |
| 范围 | 是 Tool Calling 的一种具体实现 | 包含 Function Calling + 其他工具调用方式 |
| 本质区别 | LLM 输出的是符合 schema 的 JSON | 可以是 API 调用、代码执行、文件读取等任何形式 |
简单理解:Tool Calling 是"使用工具"的总称,Function Calling 是"生成函数调用"的具体技术。Function Calling 是 Tool Calling 在 LLM 领域最主流的实现方式。
4. Function Calling 的实际应用场景
4.1 数据库查询
// 用户问:"我们公司有多少员工?"
{
"name": "query_database",
"arguments": {
"sql": "SELECT COUNT(*) FROM employees"
}
}
LLM 不知道数据库里有什么,但通过 Function Calling 可以帮你写 SQL、查询数据库。
4.2 代码执行
// 用户问:"帮我算一下 123 * 456 + 789"
{
"name": "execute_python",
"arguments": {
"code": "print(123 * 456 + 789)"
}
}
4.3 日历管理
{
"name": "create_calendar_event",
"arguments": {
"title": "团队周会",
"date": "2026-03-25",
"time": "10:00",
"duration": 60
}
}
4.4 发送邮件
{
"name": "send_email",
"arguments": {
"to": "team@company.com",
"subject": "周报总结",
"body": "本周完成了..."
}
}
4.5 实时信息查询
// 查股票、汇率、新闻等
{
"name": "get_stock_price",
"arguments": {
"symbol": "AAPL"
}
}
5. Structured Output(结构化输出)
Function Calling 有一个"兄弟概念":Structured Output。
它们的关系
| 对比项 | Function Calling | Structured Output |
|---|---|---|
| 触发条件 | 需要调用外部函数时使用 | 任何时候都需要结构化 JSON 时使用 |
| 必须执行函数 | ✅ 是的(执行是 Function Calling 流程的一部分) | ❌ 不一定(只是让输出格式规范) |
| 典型用途 | 查询数据库、调用 API | 提取字段、生成报告、API 响应 |
Structured Output 的例子
用户问:"帮我提取这篇文章中的人名和地名。"
LLM 直接输出(不需要调用函数):
{
"people": ["张三", "李四", "王五"],
"locations": ["北京", "上海", "深圳"]
}
这是 Structured Output,不是 Function Calling——没有外部函数被执行。
注意:Structured Output 在某些 LLM 中是通过特殊的提示技术(如 JSON Mode)实现的,与 Function Calling 的实现机制不同。
6. Function Calling 的局限性
6.1 LLM 不理解函数的真实逻辑
LLM 只是根据 schema 描述"猜测"参数格式。它不知道函数实际能做什么,可能会:
- 生成错误格式的参数
- 在不需要调用时调用
- 在需要调用时不调用
6.2 函数结果的解读依赖 LLM
函数返回的是原始数据,LLM 能否正确整合这些数据生成回答,取决于它的理解能力。
6.3 安全性问题
Function Calling 涉及实际执行代码或操作,需要严格的安全防护:
- 权限控制:LLM 只能调用被授权的函数
- 参数校验:执行前必须校验 LLM 生成的参数是否合法
- 隔离执行:危险操作(如删除文件、发送邮件)应在隔离环境中执行
7. 常见 LLM 的 Function Calling 支持
| 模型 | Function Calling 支持 |
|---|---|
| GPT-4 / GPT-4o | ✅ 原生支持,成熟稳定 |
| GPT-3.5 Turbo | ✅ 支持 |
| Claude 3 | ✅ 支持,但叫"Tool Use" |
| Gemini | ✅ 支持(Function Calling + Extensions) |
| Llama 3 | ✅ 通过微调版本支持 |
| 国产模型(通义、文心等) | ✅ 各自有实现方案 |
8. 总结
Function Calling = LLM 判断是否需要 → 生成结构化调用 → 执行 → 整合结果
核心价值:
- 让 LLM 从"只说话"进化到"能做事"
- 打通了 AI 和真实世界(数据库、API、系统)之间的壁垒
- 是 Agent 架构的底层技术支撑
Function Calling vs Tool Calling vs Structured Output 的关系:
Tool Calling
├── Function Calling(主流,最重要)
│ └── LLM 生成 JSON → 执行函数 → 返回结果
└── Structured Output
└── LLM 生成 JSON → 直接输出,不执行任何操作