ChatGPT API 的 function calling 功能不需要在控制台单独开关,而是通过在调用 Chat Completion 接口时构造特定的 tools 参数来启用。该功能仅适用于官方文档列出的支持工具调用的模型版本,使用旧版模型或不带参数请求无法触发。
先说结论:启用功能依赖 API 请求体中的 tools 字段配置,而非账户设置。
- 适合:需要将模型输出转化为结构化数据或触发外部 API 的开发场景
- 先看:确认所选模型版本支持 tool calling 能力
- 建议:使用 tools 参数替代已弃用的 functions 参数以获得更好兼容性
命令速用版
以下是一个标准的 HTTP 请求体 JSON 示例,包含启用 function calling 所需的最小配置:
{
"model": "gpt-4o",
"messages": [{"role": "user", "content": "北京天气怎么样?"}],
"tools": [{
"type": "function",
"function": {
"name": "get_weather",
"description": "获取指定城市的天气",
"parameters": {
"type": "object",
"properties": {
"location": {"type": "string", "description": "城市名称"}
},
"required": ["location"]
}
}
}]
}
为什么会这样
Function calling 本质是模型根据提供的 schema 生成符合格式的参数,而不是真正直接调用外部函数。
OpenAI 模型需要在提示词上下文中明确知道可用工具的名称、描述和参数结构,才能决定何时输出工具调用请求。API 层面通过 tools 参数传递这些定义,模型返回特定格式的 JSON 片段,开发者需要自行执行实际函数逻辑。
分步处理
第一步:选择支持工具调用的模型。
在 API 请求的 model 字段中指定较新的模型版本,例如 gpt-3.5-turbo-0125 或 gpt-4o 系列。旧版模型如 gpt-3.5-turbo-0301 不支持此功能。
第二步:定义 tools 参数结构。
在请求体中添加 tools 数组,每个元素包含 type 为 function 的对象。内部 function 对象需包含 name、description 和 parameters(遵循 JSON Schema 规范)。
第三步:发送请求并捕获响应。
调用 chat/completions 接口。如果模型决定调用工具,响应消息中会出现 tool_calls 字段,而不是普通的 content 文本。
第四步:执行函数并回传结果。
解析 tool_calls 中的参数,在本地或服务器执行对应逻辑,然后将结果以 role 为 tool 的消息格式再次发送给模型。
怎么验证是否生效
检查 API 响应对象中 choices[0].message.tool_calls 是否存在且不为空。
如果该字段存在,说明模型已识别工具调用意图并生成了参数。同时检查 finish_reason 字段,若为 tool_calls 则表示正常触发。若返回普通 content 文本且无 tool_calls,说明模型认为不需要调用工具或配置未被识别。
常见坑
1. 模型版本不支持:使用过旧的模型版本会导致 tools 参数被忽略,模型仅当作普通文本处理。
2. 参数命名错误:新版 API 推荐使用 tools 参数,旧版 functions 参数虽在某些版本兼容但已不再推荐,混用可能导致行为不一致。
3. JSON Schema 定义过于复杂:parameters 结构如果过于嵌套或描述不清,会降低模型调用准确率,建议保持参数定义简洁明确。
常见问题
哪些模型支持 function calling?
gpt-3.5-turbo-0613 及后续版本、gpt-4-0613 及后续版本、gpt-4o 系列均支持。
使用 function calling 会额外收费吗?
不会单独收费,但计入输入和输出 token 总量,按标准 API 价格计费。
可以一次性调用多个函数吗?
支持并行工具调用,模型可以在单次响应中返回多个 tool_calls 对象。
参考来源
OpenAI API Documentation - Function calling
https://platform.openai.com/docs/guides/function-calling