Agent 工具:调用、搜索与代码

@gabrielchua
英语1天前 · 2026年7月13日
796K
19
3
1
43

TL;DR

Gabriel Chua 深入探讨了 GPT-5.6 的全新工具功能,详细介绍了程序化工具调用和工具搜索如何优化 Agent 性能与上下文管理。

随着 GPT-5.6 的发布,我们推出了程序化工具调用(Programmatic Tool Calling),现在是时候回顾一下 Agent 工具以及随着工具使用量增长,如何让模型保持专注的方法了。

当客服 Agent 被问及订单 A-104 为何延迟时,它可能会读取订单信息、联系承运商,并解释延迟原因。这个交互过程隐藏着一个循环:模型请求一个操作,运行时执行该操作,然后返回结果。内置工具、MCP、技能、工具搜索(Tool Search)和程序化工具调用(Programmatic Tool Calling)改变了模型能看到什么以及会返回什么。

1. 工具调用基础:模型请求;应用执行

通过客户端拥有的函数,模型并不会运行你的代码。它会返回一个工具名称、JSON 参数和调用 ID。你的应用程序检查请求,运行该函数,并返回带有相同 ID 的 function_call_output

Gabriel Chua - inline image

客户端拥有的工具循环:在你的应用程序执行步骤 3 之前,不会发生任何外部操作。使用 Codex 中的 GPT-Image-2 生成。

在 Python 中,返回 function_call_output 会将控制权交还给模型:

python
1import json
2from openai import OpenAI
3
4client = OpenAI()
5
6def get_order(order_id): return {"order_id": order_id, "promised_date": "2026-07-13"}
7
8order_tool = {
9 "type": "function", "name": "get_order", "strict": True,
10 "description": "返回订单的承诺送达日期。",
11 "parameters": {
12 "type": "object",
13 "properties": {"order_id": {"type": "string"}},
14 "required": ["order_id"], "additionalProperties": False,
15 },
16 "output_schema": {
17 "type": "object",
18 "properties": {
19 "order_id": {"type": "string"}, "promised_date": {"type": "string"},
20 },
21 "required": ["order_id", "promised_date"], "additionalProperties": False,
22 },
23}
24
25first = client.responses.create(
26 model="gpt-5.6", tools=[order_tool], input="为什么订单 A-104 延迟了?",
27 tool_choice={"type": "function", "name": "get_order"},
28)
29call = next(item for item in first.output if item.type == "function_call")
30result = get_order(**json.loads(call.arguments))
31
32final = client.responses.create(
33 model="gpt-5.6",
34 tools=[order_tool],
35 input=[*first.output, {
36 "type": "function_call_output",
37 "call_id": call.call_id,
38 "output": json.dumps(result),
39 }],
40)
41print(final.output_text)

这个框架会重复此循环,直到模型返回最终消息。严格的模式(Strict schemas)能保持参数格式良好;执行器(executor)仍然会检查权限。

2. 工具执行可以在不同位置运行

内置工具,包括网络搜索、文件搜索和托管 Shell,可以在 OpenAI 的基础设施中运行。一个远程 MCP 服务器可以远程暴露和运行工具;Responses API 支持这些服务器以及 OpenAI 维护的连接器,默认情况下在共享数据前会请求批准。

一个技能将指令和文件捆绑在一起。将其附加到托管 Shell 上,模型就可以遵循其流程或运行其脚本。它首先会看到技能的名称、描述和路径,然后在选中时读取 SKILL.md

python
1carrier_mcp = {
2 "type": "mcp",
3 "server_label": "carrier",
4 "server_url": "https://example.com/mcp",
5 "allowed_tools": ["track_package"],
6 "require_approval": "always",
7}
8incident_shell = {
9 "type": "shell",
10 "environment": {
11 "type": "container_auto",
12 "skills": [{"type": "skill_reference", "skill_id": "skill_..."}],
13 },
14}
15
16response = client.responses.create(
17 model="gpt-5.6",
18 tools=[carrier_mcp, incident_shell],
19 input="使用事故处理技能调查订单 A-104 延迟的原因。",
20)

这个框架统一了这些表面:MCP 暴露远程工具,技能提供流程和文件,而框架控制着调用在哪里运行。

3. 工具搜索:当上下文成为约束

每个可见的工具定义都会占用上下文。名称、描述和模式会消耗输入令牌,相似的工具会变得更难区分,而一个庞大的 MCP 目录会变成一个巨大的提示词。

工具搜索允许兼容的 GPT-5.4 或更高版本的模型仅在需要时加载延迟定义:

python
1shipping = {
2 "type": "namespace", "name": "shipping",
3 "description": "订单追踪和配送工具。",
4 "tools": [{
5 "type": "function", "name": "get_delivery_eta",
6 "description": "返回订单的预计到达时间。",
7 "defer_loading": True,
8 "parameters": {
9 "type": "object", "required": ["order_id"],
10 "properties": {"order_id": {"type": "string"}},
11 "additionalProperties": False,
12 },
13 }],
14}
15
16response = client.responses.create(
17 model="gpt-5.6",
18 input="订单 A-104 什么时候到?",
19 tools=[shipping, {"type": "tool_search"}],
20)

托管工具搜索从请求中声明的工具中进行选择;客户端执行的搜索可以为当前租户或项目返回工具。搜索会增加一个步骤,所以小型目录可能收益不大。一个延迟函数仍然会暴露其名称和描述,而一个命名空间或 MCP 服务器可以以一个简短的描述开始。加载的工具会被追加以保留缓存前缀。技能延迟加载指令和文件;工具搜索延迟加载可调用的模式。

4. 用于可预测的多工具工作的程序化工具调用

直接调用会将每个结果返回给模型。当结果改变下一个决策时,这很有用,但简单的连接、过滤和并行查找可能会用代码可以缩减的数据填满上下文。

程序化工具调用允许 GPT-5.6 编写 JavaScript,并在一个全新的、隔离的 V8 运行时中运行。V8 在 Chrome 内部运行 JavaScript,但这并非浏览器或 Node.js 环境。它支持顶层的 await、循环、条件和并行调用,但不支持安装包、直接网络访问、通用文件系统、子进程、控制台或持久状态。

Gabriel Chua - inline image

三次直接调用与在隔离的 V8 运行时中的三次并行调用对比。使用 Codex 中的 GPT-Image-2 生成。

当一个程序到达客户端拥有的函数时,它会在你的应用程序运行该调用时暂停;返回其 call_idcaller 会恢复它。carrier_mcp 也可以暂停等待批准,而 output_schema 告诉 JavaScript 它可以检查哪些字段。

python
1for tool in (order_tool, carrier_mcp):
2 tool["allowed_callers"] = ["programmatic"]
3
4response = client.responses.create(
5 model="gpt-5.6",
6 tools=[
7 order_tool,
8 carrier_mcp,
9 {"type": "programmatic_tool_calling"},
10 ],
11 input="比较订单 A-104 与承运商状态,并返回延迟证据。",
12)

程序可以调用函数和自定义工具、MCP、apply_patch、Shell 和代码解释器,但不能调用网络搜索或文件搜索。顶层的工具搜索必须在程序启动前加载一个延迟工具;正在运行的程序无法搜索工具。

当下一步需要模型判断、批准、引用或副作用时,请保持直接调用。当明确的规则允许代码在不丢失证据的情况下返回更小的结果时,请使用程序。托管执行改变了工作运行的位置,工具搜索改变了哪些定义进入上下文,而程序化调用改变了哪些结果被返回。当评估显示正确性得以保持,同时令牌数、延迟或成本得到改善时,可以将它们结合起来使用。

额外技巧:在单个连接上保持长时间的工具循环

如果 Agent 反复在模型和客户端拥有的工具之间切换,Responses WebSocket 模式可以减少持续交互的开销。套接字将你的框架连接到 Responses API;它并不会让工具运行得更快。它接受相同的 response.create 字段用于函数、MCP、工具搜索和程序化工具调用,尽管文档并未对每种组合进行基准测试。OpenAI 观察到,在包含 20 次或更多调用的部署中,执行速度最高可提升 40%,因此请衡量你的工作流程。

在你的 Agent 中尝试一下

获取本文的 Appshot,在 Codex 中打开你的 Agent 项目,然后粘贴以下内容:

使用本文和当前代码库来升级此 Agent 的工具路径。将大型或不常用的工具分组,并启用工具搜索来延迟加载它们。找到有边界的阶段,在这些阶段中,程序化工具调用可以并行运行调用并返回紧凑的结果。将语义决策、批准、引用和副作用保留为直接调用。在更改生产路由之前,比较两种路径在正确性、证据覆盖率、工具成功率、令牌数、延迟、重试次数和成本方面的表现。

二次创作

使用 YouMind 创作爆款文章

收集素材、拆解爆点、生成视觉资产、撰写内容,并在一个 AI 工作空间里完成分发。

了解 YouMind
写给创作者

把你的 Markdown 变成干净的 𝕏 文章

图片上传、表格、代码块,往 𝕏 上手动重排太痛苦。YouMind 把整篇 Markdown 一键转成干净、可直接发布的 𝕏 文章草稿。

试试 Markdown 转 𝕏

更多可拆解样本

近期爆款文章

探索更多爆款文章