Gemini thinking_level 怎么取舍
Gemini 的 thinking_level 分 low/medium/high(部分模型还有 minimal);max_output_tokens 包含思考 token,撞上限会 incomplete 且照常计费。(核验 2026-11-05,F107、F108)
一、Gemini thinking_level 怎么取舍:问题在输出上限吃掉了思考预算
「想得更久就更准」——这句话大体成立,但它掩盖了一个更实际的问题:思考也是要占输出预算的。
官方的机制是这样:max_output_tokens 是硬上限,而且包含思考 token(F108)。当模型想着想着撞到这个上限,它不会「少想一点再答」,而是直接停下来,状态变成 incomplete,输出被截断甚至为空——而已经生成的思考 token 照常计费(F108)。
换句话说,把 max_output_tokens 设小,并不能省钱。你付了思考的钱,却只拿到半截答案。官方对此的建议也很直接:想降成本或降延迟,去降 thinking_level,别去掐输出上限(F108)。
另一个容易忽略的点:档位不是所有模型都一样。gemini-4-argon 与 gemini-3.8-flash 默认 medium,可选范围是 low/medium/high 三档;gemini-3.5-flash-lite 默认 minimal,可选范围是四档(多出 minimal);gemini-3-pro-preview 更窄,只剩 low 与 high(F107)。所以「统一写死 medium」这种团队规范,跨模型时会失效。
二、thinking_level 与输出上限的取舍:最小可运行示例
把「任务复杂度 + 思考量 + 输出上限」三者放进一个判断函数,取舍就有据可依。
## EXPECT: 简单任务 → low | 一致性任务 → medium | 多步任务 → high | 思考占满上限 → 先降档(撞上限仍计费)
LIMIT = 65536
LEVEL_BY_TASK = {"simple": "low", "consistent": "medium", "multi_step": "high"}
def advise(complexity, thought_tokens, max_output=LIMIT):
if thought_tokens >= max_output:
return "先降档(撞上限仍计费)"
return LEVEL_BY_TASK[complexity]
assert advise("simple", 10) == "low"
assert advise("consistent", 10) == "medium"
assert advise("multi_step", 10) == "high"
assert advise("multi_step", LIMIT) == "先降档(撞上限仍计费)"
print(f"简单任务 → {advise('simple', 10)} | 一致性任务 → {advise('consistent', 10)} | "
f"多步任务 → {advise('multi_step', 10)} | 思考占满上限 → {advise('multi_step', LIMIT)}")
最后一条断言是这一节的重点:当思考量已经等于输出上限时,无论任务是难是易,正确动作都不是「再给点预算」,而是「把档位降下来」。
这里要把一个常见误解说清:加大 max_output_tokens 本身不花钱,也不改变模型怎么分配思考。官方说它是基础设施层强制的硬截断,截断归截断,思考预算仍由 thinking_level 决定(F108)。所以「撞了就加上限」的问题不在贵,而在没用——思考会把新预算再吃满一轮。什么时候加上限是对的?当你要的是更长的答案、也愿意为它付钱时,那是 long decode 的用法(见 9.3);而当截断的原因是思考吃掉了预算,该动的是档位。这两种情况看起来都是「输出不够长」,处理方式正好相反。
三、解释与边界:五个判断顺序
第一,先看模型支持哪些档。 写死 minimal 在 Gemini 4 上会落空——它只支持 low/medium/high(F107)。稳妥的做法是从模型配置里读可选档位,而不是在代码里硬编码字符串。
第二,默认值是 medium,但不同模型不同。 Gemini 4 与 3.8 Flash 默认开 medium,3.5 Flash-Lite 默认 minimal(F107)。这意味着「不设档位」不等于「用同一个档位」,跨模型对比延迟时会得出错误结论。
第三,max_output_tokens 要按「输出 + 思考」估。 它包含思考 token(F108)。如果你按「答案大概多长」来设这个值,遇到复杂任务就会撞上限。合理的做法是给一个宽松的上限,用档位去控成本,而不是用小上限去控。
第四,撞上限的代价是双份的。 状态变 incomplete、答案被截断,但思考 token 已经计费(F108)。这等于花钱买了一个不能用的结果。检测方式很直接:看到 incomplete 就先查 max_output_tokens 与思考量的比例,而不是去调提示词。
第五,旧字段是整数预算,不是枚举。 如果你从 generateContent 时代过来,配置里可能还写着 thinkingBudget——那是一个整数,表示「希望模型生成多少思考 token」;thinking_level 是枚举,表示「想多深」(F117)。两者不是同一个维度的开关,官方在 api-reference 里把它标为推荐 Gemini 3 及以后,对更早的模型使用会直接报错。所以迁移要按模型分叉:新模型用 level,老模型留 budget,别在一个配置里混写。这一点和旧键静默失效那类陷阱不同(见 5.2)——它会报出来,反而好查。
档位选择的三个经验值。 字段抽取、分类、格式转换这类「答案空间很小」的任务,low 通常够;代码生成、多段改写这类「需要保持一致性」的任务,medium 更稳;多步数学、跨文档比对这类「一步错步步错」的任务,才值得上 high。这三条不是官方口径,是从错误代价倒推的经验:越是错了就全盘皆输的任务,越值得多花思考 token。
思考 token 也按输出价计。 输出价包含思考 token(F35),所以档位直接乘在账单上:从 medium 调到 high,输出那部分可能明显上涨,而输入部分一分没变。做 A/B 测试时要把这两项分开看,否则很容易误判成「模型变贵了」。
别用「感觉更聪明」当调档依据。 同一个请求跑两次不同档位,输出长度与措辞都会变,人很容易把「更长」当成「更准」。可操作的做法是准备一组带标准答案的样本,固定评分规则再比;没有这个前提,调档只是在换风格。
边界。 本节只谈档位与输出上限的取舍。思考签名的连续性见 9.2;共享 1M 窗口与默认输出上限的预算算法见 9.3;采样参数(temperature 那套)为什么失效,见 4.3。
四、预期输出与异常分支
真跑输出:
简单任务 → low | 一致性任务 → medium | 多步任务 → high | 思考占满上限 → 先降档(撞上限仍计费)
六类分支。为了省钱把 max_output_tokens 设小:思考照常生成、照常计费,输出却更早截断,钱花了答案没了(F108)。全量用 high:延迟与成本一起涨,而多数请求并不需要。写死 minimal:在不支持该档的模型上不生效或报错(F107)。把 incomplete 当成失败重试:重试还是同样的上限、同样的截断,应该先降档。以为不设档位就等于「关掉思考」:多数模型默认开着,但 gemini-2.5-flash-lite 的默认值是 Off(F107)——「不设」不等于统一行为,得去查模型表。用 temperature 试图「更严谨」:新代际已经忽略这类参数,见 4.3。
五、判据卡:循环或截断时先调什么
| 该这么做 | 不该这么做 |
|---|---|
截断就降 thinking_level |
加大 max_output_tokens 硬扛 |
| 按模型读可选档位 | 在代码里写死 minimal |
| 上限按「答案 + 思考」估 | 只按答案长度设上限 |
看到 incomplete 先查上限比例 |
先去改提示词 |
新模型用 thinking_level、老模型留 thinkingBudget |
一个配置里混写两套字段 |
六、来源与核验
https://aistudio.google.com/docs/thinking.md(核验 2026-11-05,F107、F108、F109、F110)https://aistudio.google.com/docs/text-generation.md(核验 2026-11-05,F76)
档位与输出上限属于「模型/价格」档事实,复核周期一个月,见 1.3。各模型支持的档位会随新版本变化,正文里的模型名要跟着模型页一起复核。
七、动手试
- 把
advise最后一个调用的思考量改成LIMIT - 1,重跑。预期返回high;验收标准是你能说清「差一个 token 时为什么还允许开 high,而正好占满时要降档」。 - 给
advise加一个supported_levels参数,传入模型支持的档位列表;当建议的档位不在列表里时,降级到最近的可用档。验收标准:给 Gemini 4 传["low","medium","high"]、给 3.5 Flash-Lite 传含minimal的列表,两次结果都合法。 - 打开你项目里设置
max_output_tokens的那一行,看它是按什么估的。验收标准:能说出「这个值里给思考留了多少」;说不出来,说明它大概率是按答案长度拍的。