Function Calling

大语言模型调用外部工具的核心协议机制,让 LLM 从”只能说”升级为”能做事”

简介

Function Calling(函数调用)是 OpenAI 在 2023 年 6 月随 GPT-3.5 Turbo 首次引入、后在 GPT-4 Turbo 中大幅增强的核心能力。它允许大语言模型在对话过程中识别何时需要调用外部函数,并生成结构化的函数调用请求(包含函数名和参数),由应用程序执行后将结果返回给模型继续推理。

Function Calling 是 AI Agent 能够”做事”的核心基础设施——没有它,LLM 只能生成文本;有了它,LLM 可以读邮件、查天气、操作数据库、调用 API 等。

工作原理

调用流程

  1. 定义工具:开发者在 API 请求中提供可用函数的 JSON Schema 描述(函数名、参数类型、参数说明)
  2. 模型决策:LLM 根据用户意图判断是否需要调用函数、调用哪个函数、传什么参数
  3. 生成调用:模型输出结构化的函数调用请求(不直接执行)
  4. 应用执行:应用程序接收调用请求,在本地执行函数
  5. 结果回传:将函数执行结果返回给模型
  6. 继续推理:模型基于函数结果生成最终回复

关键特性

  • 模型不直接执行函数:模型只生成调用请求,实际执行由应用代码完成
  • 支持并行调用:一次响应中可以包含多个函数调用请求
  • 结构化输出:参数以 JSON 格式传递,类型安全
  • 与对话历史集成:函数调用和结果成为对话历史的一部分

关键信息

  • 类型:技术协议/能力
  • 提出者:OpenAI(2023年6月)
  • 支持模型:GPT-4 Turbo、GPT-4o、GPT-3.5 Turbo(后续版本)
  • 竞争方案:Anthropic Tool Use、Google Gemini Extensions、MCP(Model Context Protocol)
  • 底层依赖:JSON Schema 描述函数签名

不同素材中的观点

来自 2026-06-13-langchain-openai-agent-tutorial

  • Function Calling 是 Agent 调用外部工具的核心机制,通过 @tool 装饰器自动将 Python 函数转换为 Function Calling 格式
  • LangChain 的 create_openai_functions_agent 基于 Function Calling 构建 Agent,封装了工具定义→调用生成→执行→结果回传的完整流程
  • 实战中用于构建邮件助手:Agent 通过 Function Calling 读取邮件(read_emails)、起草回复(draft_reply)、发送邮件(send_email)
  • 系统提示词配合 Function Calling 决定 Agent 的行为边界(如”发送前必须得到用户确认”)

来自 2026-07-05-juejin-claude-code-tool-calling

  • 这篇素材把 Claude Code 的 tool_use 放进更完整的 Agent harness 运行时里观察:模型产生工具调用意图后,宿主系统还要处理并发调度、权限决策、Hook、执行、结果持久化、后台通知和取消传播。
  • 这补充了 Function Calling 词条此前偏 API/协议层的视角:Function Calling 解决“模型如何结构化表达要调用哪个函数、传什么参数”,而 Claude Code 工具调用机制解决“这个调用如何在真实本地环境中安全执行、审计、回传和继续循环”。
  • 文章中的 Deferred Tools 也说明,工具调用能力一旦从几个函数扩展到大量 MCP 工具,就不只是 schema 描述问题,还会变成上下文预算和工具发现问题。

来自 2026-07-19-juejin-langchain-models-guide

  • LangChain 侧落地路径:@tool 从函数签名 + docstring 生成工具描述(描述清晰度直接影响模型是否选对工具)→ model.bind_tools([...]) → 响应里读 tool_calls(name/args)→ 应用执行 → 结果作为 Tool 消息回传。
  • tool_choice 旋钮:auto(默认自主决定)、any/required(强制至少一次)、none(禁止)、指定工具名(强制某一工具);另可用 parallel_tool_calls=False 关掉并行工具调用。
  • 流式场景下工具调用会以 content_blocks 里的 tool_call_chunk 分块出现,和 text / reasoning 并列,便于 UI 边收边展示。
  • 与 Claude Code harness 视角对照:本文补的是 SDK/协议绑定层(schema、choice、并行),不是权限/Hook/取消传播层。

与 MCP 的关系

Function Calling 是单模型-单应用的工具调用机制,而 MCP(Model Context Protocol)是跨模型、跨应用的标准化工具调用协议。两者互补:

  • Function Calling 定义了”模型如何请求调用工具”
  • MCP 定义了”工具如何被发现、连接和标准化调用”

实用信息

工具定义示例

@tool
def read_emails(folder: str = "inbox") -> list:
    """
    读取邮箱中的邮件
 
    Args:
        folder: 邮箱文件夹名称(inbox, sent, draft)
 
    Returns:
        邮件列表,每封邮件包含 subject, from, body
    """
    # 实际实现
    return emails

适用场景

  • 需要 LLM 与外部系统交互的应用
  • 多步骤任务自动化(Agent)
  • 数据查询和操作
  • API 编排和集成

相关页面