Function Call
Function Call
一、Function Call 的本质原理
首先要建立一个核心认知:LLM 本身并不会“执行”函数。
它的本质是 Token 预测机器。所谓 Function Calling,流程是:
-
你定义工具(告诉模型:你有哪些函数、参数是什么格式,用 JSON Schema 描述)
-
模型推理决策:模型读完用户意图 + 工具列表,判断“我需要调哪个工具”,然后输出一段结构化的 JSON(而不是自然语言)
-
你的代码接管:解析这段 JSON,拿到函数名和参数,执行你本地/远端的真实逻辑
-
结果回传:把函数执行结果塞回对话上下文,再次请求模型
-
模型生成最终回答
简单类比:模型是“指挥官”,只下指令;你的代码是“士兵”,负责干活并把战报回去汇报。
更深层一点(出于好奇,我问的ai,嘿嘿):
Function Calling 的实现本质上是"约定 + 训练 + 工程封装"三者协作的结果,而非模型内部有什么特殊的函数调用开关。首先,API 提供方(如 OpenAI、硅基流动)人为定义了统一的 JSON 协议格式——规定请求中如何传递函数定义、返回中用何种字段描述调用意图。其次,模型本身并不理解"函数"这个概念,它只是通过海量训练数据学会了在特定上下文格式下输出对应结构的文本:当 API 服务器将函数定义和用户提问拼接成 Prompt 送入模型后,模型所做的唯一事情就是逐 Token 预测续写,而由于在训练阶段它见过大量"给定函数描述 → 输出结构化 JSON"的样本,它会自然地续写出符合协议格式的调用指令(例如 tool_calls)。最后,API 服务器在接收到模型输出的文本流后,会进行格式检测与包装,将其结构化为整齐的 JSON 响应返回给你的代码,由你的代码解析并执行真正的业务逻辑。换言之,模型只是在"模仿格式"做文本续写,协议是人为约定的标准,而真正的函数执行永远发生在你的代码侧——这也是为什么不同模型在同一协议下的表现会有差异:它们只是"见过多少这种格式的训练数据"的区别,而非底层机制的不同。
二、涉及的协议格式(核心重点)
目前业界主要有两套格式,这也是你刚才踩坑的原因:
旧版格式(Legacy / Deprecated)
-
请求字段:
functions数组 -
控制字段:
function_call -
返回字段:
message.function_call -
回传角色:
role: "function"

OpenAI 在 2023 年 6 月首发此格式,现在部分老模型仍兼容,但新模型和新平台(如硅基流动)更倾向新版。
新版格式(Current Standard / Tools API)
-
请求字段:
tools数组(元素是{type: "function", function: {...}}) -
控制字段:
tool_choice("auto"/"none"/"required") -
返回字段:
message.tool_calls(数组,支持并行调用) -
回传角色:
role: "tool"+tool_call_id

关键区别一览表:
硅基流动(SiliconFlow)兼容 OpenAI 协议,**强推荐用新版 ****
tools**格式,旧版functions在一些国产模型上可能不触发或行为不一致。
三、主流平台/协议体系对比
除了 OpenAI 系,你以后可能还会遇到这些:
OpenAI 系(我自己目前在用)
-
代表:OpenAI 官方、硅基流动、DeepSeek、大部分兼容 API 的服务
-
协议:新版
tools格式为主 -
特点:生态最大,工程化程度最高
Anthropic Claude 系
-
协议:
tools+tool_use/tool_result块 -
格式理念与 OpenAI 新版高度相似,但字段命名略有差异(
tool_usevstool_calls) -
部分 SDK 可互相适配
Google Gemini 系
-
协议:
FunctionDeclaration格式,也有自己的tools封装 -
通过 Vertex AI 提供,逻辑类似但字段名不同
MCP(Model Context Protocol)—— 新趋势 ,下一章节给大家带来MCP的介绍和使用
-
由 Anthropic 推动的工具描述标准化协议
-
目标是解耦:工具服务端按 MCP 标准暴露能力,任何支持 MCP 的模型都能直接接入
-
你目前用不着,但未来做 Agent 开发会接触到(相当于工具调用的“USB 标准接口”)
我给出我自己的代码仓库https://github.com/qianshb/cookbooks.git,大家可以在终端设置环境变量
把API-key设置为自己的,然后去改改函数,问问AI,看看回复

更多推荐



所有评论(0)