2026-08-15
分类:服务器技术
阅读(1) 评论(0)
-
大模型工具调用与 Function Calling 技术深度解析:从 JSON Schema 定义到多工具并行调度的 AI Agent 交互范式
- 核心痛点:大模型能力再强也无法直接操作数据库、调用 API 或执行代码——如何让 LLM 精准「说出」要调用什么工具、传什么参数、处理什么结果?
- 适配人群:正在构建 AI Agent、RAG 系统或 LLM 应用的后端工程师和 AI 架构师
- 收获能力:掌握 Function Calling 的底层机制、主流 API 差异、结构化输出原理、多工具编排模式与生产级最佳实践
-
技术背景与演进逻辑
- 从纯文本生成到工具增强的范式跃迁
- 早期 LLM -> 纯文本输入/输出 -> 无法与外部世界交互 -> 答案只能来自训练数据
- 2023 年 6 月 -> OpenAI 发布 Function Calling -> LLM 第一次能「说出」要调用什么函数 -> 开启 Agent 时代
- 2023 年 11 月 -> Anthropic Claude 引入 Tool Use -> 支持多工具并行调用 + 计算机操作
- 2024 年 2 月 -> Google Gemini 支持 Function Calling -> Schema-first 设计哲学
- 2024 年 11 月 -> Anthropic 发布 MCP 协议 -> 工具定义从 API 层下沉到协议层
- 2025 年 -> OpenAI 发布 Structured Outputs -> Function Calling + JSON Schema 强制约束 = 100% 合法输出
- 2026 年 -> Function Calling 成为所有主流 LLM 的标配能力 -> 从单工具到多工具并行 -> 从简单调用到复杂编排
- Function Calling 的本质 -> LLM 不执行任何函数 -> LLM 输出结构化的 JSON 参数 -> 宿主应用执行函数 -> 将结果回传给 LLM -> LLM 基于结果继续推理
- 演进时间线(text 树):Function Calling 技术演进
├── 2023-06 -> OpenAI GPT-3.5/4 Function Calling:首次支持结构化工具调用
├── 2023-11 -> Anthropic Claude Tool Use:多工具并行 + 计算机操作
├── 2024-02 -> Google Gemini Function Calling:Schema-first + grounding
├── 2024-06 -> OpenAI parallel function calling:单轮多工具并行
├── 2024-10 -> Anthropic MCP 协议:工具定义标准化为 JSON-RPC 2.0
├── 2024-11 -> OpenAI Structured Outputs:JSON Schema 强制约束输出
├── 2025-03 -> OpenAI Agents SDK:Tool Runner 内置 agentic loop
├── 2025-06 -> Gemini 2.5 自动工具发现:模型可自主决定何时调用
└── 2026-Q1 -> 全主流 LLM Function Calling 标准化 -> MCP/A2A 协议生态成熟
-
核心原理深度解析
-
Function Calling 的工作原理
- Function Calling 的核心是一个多轮对话循环,而非单次请求-响应
- 完整调用流程(text 树 + 箭头):Function Calling 完整流程
├── 第 1 轮: 用户请求 + 工具定义 -> LLM
│ ├── 用户消息: \”北京今天天气怎么样?\”
│ ├── 工具定义: { name: \”get_weather\”, parameters: { city: string } }
│ └── LLM 决策: 分析用户意图 -> 匹配可用工具 -> 生成调用参数
│
├── 第 2 轮: LLM 输出工具调用请求
│ ├── LLM 输出: { tool_call: { name: \”get_weather\”, arguments: { city: \”北京\” } } }
│ ├── 宿主应用: 解析 tool_call JSON -> 执行实际函数
│ ├── 实际函数: 调用天气 API -> 返回 { temp: \”28°C\”, weather: \”晴\” }
│ └── 注意: LLM 本身不执行任何外部操作 -> 只是「说出」要调用什么
│
├── 第 3 轮: 工具结果回传 -> LLM 继续推理
│ ├── 工具结果: { role: \”tool\”, content: \'{\”temp\”:\”28°C\”,\”weather\”:\”晴\”}\’ }
│ ├── LLM 推理: 基于工具返回结果生成自然语言回答
│ └── 最终输出: \”北京今天天气晴朗,气温 28°C,适合户外活动。\”
│
└── 关键设计思想:
├── LLM 是「决策者」不是「执行者」-> 安全边界清晰
├── 工具定义是「说明书」不是「代码」-> LLM 通过 JSON Schema 理解能力边界
└── 宿主应用是「执行者」-> 控制实际 API 调用、权限校验、结果过滤
-
工具定义的 JSON Schema 规范
- 工具定义告诉 LLM 三件事 -> 工具叫什么名字(name)-> 工具做什么(description)-> 工具需要什么参数(parameters + JSON Schema)
- 三大厂商工具定义格式对比(text 树):三大厂商工具定义格式对比
├── OpenAI(Chat Completions API):
│ ├── 位置: tools[] 数组中每个元素
│ ├── 结构: { type: \”function\”, function: { name, description, parameters } }
│ ├── parameters: 标准 JSON Schema 对象
│ ├── 特点: 工具和函数是同一个概念(function calling)
│ └── 限制: parameters 必须是 object 类型
│
├── Anthropic(Messages API):
│ ├── 位置: tools[] 数组中每个元素
│ ├── 结构: { name, description, input_schema }
│ ├── input_schema: 标准 JSON Schema 对象
│ ├── 特点: 工具(tool)和函数(function)统一为 tool
│ └── 扩展: 支持 computer_use / bash / text_editor 内置工具
│
└── Google(Gemini API):
├── 位置: tools[] 中的 function_declarations[]
├── 结构: { name, description, parameters }
├── parameters: JSON Schema 对象
├── 特点: Schema-first 设计,强类型约束
└── 扩展: 支持 grounding(Google Search / 代码执行)
-
结构化输出 vs Function Calling
- Structured Outputs 是 Function Calling 的特化形式 -> Function Calling 让模型「选择调用什么工具」-> Structured Outputs 让模型「输出符合 Schema 的 JSON」-> 两者共享相同的 JSON Schema 约束机制
- 关键区别(text 树):Function Calling vs Structured Outputs vs JSON Mode
├── Function Calling(工具调用):
│ ├── 目的: 让 LLM 决定调用哪个工具 + 生成参数
│ ├── 模型行为: 可能调用 0 个、1 个或多个工具
│ ├── 输出格式: tool_calls[] 数组
│ ├── 执行: 宿主应用解析 tool_calls 并执行
│ └── 适用: AI Agent、RAG、API 编排
│
├── Structured Outputs(结构化输出):
│ ├── 目的: 让 LLM