一聚教程网:一个值得你收藏的教程网站

最新下载

热门教程

GPT-5.6 Sol 如何使用 Responses API、函数调用和 Agent 工具?

时间:2026-09-18 19:44:01 编辑:袖梨 来源:一聚教程网

GPT-5.6 Sol 接入应用时,建议把 Responses API 作为统一入口:普通问答只需传入 modelinput,需要外部能力时再通过 tools 增加函数、网页搜索或文件搜索。真正需要注意的不是“把工具名称写进请求”这么简单,而是应用必须正确处理模型输出的工具调用、执行本地业务逻辑、回传结果,并持续保存调用标识。下面从一个最小请求开始,逐步搭出可用于实际项目的 Agent 调用循环。

先确认接口与模型能力

GPT-5.6 Sol 的模型标识是 gpt-5.6-sol。来源页面将它定位为面向复杂专业工作、代码与工具密集型工作流的旗舰层级,并列出了 Responses API、函数调用、网页搜索、文件搜索、Computer Use、Programmatic Tool Calling、持久化推理和多 Agent 等能力。能力列表说明模型可以参与这些工作流,不等于每个客户端、账户和兼容服务都自动开放全部工具。

接入前应先核对三件事:当前 API 服务是否实现 Responses 端点;账户是否有目标模型和相应托管工具的权限;所用 SDK 是否足够新,能够识别 Responses 对象和工具输出类型。如果服务商只兼容 Chat Completions,就不能仅把方法名改成 responses.create。两种接口的返回结构、工具调用表示和多轮状态衔接并不相同。

发起最小 Responses API 请求

Python SDK 会从环境变量读取密钥。若使用兼容服务,应按服务商说明配置客户端地址,但不要把密钥写进源码、日志或浏览器前端。最小文本请求如下:

from openai import OpenAI

client = OpenAI()

response = client.responses.create(
    model="gpt-5.6-sol",
    instructions="使用简洁中文回答;不确定时明确说明。",
    input="解释 Responses API 适合解决什么问题。",
)

print(response.output_text)

instructions 适合放稳定的角色、边界和输出要求,input 放本轮任务。output_text 是 SDK 提供的文本聚合便利属性,适合只关心最终文本的场景;一旦使用函数或内置工具,就应检查 response.output 中的每个条目,因为输出可能同时包含消息、工具调用和其他类型的项目。

不要假定每次响应都有文本。模型决定调用函数时,当前响应的关键产物可能是 function_call;如果代码只打印 output_text,表面上就会像“模型没有回答”。因此,Agent 应用的处理器应按 type 分派输出,而不是把整个响应当成一段字符串。

实现一次完整的函数调用闭环

函数调用允许模型选择应用提供的业务能力,例如查询订单、读取库存或创建工单。模型只生成结构化调用意图,不会自动执行你的 Python 函数。应用仍要负责参数校验、授权、执行、审计和异常处理。

下面定义一个只读的天气函数。参数使用 JSON Schema 描述,并开启严格校验。函数名和描述应具体,字段应尽量少;含糊的描述会增加选错工具或填错参数的概率。

import json
from openai import OpenAI

client = OpenAI()

tools = [{
    "type": "function",
    "name": "get_weather",
    "description": "查询指定城市当前天气,用于回答实时天气问题。",
    "parameters": {
        "type": "object",
        "properties": {
            "city": {
                "type": "string",
                "description": "城市名称,例如上海"
            }
        },
        "required": ["city"],
        "additionalProperties": False
    },
    "strict": True
}]

response = client.responses.create(
    model="gpt-5.6-sol",
    input="今天上海天气如何?",
    tools=tools,
)

def get_weather(city):
    # 真实项目在这里调用经过授权的天气服务。
    return {"city": city, "condition": "示例数据", "verified": False}

tool_outputs = []
for item in response.output:
    if item.type != "function_call":
        continue
    if item.name != "get_weather":
        raise ValueError(f"不允许的函数: {item.name}")
    args = json.loads(item.arguments)
    result = get_weather(args["city"])
    tool_outputs.append({
        "type": "function_call_output",
        "call_id": item.call_id,
        "output": json.dumps(result, ensure_ascii=False),
    })

if tool_outputs:
    response = client.responses.create(
        model="gpt-5.6-sol",
        previous_response_id=response.id,
        input=tool_outputs,
        tools=tools,
    )

print(response.output_text)

这里有四个不能省略的环节。第一,只执行白名单函数,不能把模型返回的名称直接映射到任意反射调用。第二,即使启用了严格模式,也要在业务层再次校验参数范围和用户权限。第三,用 call_id 把执行结果对应回原调用。第四,把工具输出交给模型后再取得面向用户的自然语言结果。

示例中的天气结果故意标记为未核验,避免把占位数据误当成真实结果。生产代码应替换为真实数据源,并给调用设置超时。涉及写入、付款、删除或发送消息的函数,还应增加幂等键和人工确认;模型提出调用不等于用户已经授权执行不可逆操作。

控制模型何时使用函数

默认的 tool_choice="auto" 允许模型在直接回答和调用工具之间选择。若某个流程必须读取权威业务数据,可设为 required,要求至少调用一个工具;若当前阶段禁止工具,则设为 none。还可以约束到特定函数,但应仅在业务流程明确时这样做。

工具选择和函数授权是两层不同控制。tool_choice 影响模型生成什么,服务端白名单和权限系统决定什么能够真正执行。即使强制模型调用查询函数,也不能绕过租户隔离;即使模型没有选择危险函数,后端仍不应给它超出当前用户身份的凭据。

使用网页搜索与文件搜索

托管工具由 API 平台执行,应用通常不需要像自定义函数那样编写本地执行器。网页搜索可以这样加入请求:

response = client.responses.create(
    model="gpt-5.6-sol",
    tools=[{"type": "web_search"}],
    input="汇总今天与 Python 相关的重要发布,并区分事实与推测。",
)

print(response.output_text)

网页搜索适合需要时效信息的任务。应用展示结果时应保留响应中的来源标注,不要把带来源的回答压平成无法追溯的纯文本。还要考虑搜索成本、延迟、地域可用性和不可信网页中的提示注入风险。网页内容只能作为数据,不能成为覆盖开发者指令的命令。

文件搜索需要先建立向量存储并上传或关联文件,然后在工具定义中传入允许搜索的存储标识:

response = client.responses.create(
    model="gpt-5.6-sol",
    tools=[{
        "type": "file_search",
        "vector_store_ids": ["vs_project_docs"]
    }],
    input="根据项目文档概括发布前检查项;没有依据的内容不要补充。",
)

print(response.output_text)

这里的存储标识只是格式示例,必须换成实际创建的资源。多租户系统不能把所有客户文件放入一个无过滤的检索范围。文件上传、向量存储授权、检索过滤和响应引用都应与租户身份绑定。对于合规数据,还要确认保存期限、删除流程和审计要求。

从“调用工具”发展为 Agent 循环

一个 Agent 并不是单次 API 调用,而是受限的循环:接收目标,向模型提供当前上下文和可用工具,执行被批准的调用,回传结果,再判断是否完成。最简单的循环可以设置最大步数,并在每一步只接受已知输出类型。

MAX_STEPS = 8
response = client.responses.create(
    model="gpt-5.6-sol",
    input="检查订单状态并说明下一步。",
    tools=tools,
)

for _ in range(MAX_STEPS):
    calls = [x for x in response.output if x.type == "function_call"]
    if not calls:
        break

    outputs = []
    for call in calls:
        outputs.append(execute_approved_call(call))

    response = client.responses.create(
        model="gpt-5.6-sol",
        previous_response_id=response.id,
        input=outputs,
        tools=tools,
    )
else:
    raise RuntimeError("Agent 超过最大工具调用步数")

print(response.output_text)

execute_approved_call 应返回符合 function_call_output 结构的数据,并集中处理白名单、参数验证、超时、重试和审计。循环上限可以防止模型在两个工具之间反复调用。除此之外,还应限制单轮工具数、累计耗时和预算。并行调用只适合彼此独立的只读任务;存在先后依赖或写操作时,应按业务顺序串行执行。

previous_response_id 让后续调用衔接上一轮响应,省去应用手动重组所有项目。应用仍需保存业务状态,不能只依赖模型会话:订单是否已更新、邮件是否已发送、审批是否通过,都应以业务数据库为准。调用链标识适合延续推理上下文,却不是事务日志。

流式输出如何处理

长回答或高推理强度可能增加等待时间,可以启用 stream=True。流式接口返回的是一系列带类型的事件,不应假定每个事件都有文本。界面层可消费文本增量事件,工具层则应等待函数参数完成事件后再解析完整 JSON;在参数尚未结束时执行函数,容易得到截断数据。

stream = client.responses.create(
    model="gpt-5.6-sol",
    input="给出一个三步排错清单。",
    stream=True,
)

for event in stream:
    if event.type == "response.output_text.delta":
        print(event.delta, end="", flush=True)
    elif event.type == "response.failed":
        raise RuntimeError("响应生成失败")

实际事件类型应以当前 SDK 定义为准。流式传输中断时,不要立即把同一个写操作重新执行一遍;先根据请求标识、幂等键和业务记录判断工具是否已经成功。文本生成通常可以重试,产生外部副作用的工具调用必须先确认状态。

常见故障与定位顺序

模型不存在或无权限

出现模型不可用时,先检查模型标识是否确实为 gpt-5.6-sol,再检查账户权限和兼容服务支持范围。不要用自动替换到另一个模型来掩盖问题,因为不同模型的工具能力、成本和输出行为可能不同。

接口或 SDK 不支持 Responses

若客户端没有 responses,通常是 SDK 版本过旧;若服务返回端点不存在,则可能是兼容服务尚未实现该接口。升级 SDK 前查看变更说明,并在隔离环境运行最小请求。第三方服务宣称“兼容 OpenAI”不代表覆盖全部 Responses 工具。

函数一直不被调用

检查函数描述是否清楚、用户任务是否真的需要外部数据,以及 tool_choice 是否允许调用。可以在测试中暂时使用 required 验证调用链,但生产环境不应无条件强制无关工具。参数 Schema 过宽、函数之间职责重叠,也会降低选择稳定性。

函数调用后没有最终回答

这通常是应用只执行了函数,却没有把 function_call_output 连同正确的 call_id 回传,或者没有继续创建下一次响应。记录响应 ID、调用 ID、函数名、耗时和错误码,排查时不要记录密钥或敏感参数原文。

超时、限流与成本上升

工具搜索、长上下文和较高推理强度都会增加延迟或成本。对可重试的读取请求使用带随机抖动的指数退避,对写请求使用幂等键;同时设置连接超时、总时限、最大步骤和预算。遇到限流应读取服务返回的限制信息,而不是固定间隔无限重试。

上线前的验证清单

先用不带工具的最小请求确认模型和 Responses 端点可用,再用一个无副作用函数验证调用与回传,最后逐项启用网页搜索、文件搜索或其他 Agent 工具。测试至少覆盖:模型直接回答、单次函数调用、多个调用、非法参数、未知函数、函数超时、流式中断、达到步骤上限以及用户取消。

生产环境还应保存结构化遥测,包括请求追踪标识、响应 ID、工具调用次数、各工具耗时、令牌用量和终态,但要脱敏。对有副作用的动作建立审批点和幂等机制,对检索内容做权限隔离,对网页内容按不可信输入处理。这样,GPT-5.6 Sol 才是受控工作流中的推理与编排组件,而不是拥有无限权限的自主执行者。

热门栏目