OpenAI API 联网搜索工具(web search)怎么用:tools 里加 web_search、引用来源、域名过滤和 external_web_access

想让 API 里的模型先上网查再回答?在 Responses API 的 tools 里加一项 web_search 即可。本文讲输出里的 web_search_call 和 url_citation、域名过滤、用户位置、查看全部来源、search_context_size 与离线缓存模式,以及官方列出的限制。

NNathaniel bigo··原创首发·AI 辅助撰写
9 分钟读完
资料核对于 2026-11-05 · 依据官方文档与公开资料整理 其他 账号
本文根据 OpenAI 官方《Web search》整理,资料核对于 2026-11-05。配图为本站整理的示意图,不是界面截图。代码里的模型名取自官方当天示例,请以官方模型页为准。本站(bigolab.com)不是 OpenAI 官方网站。API 是按用量计费的独立服务,与 ChatGPT 订阅分开计算,Key 的获取见 /guides/openai-api-key。

适用于谁

  • 需要让模型回答“今天发生了什么”“最新版本是多少”这类时效问题的开发者;
  • 已会用 Responses API 发请求(不熟的先看 /guides/openai-responses-api),想给它加联网能力的人;
  • 想在回答里显示来源链接、或限制只在某几个网站里搜的人。

结论先说

  1. 一行就能开:在 tools 里加 {"type": "web_search"},不用自己写搜索代码。
  2. 新接入用 web_search,旧的 web_search_preview 还能用,但不支持域名过滤等新选项。
  3. 模型不一定搜:tool_choice 为 auto 时它自己决定要不要搜,想强制就设 required 或指定这个工具。
  4. 回答里的引用在 annotations,类型是 url_citation;官方要求把行内引用以显眼的可点击链接展示给用户。
  5. 搜索要额外计费:搜索动作有工具调用费用,另外还有模型本身的 token 费用,数字以官方价格页当天为准。

一次联网搜索请求的过程

图:本站根据 OpenAI 官方《Web search》 整理的示意图

一、最小示例

Python:

python
from openai import OpenAI

client = OpenAI()

response = client.responses.create(
    model="gpt-6-astra",  # 以官方模型页当天为准
    tools=[{"type": "web_search"}],
    input="今天有什么积极向上的新闻?",
)

print(response.output_text)

Node.js(保存为 .mjs):

javascript
import OpenAI from "openai";

const client = new OpenAI();

const response = await client.responses.create({
  model: "gpt-6-astra", // 以官方模型页当天为准
  tools: [{ type: "web_search" }],
  input: "今天有什么积极向上的新闻?",
});

console.log(response.output_text);

没有 Key 或还没跑通基础请求的,先看 /guides/openai-api-python-quickstart 或 /guides/openai-api-nodejs-quickstart。

二、响应里有什么

一次带搜索的响应,output 里通常有两类项:

  • web_search_call:记录搜索动作,有 id、status 和 action。action 的类型可能是 search(带查询词)、open_page(打开某个页面)或 find_in_page(在页面内查找)。搜索类动作会产生工具调用费用;
  • message:真正的回答,文字在 content[0].text,引用放在 content[0].annotations。

每条 url_citation 包含 type、start_index、end_index、url、title。其中 start_index 和 end_index 指出这条引用对应回答文字的哪一段,你可以据此在页面上做角标或链接。行内引用默认就带上。官方明确要求:你向用户展示联网结果时,行内引用必须以显眼的、可点击的链接形式呈现。

三、限制搜索范围

域名过滤

用 filters 指定只搜某些网站,或者排除某些网站:

python
tools=[{
    "type": "web_search",
    "filters": {
        "allowed_domains": ["openai.com", "developers.openai.com"],
    },
}]

规则:allowed_domains 与 blocked_domains 各自最多 100 个域名;写域名时不要带协议,写 openai.com,不要写 https://openai.com/;子域名自动包含。这个功能只适用于 Responses API 的 web_search,旧的 web_search_preview 不支持。

用户位置

问“附近有什么”这类问题时,可以给个大致位置:

python
tools=[{
    "type": "web_search",
    "user_location": {
        "type": "approximate",
        "country": "US",
        "city": "Minneapolis",
        "region": "Minnesota",
        "timezone": "America/Chicago",
    },
}]

type 固定写 approximate;country 是两位 ISO 国家代码;city、region 是自由文本;timezone 是 IANA 时区名。

四、查看全部来源

回答里的引用只是模型最终采用的几条。想看它查过的所有网址,请求里加:

python
include=["web_search_call.action.sources"]

官方说这个来源列表通常比引用列表更长。实时数据类来源会带有 oai-sports、oai-weather、oai-finance 这样的标签。

五、几个参数怎么选

web_search 的常用参数

图:本站根据 OpenAI 官方《Web search》 整理的示意图

  • search_context_size:取 low、medium(默认)、high,控制给模型多少搜索上下文。官方特别说明,它不是精确的 token 数,也不保证来源或引用的数量;
  • external_web_access:布尔值,默认 true,即实时联网。设为 false 是只用缓存、不访问外部网络的离线模式;旧的 web_search_preview 会忽略这个参数;
  • tool_choice:auto 时模型可能直接回答不去搜,要保证搜索就用 required 或指定该工具;
  • return_token_budget:只用于托管的 web_search 与 GPT-5 及以上的推理模型,取值 default 或 unlimited,官方提醒 unlimited 可能增加延迟和费用,要谨慎,长任务可配合 background: true。

六、官方列出的限制

  • 联网搜索的上下文窗口最多 128k,不管模型本身窗口多大;
  • 速率限制沿用底层模型的分级限制,提高限额的办法见 /guides/openai-api-usage-tiers-rate-limits;
  • 官方提醒:gpt-5.4 搭配推理强度 none 可能得到质量较低的搜索结果;仍在用 gpt-5 的,推理强度要高于 minimal;
  • Chat Completions 里只有 gpt-5-search-api 一个搜索模型,它每次回答前都会先搜,但不支持域名过滤、来源列表、实时访问控制;官方建议仅为保持旧集成才用;
  • 安全上,官方建议把公开网页搜索和访问私有数据的 MCP 查询放在不同请求里,以降低提示注入的风险;
  • 官方页面还提到一些旧的搜索预览模型已经安排下线,如果你的代码还在用,请到官方页面核对日期。

常见问题

Q:为什么有时候明明开了工具,模型没搜?

tool_choice 默认是 auto,模型认为不需要就不会搜。要强制搜索,把它设为 required。

Q:能不能让搜索结果只来自我信任的网站?

用 filters.allowed_domains,最多 100 个域名。

Q:怎么在界面上显示来源?

读 annotations 里的 url_citation,用 url 和 title 做链接,并按官方要求让链接显眼可点击。

Q:要不要同时让回答按固定格式输出?

可以,格式化输出见 /guides/openai-api-structured-outputs;让模型自己调用你写的函数见 /guides/openai-api-function-calling。

Q:遇到 429 或其他报错?

按 /guides/openai-api-error-codes 排查。价格见 /guides/openai-api-price-official-table,以官方当天为准。

参考资料

  • OpenAI 官方:Web search — https://developers.openai.com/api/docs/guides/tools-web-search

Nathaniel 的更多内容

  1. 01

    Claude Code 处理大仓库:怎么让它只看需要的目录(子目录 CLAUDE.md、claudeMdExcludes、deny 规则)

    仓库太大,Claude Code 总在读无关文件、读进别的包的规则?本文按官方大仓库指南讲:从哪个目录启动、子目录 CLAUDE.md、claudeMdExcludes、Read 的 deny 规则、worktree.sparsePaths、additionalDirectories,以及一份合并后的配置示例。

    Claude0
  2. 02

    Claude Code 在 CI 里跑:从本机 claude -p 到 GitHub Actions 的完整例子(自动审 PR、控成本)

    一条线走完 Claude Code 的 CI 用法:先在本机用 claude --bare -p 配 --json-schema 跑通,再写进 GitHub Actions 用 claude-code-action@v1 自动审 PR,最后加上 --max-turns、超时、并发限制来控成本,并附上常见故障的排查顺序。

    Claude0
  3. 03

    Claude Code 自定义 subagent 实例:测试员、调试员、只读调研员、只读数据库员怎么写

    四个可直接改的 subagent 实例:跑测试的 test-runner、找根因的 debugger、只读调研员、用 PreToolUse hook 限成只读 SQL 的 db-reader;讲 tools、disallowedTools、model、maxTurns 怎么配,怎么点名调用。

    Claude0
  4. 04

    Claude Code 的 CLAUDE.md 模板:前端、后端、数据分析各一份,附拆分与自检方法

    直接拿去改的三份 CLAUDE.md 模板(前端、后端、数据分析),每份都控制在官方建议的 200 行以内;再讲怎么用 .claude/rules 的 paths 拆出专属规则、用 @ 导入长文档,以及用 /context all 和 /doctor prompt-audit 检查是否生效。

    Claude0
  5. 05

    Claude Code 自己写一个插件并发布到 marketplace:plugin.json、marketplace.json、validate 到团队安装的完整流程

    想把自己写的 Skill、Hook 打包给团队用?按 Claude Code 官方 Plugins 文档,从目录结构、plugin.json、claude plugin validate,到写 marketplace.json、推到 Git、让同事一条命令安装,再到版本更新,走完一遍完整流程。

    Claude0
  6. 06

    Claude Code 写一个会自动触发的 Skill:从需求到触发,用 description、when_to_use 和 paths 控制它什么时候出场

    写好的 Skill 总是不触发,或者什么都触发?本文按 Claude Code 官方「Extend Claude with skills」走一遍完整实例:把「改数据库迁移前先检查」写成一个会自动出场的 Skill,包含 description、when_to_use、paths、附带脚本、触发测试和评估。

    Claude0

同产品的其他教程

  1. 01

    ChatGPT 闪卡(flashcards)和互动小测(quizzes):是什么、怎么触发、谁能用

    ChatGPT 现在能直接做可翻面的闪卡,也能在对话里出题让你作答。本文按官方发布说明讲这两个功能是什么、怎么要求 ChatGPT 生成、闪卡怎么翻面自评和保存、各自在哪些套餐和设备可用,并给出几条自拟的提示词写法。

    ChatGPT0
  2. 02

    ChatGPT 手机端「切换账号」(Switch account):同时登录两个账号怎么加、怎么切、哪些东西互不相通

    ChatGPT 的 iOS 和 Android 应用正在推送账号切换:最多同时保持登录 2 个账号,在 Settings > Switch account 里添加、切换、退出。本文按官方帮助页讲步骤、限制、通知、订阅归属,以及它和切换工作区的区别。

    ChatGPT0
  3. 03

    ChatGPT 锁定对话(Locked chats):是什么、怎么开、谁能用,以及它不能做到什么

    ChatGPT 的 Locked chats 能把指定对话从历史、置顶和搜索里藏起来,用 4 位 PIN 或设备验证打开。本文讲怎么锁、怎么解锁、忘了 PIN 的后果,以及官方明确说它不做的事(不是加密、不改保留期限)。

    ChatGPT0
  4. 04

    OpenAI API 文件上传与 PDF 输入怎么写:input_file、file_id、file_url、base64 和 50 MB 限制

    想让模型读你的 PDF、Word 或 CSV?Responses API 用 input_file 传文件,有 file_id、file_url、base64 三种方式。本文讲 Files API 上传、purpose 怎么选、单文件和单请求 50 MB 限制、各类文件怎么解析,以及什么时候该改用文件搜索。

    ChatGPT0
  5. 05

    OpenAI API 的 token 怎么算、怎么估算费用:input_tokens 计数接口、tiktoken 和隐藏的输出 token

    发请求前想知道会用多少 token?官方有 Responses 的 input_tokens 计数接口,能把文字、图片、文件、工具定义一起算准;本地 tiktoken 只适合纯文本。本文给 Python 和 Node 示例,讲输出 token 为什么可能比看到的多,以及怎么估算费用。

    ChatGPT0
  6. 06

    OpenAI API Node.js / TypeScript 快速上手:npm install openai、example.mjs 第一个请求,到流式、函数调用、联网搜索

    用 Node.js 调 OpenAI API:设置 OPENAI_API_KEY 环境变量,npm install openai,新建 example.mjs,用 client.responses.create 发出第一个请求。并列出图片、文件、流式、函数调用、联网搜索和错误捕获的 Node 写法。

    ChatGPT0

0 条评论

登录 后参与评论

还没有评论,来抢沙发~