Skip to content

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⚠️ 通过 PromptMeta 提供工具调用训练数据,社区实现成熟
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

Open Questions

  • Function Calling 的准确率瓶颈在哪?当前 SOTA 在复杂多参数调用上的准确率约 85-90%,剩余 10-15% 如何突破?
  • 当工具数量达到数百个时,模型如何选择?是否需要工具检索/推荐层?
  • 工具调用的延迟优化:如何减少"模型决定调用 → 执行工具 → 返回结果 → 模型继续生成"的往返时间?
  • 开源模型(Llama、Qwen)的 Function Calling 能力能否追上闭源模型?差距主要在哪?

Sources

AI Knowledge Base — 持续积累