跳转到内容

4.3 max_tokens 与思考过程的配合

R1 的 max_tokens 包含思考过程——设太小,AI "想"到一半就被掐断了,最终回答可能为空。


这一节在讲什么?

max_tokens 是控制 AI 输出长度的参数,但在 R1 和 V3 中的含义不同。V3 的 max_tokens 只限制最终回答的长度;R1 的 max_tokens 限制的是思考过程 + 最终回答的总长度。如果你不理解这个区别,可能会遇到"R1 输出为空"的诡异问题——不是因为 AI 不想回答,而是思考过程把 max_tokens 用完了,留给最终回答的空间为零。这一节我们详细讲解 max_tokens 在两种模式下的差异和设置建议。


V3 的 max_tokens

V3 的 max_tokens 限制模型生成的 token 数(不包括输入):

V3 的 max_tokens 含义:

  输入消息(不计入 max_tokens)
  → 模型生成(计入 max_tokens)
  → 如果生成超过 max_tokens,输出被截断

  示例:
  max_tokens=4096
  → 模型最多生成 4096 token 的回答
  → 如果回答需要 5000 token,输出会在 4096 处被截断
  → finish_reason 为 "length"

V3 的 max_tokens 设置建议:

场景推荐 max_tokens说明
简单问答1024短回答足够
代码生成4096大部分代码不超过 4096 token
长文生成8192(Beta)需要使用 Beta 端点

R1 的 max_tokens

R1 的 max_tokens 限制的是思考过程 + 最终回答的总长度

R1 的 max_tokens 含义:

  输入消息(不计入 max_tokens)
  → 思考过程(计入 max_tokens)  ← 关键区别!
  → 最终回答(计入 max_tokens)
  → 如果思考过程 + 最终回答超过 max_tokens,输出被截断

  示例:
  max_tokens=8192
  思考过程消耗 7000 token
  → 留给最终回答的空间只有 1192 token
  → 如果最终回答需要 2000 token,输出会被截断

  极端情况:
  max_tokens=4096
  思考过程消耗 4000+ token
  → 留给最终回答的空间为 0
  → 最终回答为空字符串!

这就是为什么有些用户会遇到"R1 输出为空"的问题——不是模型不想回答,而是思考过程把 max_tokens 用完了。


R1 的 max_tokens 设置建议

场景推荐 max_tokens说明
简单推理8192思考过程通常 2K-5K token
中等推理16384思考过程通常 5K-10K token
复杂推理32768思考过程可能 10K-20K token
极端复杂65536数学证明、复杂算法设计

关键原则:R1 的 max_tokens 至少设 8192,宁可设大也不要设小。

python
# ❌ 危险:R1 的 max_tokens 设太小
response = client.chat.completions.create(
    model="deepseek-reasoner",
    messages=[{"role": "user", "content": "证明根号2是无理数"}],
    max_tokens=4096  # 思考过程可能就用完了!
)

# ✅ 安全:R1 的 max_tokens 设大一些
response = client.chat.completions.create(
    model="deepseek-reasoner",
    messages=[{"role": "user", "content": "证明根号2是无理数"}],
    max_tokens=16384  # 给思考过程和最终回答留足空间
)

检测思考过程是否被截断

你可以通过 finish_reason 判断输出是否被截断:

python
response = client.chat.completions.create(
    model="deepseek-reasoner",
    messages=[{"role": "user", "content": "..."}],
    max_tokens=8192
)

finish_reason = response.choices[0].finish_reason

if finish_reason == "length":
    print("⚠️ 输出被截断!思考过程可能占用了太多 token")
    print("建议增大 max_tokens 或简化问题")
elif finish_reason == "stop":
    print("✅ 输出完整")

常见误区

误区一:R1 的 max_tokens 只限制最终回答

不是。R1 的 max_tokens 限制的是思考过程 + 最终回答的总长度。如果你按 V3 的习惯设 max_tokens=4096,R1 的思考过程可能就把 4096 token 用完了,最终回答为空。

误区二:max_tokens 设越大越好

设太大不会影响质量,但会影响费用——max_tokens 只是上限,模型不会为了"用满" max_tokens 而生成更多内容。但设太大可能让你放松警惕,不注意实际的 token 消耗。建议根据任务复杂度选择合适的值。

误区三:R1 输出为空是 API 的 bug

不是 bug,是 max_tokens 设太小。R1 的思考过程消耗了大量 token,留给最终回答的空间不足。解决方法是增大 max_tokens。

误区四:思考过程的 token 不计入费用

思考过程的 token 按 output 价格计费——跟最终回答的 token 价格一样。R1 的思考过程可能消耗 10K-30K token,这会显著增加 API 费用。使用 R1 时要特别注意 token 消耗。


小结

这一节我们学习了 max_tokens 在 V3 和 R1 中的区别:V3 的 max_tokens 只限制最终回答,R1 的 max_tokens 限制思考过程 + 最终回答的总长度。R1 的 max_tokens 至少设 8192,复杂推理设 16384-32768。如果 R1 输出为空,检查 max_tokens 是否设太小。下一章我们进入 Function Calling 与 Agent 构建。

基于 MIT 许可发布