开始之前
你需要 Python 3,以及三家服务商中至少一家的 API 密钥。步骤用的是 Claude 的 Messages API,因为 Anthropic 的 cookbook 里有现成的循环,每一步也会写出 OpenAI 和 Gemini 上对应的设置。
有两个词要先说清楚。强度是一个有名字的级别,比如 low 或 high,告诉模型要想多用力。思考预算是给思考的 token 额度。较早的 Claude 模型用 budget_tokens 以数字接收它,Gemini 旧的 thinking_budget 参数也是数字。本课里最新的模型改用级别。
各家服务商把设置放在哪里
在三家服务商那里,一次请求需要多少思考仍由模型自己决定,这个设置只是引导它。OpenAI 说它的模型会在不同强度下自适应地推理,简单任务用更少的 token。Google 说 high 是让模型按提示词需要想得尽可能深,并不等于总是用到最大。
| 服务商与 API | 参数 | 可选值 | 默认值与陷阱 |
|---|---|---|---|
| OpenAI,Responses API | reasoning.effort | none、minimal、low、medium、high、xhigh 和 max,因模型而异 | gpt-5.5、GPT-5.6、GPT-6.1 Sol、GPT-6 Sol 和 GPT-6 Luna 默认 medium。GPT-6 Astra 对 none 返回 HTTP 400,GPT-6.1 Sol 不接受 none 和 minimal |
| Claude Sonnet 5.5,Messages API | output_config.effort,同时把 thinking 设为 adaptive | low、medium、high、xhigh 和 max | high。旧的 budget_tokens 写法在这个模型上返回 400 错误 |
| Gemini 4 Argon,Interactions API | generation_config.thinking_level | low、medium 和 high | medium。它对 thinking_budget 返回 400 错误,也不支持 minimal |
同一个任务在每个级别上各跑一遍
cookbook 里的循环把同一条提示词发四次,只改强度。它会为每个级别打印输出 token 数和思考摘要的长度。想看一个级别对你自己的任务有什么影响,这是个省事的办法。
import anthropic
client = anthropic.Anthropic()
max_tokens = 16000
base_messages = [{"role": "user", "content": "<a task from your own work>"}]
for effort in ["low", "medium", "high", "xhigh"]:
response = client.messages.create(
model="claude-sonnet-5-5",
max_tokens=max_tokens,
thinking={"type": "adaptive", "display": "summarized"},
output_config={"effort": effort},
messages=base_messages,
)
summary_chars = sum(len(b.thinking) for b in response.content if b.type == "thinking")
answer = " ".join(b.text for b in response.content if b.type == "text")
print(f"\nWith effort={effort!r}:")
print(f"Output tokens (thinking + answer): {response.usage.output_tokens}")
print(f"Thinking summary length: {summary_chars} characters")
print(f"Final answer preview: {answer[:120]}...")- 从你的工作里挑一个答案能核对的任务,放进
base_messages。 - 运行循环。
usage.output_tokens统计的是完整的思考加上答案,尽管返回给你的摘要更短。 - 把每个答案和你信得过的那份对照,记下第一个够用的级别。
- 至少再运行两遍循环。一次运行是有噪声的,下面的图表就是例子。
- 在 OpenAI 上,调用
client.responses.create并传入reasoning={"effort": effort},读取usage.output_tokens_details.reasoning_tokens。在 Gemini 上,传入generation_config={"thinking_level": level},读取usage.total_thought_tokens。
给思考留出空间,否则得不到答案
容得下答案的上限,可能不够它前面的思考用。OpenAI 的指南说,生成的 token 在出现任何可见输出之前就触到上限时,响应会带着 incomplete 状态和 max_output_tokens 原因返回。输入和推理照样计费,你却拿不到任何可见文字。下面是指南自己的示例,它把上限设成 300 个 token 来演示这项检查。
from openai import OpenAI
client = OpenAI()
prompt = """
Write a bash script that takes a matrix represented as a string with
format '[1,2],[3,4],[5,6]' and prints the transpose in the same format.
"""
response = client.responses.create(
model="gpt-6-astra",
reasoning={"effort": "medium"},
input=[{"role": "user", "content": prompt}],
max_output_tokens=300,
)
if (
response.status == "incomplete"
and response.incomplete_details.reason == "max_output_tokens"
):
print("Ran out of tokens")
if response.output_text:
print("Partial output:", response.output_text)
else:
print("Ran out of tokens during reasoning")- OpenAI:
max_output_tokens把推理、可见输出和格式 token 合在一起限制。OpenAI 建议刚开始时至少预留 25,000 个 token。 - Claude:思考 token 计入
max_tokens,cookbook 用的是 16,000,并注释说思考需要留出余量。 - Gemini 4 Argon:
max_output_tokens把思考和输出合在一起限制。Google 建议保持在 32,768 或更高。
一个级别对 token 数有什么影响
cookbook 保存了它的循环在一道五场讲座排期题上的输出。Claude Sonnet 5.5 在 low 级别产生 1,043 个输出 token,medium 是 794,high 是 1,150,xhigh 是 1,332。同一个笔记本里更早的一次 xhigh 调用用了 1,595。low 和 medium 级别下,思考摘要是空的,cookbook 说 Claude 可能判断某条提示词不需要思考,最可能出现在简单的提示词和较低的强度上。
把它当作一次运行来读。medium 比 low 还少,两次 xhigh 调用相差 263 个 token。强度是在引导一个自适应的模型,并不固定一个数量,所以比较需要重复运行,任务也要难到值得一比。
来源:Anthropic on GitHub: Claude cookbooks, Extended Thinking (2026年11月6日 查阅)
选一个级别
OpenAI 的表格说明了每个级别适合什么。它把 medium 当作大多数工作的默认值,把 xhigh 当作要有证据才用的级别。先从默认值开始。
- Anthropic 在 claude-api 技能里的成本指南,描述了 Anthropic 自己在研究和知识类工作上的测试。low 少了几个点,换来每个任务成本减少三分之一到一半,而 high 相比 medium 没有带来可测量的提升。
- 在长周期编码上,同一份指南报告了真实的取舍。每降一档,通过率少几个点,是个位数,而最高的几档用成倍的成本换来很少的提升。
- 它还建议全部先用低档运行,只把失败的用高档重跑。在 Anthropic 的编码测试里,只要有测试或检查器标出失败项,这样做以略多于一半的成本,达到了全部用高档运行的通过率。
- Claude 在简单任务上想得太多时,Anthropic 的 Opus 4.6 发布文章说要把强度从 high 调到 medium。
| OpenAI 级别 | 指南建议用在什么地方 |
|---|---|
| none | 对延迟极其敏感、推理帮不上忙的工作,比如语音、快速的信息检索和分类 |
| low | 速度和成本重要的工具调用、规划、搜索和多步决策:数据分析、起草、偏执行的编码和客户支持 |
| medium | 大多数工作:智能体编码、研究、电子表格和幻灯片,以及长周期任务 |
| high | 难度高的推理、复杂的调试和深入的规划,质量比延迟更重要。比较 medium 和 high |
| xhigh | 深度研究、长时间的异步运行,以及安全或代码审查。只有评测显示明显收益时才用 |
| max | 你最复杂的任务。如果你在用 xhigh,看看 max 是否更强 |
最低强度下,提示词要写足
OpenAI 的 GPT-5 指南说,GPT-5 的 minimal 推理强度,也就是它最低的级别,比更高级别更依赖提示词。推理 token 少了,内部规划就少了,提示词要多承担一些。这份指南已经归档,是为 GPT-5 写的,所以把下面四点当作你的模型所接受的最低强度下的起步清单,并用自己的任务核对。基础的提示词写法见上一课。
- 要求在最终答案的开头用简短的话说明思考过程。指南说这能提高需要更多智力的任务的表现。
- 要求写详尽的工具调用前言,让用户随时知道进展,指南说这对智能体类工作有帮助。
- 把工具说明写得没有歧义,并加一条提醒:一直做下去,直到请求完全解决。
- 在智能体任务的开头放一段规划。
常见错误
- 给拒绝
none的模型发送none。GPT-6 Astra 返回 HTTP 400,GPT-6.1 Sol 既不接受 none 也不接受 minimal。 - 把一个级别沿用到新模型上。Anthropic 的指南说默认强度因模型而异,每个级别背后的 token 也可能变化,所以要从新模型的默认值开始重新比较。
- 凭一次运行就判断一个级别。Anthropic 的指南认为,单次运行里一两个任务的差别在噪声范围内。
- 用提高强度来弥补含糊的提示词。OpenAI 把强度称作微调旋钮,而不是挽回质量的主要手段。
- 在拒绝旧
budget_tokens调用的模型上继续用它。
自己试一试
- 把你自己的比较运行三次,画出每个级别的输出 token。每次的顺序都一样吗?
- 在 OpenAI 的调用上,把 medium 强度下的
max_output_tokens设为 300,看检查代码会打印出三种结果中的哪一种。 - 选出答案你仍然愿意发出去的最低级别,再在你最难的例子上提高一档,看答案有没有变好。
下一课:判断哪些任务根本需要它
强度是在调一个你已经选好的推理模型。最后一课问的是更早的问题:一个任务到底需不需要推理模型,附上各厂商的建议和两方面的证据。
自测一下
对 GPT-6 Astra 的调用把推理强度设为 none。OpenAI 的指南说会怎样?
查看答案
C. API 返回 HTTP 400 指南说 GPT-6 Astra 不支持 none,设置它会返回 HTTP 400。
发给 Gemini 4 Argon 的请求带上哪个设置,会返回 400 错误?
查看答案
D. thinking_budget Gemini cookbook 说 Gemini 4 Argon 不支持 thinking_budget,对它返回 400 错误。
OpenAI 的响应是 incomplete,原因是 max_output_tokens,也没有返回可见文字。你要为什么付费?
查看答案
B. 输入和推理 token 指南说上限可能在出现任何可见输出之前就触到,所以你可能为输入和推理付了费,却没有得到响应。
在 Anthropic cookbook 保存的 Claude Sonnet 5.5 运行结果里,哪个级别的输出 token 最少?
查看答案
A. medium 保存的输出里 medium 是 794 个 token,low 是 1,043,这说明单次运行不能当作规律。
常见问题
推理强度和回复的详略是一回事吗?
不是。OpenAI 的 GPT-5 指南介绍了另一个 verbosity 参数,它影响的是最终答案的长度,而不是思考的长度。强度控制模型想得多用力,不控制回复有多长。
还需要设置思考预算吗?
最新的模型上不需要。本课里的 Claude 和 Gemini 模型拒绝预算写法,改用级别。较早的 Claude 模型用 budget_tokens,Anthropic 的 SDK 把它记作至少 1,024,并计入 max_tokens。
推理强度越高,答案一定越好吗?
不一定。OpenAI 说只有评测显示明显收益、足以抵消额外延迟和成本时,才用 xhigh,Anthropic 的测试也在某些工作负载上发现曲线是平的。上面的比较能告诉你手头的任务属于哪一种。
为什么我的推理模型没有返回文字?
多半是 token 上限在思考阶段就用完了。在 OpenAI 上,响应的状态会是 incomplete,把 max_output_tokens 调高就能解决。Gemini 和 Claude 也是同样把思考算进上限。
能在对话进行到一半时改变强度吗?
可以,但要小心。OpenAI 说在 GPT-6 及之后的模型上,要在两次响应之间加一个 configuration_update 项,因为这样能保住缓存的提示词前缀。Anthropic 的成本指南说,在两次 Claude 请求之间改变顶层强度,会让消息缓存失效。
资料来源
- OpenAI Docs: Reasoning models https://developers.openai.com/api/docs/guides/reasoning
- OpenAI Docs: Using GPT-6 https://developers.openai.com/api/docs/guides/latest-model
- OpenAI Cookbook: GPT-5 prompting guide (archived) https://developers.openai.com/cookbook/examples/gpt-5/gpt-5_prompting_guide
- Anthropic on GitHub: Claude cookbooks, Extended Thinking https://github.com/anthropics/claude-cookbooks/blob/main/extended_thinking/extended_thinking.ipynb
- Anthropic on GitHub: claude-api skill, cost optimization guide https://github.com/anthropics/skills/blob/main/skills/claude-api/shared/cost-optimization.md
- Anthropic: Introducing Claude Opus 4.6 https://www.anthropic.com/news/claude-opus-4-6
- Anthropic on GitHub: Python SDK, Messages resource https://github.com/anthropics/anthropic-sdk-python/blob/main/src/anthropic/resources/messages/messages.py
- Google Gemini on GitHub: Get started with thinking https://github.com/google-gemini/cookbook/blob/main/quickstarts/Get_started_thinking.ipynb
