Function Calling

Function Calling

模型输出 JSON 调 API

函数调用(Function Calling)是让大语言模型以结构化格式声明「需要调用哪个函数、传入哪些参数」的机制,由外部应用层执行实际调用并将结果回传模型,从而赋予模型与真实系统交互的能力。它是构建 AI Agent 的核心基础能力,让模型从「只能输出文本」演进为「能够驱动工具完成现实任务」。

概述

传统语言模型只能生成文本,无法直接查询数据库或调用外部 API;函数调用机制打破了这一限制。

  • 声明意图而非直接执行:模型输出的是结构化调用描述(函数名 + 参数),真正执行由宿主代码完成,安全边界在应用层维护。
  • 基于 JSON Schema 约束:开发者在请求中以 JSON Schema 格式描述可用函数及参数类型,模型的输出被约束为合法结构,便于解析。
  • 对话轮次驱动:执行结果以新消息追加回上下文,模型在完整信息基础上继续推理,支持多轮工具调用链。
  • 模型自主判断:模型也可选择不触发任何函数而直接回答,是否调用本身是推理的一部分,不需要开发者硬编码触发条件。

工作原理

一次典型函数调用分四个步骤完成。

  • 第一步,工具描述:开发者在 API 请求的 tools 字段中以 JSON Schema 声明每个函数的名称、用途说明和参数规格。
  • 第二步,模型推理:模型根据用户意图判断是否需要调用函数;若需要,则在响应中输出包含函数名与参数值的 tool_call 结构,而非自然语言文本。
  • 第三步,应用层执行:宿主代码解析 tool_call,调用真实函数或 API,获取返回值;错误信息也应在此明确传递。
  • 第四步,结果回传:将返回值以 tool 角色消息追加至对话历史,模型基于完整上下文生成最终自然语言答复。

类型与变体

函数调用在不同实现和演进阶段形成了若干变体。

  • 单次调用:最基础形态,每次响应最多触发一个工具;早期 OpenAI 实现属于此类。
  • 并行调用(Parallel Tool Calls):模型在单次响应中输出多个调用意图,批量执行后统一回传,显著减少多步任务的往返延迟;OpenAI 于 2023 年底引入。
  • 强制调用模式:通过 tool_choice 参数指定必须调用特定函数,保证输出符合固定 Schema;常用于结构化信息抽取场景替代正则解析。
  • 跨平台等价实现:Anthropic Claude 称之为 Tool Use,Google Gemini 称之为 Function Declarations,字段命名略有差异但语义一致。
  • 流式调用:部分实现支持在流式响应中逐步输出 tool_call 字段,降低首字节延迟。

应用场景

函数调用在多类实际系统中已成为标准构件。

  • 实时信息查询:将天气、股价、数据库查询封装为函数,让模型突破训练数据时效限制,获取最新信息。
  • 结构化信息抽取:将「提取实体/关系」定义为函数,利用模型必须输出合法 JSON 的约束,替代繁琐的正则解析逻辑,用于 NER、表单填充等任务。
  • AI Agent 驱动:LangChain、AutoGen、LlamaIndex 等 Agent 框架以函数调用作为工具执行的核心机制,驱动多步骤任务规划与动作序列。
  • 代码执行验证:将代码沙箱封装为函数,让模型生成代码后立即调用执行并观察结果,形成「生成-执行-修正」循环。
  • 多系统编排:在企业集成场景中,将 CRM、ERP、内部 API 各封装为工具,模型充当自然语言接口协调多系统操作。

与相邻概念的区别

函数调用与几个相近概念在实践中常被混用,需要区分层次。

  • Function Calling vs MCP:函数调用是模型输出侧的格式规范(模型如何声明调用意图);MCP(Model Context Protocol)是工具连接侧的传输协议(宿主应用如何将工具能力暴露给模型)。两者互补:可以把函数调用比作「语言」,MCP 比作「基础设施」。
  • Function Calling vs RAG:RAG 是被动检索,在用户提问时自动触发;函数调用是主动调用,由模型根据推理判断是否触发。两者可结合——检索动作本身可封装为函数按需触发,即 Agentic RAG
  • Function Calling vs Plugins:OpenAI Plugins(已下线)是早期将函数调用能力封装为可分发产品的形态,本质上建立在函数调用机制之上,属于应用层概念。
  • Function Calling vs Code Interpreter:代码解释器是函数调用的一种特殊工具实例,模型通过调用代码执行环境这一「函数」来运行代码。

局限与误区

函数调用在实际工程中存在若干常见陷阱。

  • 误区:模型在执行函数:模型只输出了调用描述,真正执行在宿主代码。模型无法感知执行失败或超时,必须在返回值中明确传递错误信息,否则模型会基于空响应产生错误推理。
  • 幻觉式调用:模型可能传入不存在的参数键名或格式错误的参数值;对 Schema 做严格校验(如使用 Pydantic 或 Zod)是工程必选项。
  • 工具数量瓶颈:当工具数量超过十几个时,模型选择正确函数的准确率会显著下降;缓解方案包括动态筛选相关工具子集,或为函数编写更清晰的 description
  • 并行调用的执行依赖问题:并行输出的多个调用之间不保证执行顺序,若步骤间存在数据依赖,需在应用层做额外编排或拆成多轮。
  • 提示注入风险:函数返回值会被追加回上下文,若返回值来自不可信源(如网页内容),可能引入提示注入攻击,需对返回内容做过滤。

发展脉络

函数调用机制经历了从非正式约定到行业标准的快速演进。

  • 2022 年前:研究者通过 few-shot prompt 引导模型输出特定格式的「动作指令」(如 ReAct 论文中的 Action 格式),但可靠性和格式一致性依赖提示工程,工程成本高。
  • 2023 年 6 月OpenAI 在 GPT-3.5 Turbo 和 GPT-4 API 中正式引入 Function Calling,提供标准化的 JSON Schema 描述和专用响应字段,大幅降低结构化输出的工程门槛,引发行业跟进。
  • 2023 年下半年:OpenAI 补充并行工具调用能力;Anthropic Claude 2.1 引入工具使用(Tool Use)能力;各大模型服务商陆续跟进。
  • 2024 年MCP(Model Context Protocol)由 Anthropic 提出,将工具连接标准化为独立协议层,函数调用作为上层调用格式与之配合使用,生态进一步完善。
  • 术语演进:业界逐渐以 Tool UseTool Calling 替代 Function Calling,以涵盖代码解释器、文件操作等非函数形态的工具,函数调用成为更广义工具使用范畴中的子集。

常见误解

日常交流中容易听到的简化说法,未必准确,但能帮助理解误解从何而来。

  • 「模型输出 JSON 调 API」
  • 「结构化调接口」
  • 「OpenAI tools 那套」

相关术语

和本术语关联紧密的其他词条,便于串联理解。

🎯 考点练习

含该术语的高频面试题,含标准答案与追问。

延伸阅读

从知识库精选 2 篇文章,帮助深入理解该术语。

  1. 1

    工具调用:Function Calling 实战

    让大模型调用外部工具,扩展 Agent 的能力边界

  2. 2

    LLM 部署实践:vLLM, TGI, Ollama

    从本地到云端,掌握大语言模型的部署方案与性能优化