Appearance
Function Calling / Tool Use
LLM 从"纯文本生成器"进化为"行动者"的关键桥梁。Function Calling 让模型能够理解外部工具的语义、自主决定何时调用、并生成结构化参数——这是所有 AI Agent 的底层机制。
Overview
Function Calling(函数调用,也称 Tool Use)是一种让大语言模型与外部系统交互的技术范式。模型接收一组可用工具的 schema 定义(名称、描述、参数),在生成回复时可以选择调用其中一个或多个工具,并输出符合 schema 的结构化参数。
这一能力最早由 OpenAI 在 GPT-4 (2023-06) 中系统性地引入,随后被 Anthropic Claude、Google Gemini、Mistral 等主流模型广泛采纳。它已成为 LLM 应用架构的事实标准。
How It Works
核心流程
1. 开发者定义工具 → 2. 模型接收工具描述 → 3. 模型决定调用 →
4. 开发者执行工具 → 5. 结果返回模型 → 6. 模型生成最终回复工具 Schema 示例(OpenAI 格式)
json
{
"type": "function",
"function": {
"name": "get_weather",
"description": "获取指定城市的当前天气信息",
"parameters": {
"type": "object",
"properties": {
"location": {
"type": "string",
"description": "城市名称,如 '北京'"
},
"unit": {
"type": "string",
"enum": ["celsius", "fahrenheit"],
"description": "温度单位"
}
},
"required": ["location"]
}
}
}模型输出(调用意图)
json
{
"role": "assistant",
"tool_calls": [{
"id": "call_abc123",
"type": "function",
"function": {
"name": "get_weather",
"arguments": "{\"location\":\"北京\",\"unit\":\"celsius\"}"
}
}]
}Technical Mechanism
Function Calling 的实现有两种主要技术路径:
| 路径 | 原理 | 代表 |
|---|---|---|
| 原生训练 | 在预训练/后训练阶段专门加入工具调用数据,模型学会识别调用模式 | OpenAI GPT-4、Anthropic Claude、Google Gemini |
| Prompt 工程 | 通过 System Prompt 描述工具,用正则解析模型输出的 JSON | 早期开源模型、Llama 2/3 通过系统提示实现 |
关键洞察:原生训练的 Function Calling 在复杂场景(多工具选择、嵌套调用、参数推理)上远优于 Prompt 工程方案——这是后训练(post-training)专门化的典型案例。
Multi-Turn Tool Use
复杂的 Agent 场景需要多轮工具调用:
User: "帮我订一张明天北京到上海的高铁,要上午的"
→ Assistant: 调用 search_trains(date="明天", from="北京", to="上海", time="morning")
→ Tool: 返回车次列表
→ Assistant: 调用 book_ticket(train_id="G1", seat="二等座")
→ Tool: 返回预订结果
→ Assistant: 生成最终回复 "已为您预订 G1 次列车..."状态管理挑战:
- 工具调用历史需要完整保留在上下文中
- 错误处理(工具返回异常时如何恢复)
- 并行调用 vs 串行调用的决策
Ecosystem & Standards
模型原生支持
| 模型 | 支持情况 | 特点 |
|---|---|---|
| GPT-4o / GPT-4 | ✅ 原生 | 最成熟,支持并行调用、嵌套调用 |
| Claude 3.5 Sonnet | ✅ 原生 | 工具使用准确率高,支持 Computer Use |
| Gemini 1.5 Pro | ✅ 原生 | Google API 生态集成 |
| Llama 3 | ⚠️ 通过 Prompt | Meta 提供工具调用训练数据,社区实现成熟 |
| Qwen2.5 | ✅ 原生 | 中文工具调用支持优秀 |
| DeepSeek-V3 | ✅ 原生 | 开源模型中工具调用能力最强之一 |
框架抽象层
- LangChain / LangGraph:工具定义、调用编排、Agent 循环的标准化封装
- OpenAI Assistants API:内置工具(Code Interpreter、Retrieval、Function Calling)
- MCP (Model Context Protocol):Model Context Protocol (MCP) — 标准化工具暴露协议
- AutoGen / CrewAI:多 Agent 协作中的工具共享与调用协调
Design Patterns
1. 工具即 API 封装
将现有 REST API 包装为 LLM 可调用的工具——最常见的落地模式。
2. 工具即数据库查询
json
{
"name": "query_database",
"description": "用 SQL 查询用户数据库",
"parameters": { "sql": "string" }
}风险:SQL 注入。需严格权限控制和查询审计。
3. 工具即代码执行
json
{
"name": "execute_python",
"description": "执行 Python 代码进行计算或数据分析",
"parameters": { "code": "string" }
}风险:任意代码执行。需在沙箱环境中运行。
4. 工具即 Agent 委托
一个 Agent 将任务委托给另一个专门 Agent——通过 Function Calling 触发子 Agent。
Security Considerations
| 风险 | 描述 | 缓解措施 |
|---|---|---|
| 间接 Prompt 注入 | 工具返回的内容中包含恶意指令,误导模型 | 工具输出隔离、权限最小化 |
| 工具滥用 | 模型在不该调用时调用工具(如用户闲聊时查询数据库) | 明确的调用触发条件描述 |
| 参数注入 | 用户输入通过参数注入攻击后端系统 | 参数校验、预编译查询 |
| 过度授权 | 模型拥有超出必要范围的工具权限 | 按需授权、用户确认敏感操作 |
Why It Matters
- Agent 的基石:没有 Function Calling,LLM 只能生成文本;有了它,模型可以操作真实世界
- 能力扩展的标准接口:无需重新训练模型,只需添加新工具即可扩展能力边界
- 从对话到行动:是 LLM 从"聊天机器人"进化为"数字员工"的关键技术
- 生态标准化:OpenAI 的 Function Calling schema 已成为事实标准,降低了跨模型开发的成本
Relationships
- 上层应用:AI Agents — Agent 的感知-决策-行动循环依赖 Function Calling
- 协议标准:Model Context Protocol (MCP) — MCP 是 Function Calling 的跨平台标准化协议
- 输出约束:Structured Output / JSON Mode — Function Calling 本质是强制 JSON schema 的结构化输出
- 编排框架:Harness Engineering — OpenAI Codex Agent 大量使用 Function Calling 与开发环境交互
- 安全关联:AI Safety & Alignment — 工具调用的安全边界是 AI 安全的核心议题
Open Questions
- Function Calling 的准确率瓶颈在哪?当前 SOTA 在复杂多参数调用上的准确率约 85-90%,剩余 10-15% 如何突破?
- 当工具数量达到数百个时,模型如何选择?是否需要工具检索/推荐层?
- 工具调用的延迟优化:如何减少"模型决定调用 → 执行工具 → 返回结果 → 模型继续生成"的往返时间?
- 开源模型(Llama、Qwen)的 Function Calling 能力能否追上闭源模型?差距主要在哪?