OpenAI API 函数调用实战:Responses API 工具使用完全指南
函数调用(Function Calling)是让 GPT-5.6 调用你代码的核心能力。本文用 Responses API 完整走一遍:声明 tools、解析 function_call、回传结果、串联多轮工具调用。
操作步骤
声明一个带 JSON Schema 参数的 tool
在 client.responses.create 的 tools 参数里声明函数:name(如 get_weather)、description、parameters(JSON Schema,含 required)。
发起请求并解析 function_call
检查 response.output 中 type == 'function_call' 的条目,取 name 与 arguments(JSON 字符串),分发给你的实现函数执行。
把执行结果回传给模型
把上一步的 function_call 追加到 input,再加一条 {type: 'function_call_output', call_id, output},再次调用 responses.create,模型据此生成最终答案。
用 tool_choice 与并行调用优化
默认 auto;需要强制时用 required 或指定函数名。多个独立 function_call 可并行执行后一次性回传。
上线前防护
对函数做输入校验与鉴权,敏感操作加用户确认;把工具返回值当不可信输入,防止 prompt injection 诱导调用危险工具。
函数调用(Function Calling)是让模型"动手"的核心能力:它不回答你"天气怎么样",而是返回一个结构化的调用请求,由你的代码去查天气,再把结果交给模型组织成答案。本文用 Responses API 完整走一遍。
1. 什么是函数调用
普通请求是单向的:input → 文本答案。函数调用把流程拆成多轮:
- 你声明可用的工具(tools),每个工具带名字、描述和参数 schema。
- 模型判断"这个问题需要调用工具",返回
function_call(含函数名 + 参数 JSON)。 - 你的代码执行对应函数,把结果以
function_call_output回传。 - 模型拿到结果,继续生成最终答案。
模型从不真正执行你的代码——它只做决策,执行权在你手里。
2. 声明工具(tools)
工具声明在 tools 数组,每个函数是带 JSON Schema 参数的对象:
from openai import OpenAI
client = OpenAI()
tools = [
{
"type": "function",
"name": "get_weather",
"description": "获取指定城市的当前天气。需要时再调用。",
"parameters": {
"type": "object",
"properties": {
"city": {"type": "string", "description": "城市名,如 北京"},
"unit": {"type": "string", "enum": ["celsius", "fahrenheit"], "default": "celsius"}
},
"required": ["city"]
}
}
]
response = client.responses.create(
model="gpt-5.6",
input="北京今天多少度?",
tools=tools,
)
关键点:description 写得清楚、parameters 的 schema 精确,是调用成功率最大的杠杆。
3. 解析 function_call 并执行
当模型决定调用工具时,response.output 里会出现 function_call 类型的条目:
for item in response.output:
if item.type == "function_call":
print(item.name) # get_weather
print(item.arguments) # '{"city": "北京", "unit": "celsius"}'
print(item.call_id) # 回传时要用
arguments 是 JSON 字符串,解析后调用你自己的实现:
import json
def call_function(name: str, args: str) -> str:
params = json.loads(args)
if name == "get_weather":
# 这里是你真实的天气 API 或数据源
return json.dumps({"city": params["city"], "temp": 26, "unit": "celsius"})
raise ValueError(f"Unknown function: {name}")
4. 回传结果,拿到最终答案
把 function_call 连同执行结果一起追加进 input,再调一次:
# 假设上一步拿到 fc = 第一个 function_call 条目
messages = list(response.output) # 保留模型的原始输出
messages.append({
"type": "function_call_output",
"call_id": fc.call_id,
"output": '{"city": "北京", "temp": 26, "unit": "celsius"}',
})
final = client.responses.create(
model="gpt-5.6",
input=messages,
tools=tools,
)
print(final.output_text)
# 输出类似:北京今天 26 摄氏度。
多轮调用就是重复"解析 → 执行 → 回传",直到 output 里出现文本条目为止。
5. 控制策略:tool_choice
| 值 | 行为 |
|---|---|
"auto"(默认) | 模型自己决定是否调用 |
"none" | 明确禁止调用工具 |
"required" | 强制至少调用一次(适合路由场景) |
| 函数名 | 强制调用指定函数 |
response = client.responses.create(
model="gpt-5.6",
input="把这条消息分类",
tools=tools,
tool_choice={"type": "function", "name": "classify_message"}, # 强制指定
)
6. 并行工具调用
如果模型判断需要多个独立工具,一次请求会返回多个 function_call。你的代码可以并行执行,再一次性回传:
# output 里有多个 function_call
calls = [i for i in response.output if i.type == "function_call"]
results = [run_in_parallel(c.name, c.arguments) for c in calls] # 并行
new_input = list(response.output)
for c, r in zip(calls, results):
new_input.append({
"type": "function_call_output",
"call_id": c.call_id,
"output": r,
})
final = client.responses.create(model="gpt-5.6", input=new_input, tools=tools)
7. 常见错误与排查
function_call总是不触发 → description 没写清楚使用时机;或 task 不需要工具。把描述改成"当用户询问 X 时调用"。- 参数解析失败 → schema 太宽松。用 enum / format / required 收紧。
- 回传后模型重问 →
call_id不匹配,或function_call_output没跟在对应的function_call之后。 - 工具被 prompt injection 诱导 → 把工具返回值当不可信输入;危险操作(删除、发送、支付)加用户确认。
- 400 invalid_request_error → 检查是不是把 Chat Completions 的
functions传给了 Responses API(这里是tools),以及input不是messages。
8. 下一步
- 《OpenAI API 入门:第一个 GPT-5.6 调用详解》
- 《GPT 模型完全指南:GPT-5.6 Sol / Terra / Luna 选型与对比》
- 《Model Context Protocol 完全指南:MCP 工作机制与实战》— 用 MCP 把函数调用标准化
关键要点
- Responses API 中工具声明在 tools 数组,每个函数带 name / description / parameters(JSON Schema)
- 模型不执行函数,只返回 function_call 对象,执行和回传都由你的代码负责
- 回传用 type: 'function_call_output' 挂回 input,模型拿结果继续生成最终答案
- tool_choice 控制调用策略:auto / none / required / 指定函数名
- 并行工具调用(parallel_tool_calls)一次返回多个 function_call,循环执行后一次性回传
- 描述写清楚、参数 schema 精确,是函数调用成功率的最大杠杆
常见问题
官方参考
相关文章
订阅 GPTMap Weekly
每周一封邮件,精选 OpenAI 重要更新、深度解读与最佳实践。无广告,可随时退订。