GPTMap

OpenAI API 函数调用实战:Responses API 工具使用完全指南

函数调用(Function Calling)是让 GPT-5.6 调用你代码的核心能力。本文用 Responses API 完整走一遍:声明 tools、解析 function_call、回传结果、串联多轮工具调用。

TL;DR
函数调用让模型在回答前先调用你的代码(查天气、查数据库、下单),是构建 Agent 的地基。本文用 Responses API 从声明 tools 到回传结果完整走一遍,并给出多轮调用、并行调用、tool_choice 强制策略与常见报错。
函数调用(Function Calling / Tool Use)是 Responses API 的一种能力:模型根据你的 tools 声明决定是否调用某个函数,返回结构化的 function_call,由你的代码执行并把结果回传给模型继续生成。

操作步骤

  1. 声明一个带 JSON Schema 参数的 tool

    在 client.responses.create 的 tools 参数里声明函数:name(如 get_weather)、description、parameters(JSON Schema,含 required)。

  2. 发起请求并解析 function_call

    检查 response.output 中 type == 'function_call' 的条目,取 name 与 arguments(JSON 字符串),分发给你的实现函数执行。

  3. 把执行结果回传给模型

    把上一步的 function_call 追加到 input,再加一条 {type: 'function_call_output', call_id, output},再次调用 responses.create,模型据此生成最终答案。

  4. 用 tool_choice 与并行调用优化

    默认 auto;需要强制时用 required 或指定函数名。多个独立 function_call 可并行执行后一次性回传。

  5. 上线前防护

    对函数做输入校验与鉴权,敏感操作加用户确认;把工具返回值当不可信输入,防止 prompt injection 诱导调用危险工具。

函数调用(Function Calling)是让模型"动手"的核心能力:它不回答你"天气怎么样",而是返回一个结构化的调用请求,由你的代码去查天气,再把结果交给模型组织成答案。本文用 Responses API 完整走一遍。

1. 什么是函数调用

普通请求是单向的:input → 文本答案。函数调用把流程拆成多轮:

  1. 你声明可用的工具(tools),每个工具带名字、描述和参数 schema。
  2. 模型判断"这个问题需要调用工具",返回 function_call(含函数名 + 参数 JSON)。
  3. 你的代码执行对应函数,把结果以 function_call_output 回传。
  4. 模型拿到结果,继续生成最终答案。

模型从不真正执行你的代码——它只做决策,执行权在你手里。

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 精确,是函数调用成功率的最大杠杆

常见问题

普通请求:input → 文本答案。函数调用:input + tools → 模型可能返回 function_call(不产出最终文本),你的代码执行函数并把结果以 function_call_output 回传,模型再生成最终答案。一轮可以拆成多次请求,直到模型给出文本为止。

官方参考

相关文章

订阅 GPTMap Weekly

每周一封邮件,精选 OpenAI 重要更新、深度解读与最佳实践。无广告,可随时退订。

GPTMap Editorial发布于 2026-08-06 6 分钟阅读
测试环境(EEAT)
最后测试时间:2026-08-06
使用模型:gpt-5.6