Gemini 2.5 输出被截断:3 个原因 + 修复路径

回答到一半"…"就停了——max output tokens、安全过滤、网络中断三类。

Gemini 2.5 回答写到一半就停了,结尾经常是个 或半句话——按经验,70% 是 max output tokens 限制触顶,20% 是安全过滤静默截断,剩下 10% 是前端流式连接断了。这三种症状几乎一样,但修复方式完全不同:让它”继续”对前两种有效,对第三种是把缓存的内容当成功输出再次提交。

要根除截断,先判断是哪一类,再分别处理。

常见原因

按出现频率:

1. 输出超过 max_output_tokens(最常见)

Gemini 2.5 Flash 默认 8K tokens 输出上限,Pro 是 64K。如果你让它写一篇 1.5 万字的报告,Flash 必然在 8K 处戛然而止。AI Studio / API 调用都受这个限制;Web 版(gemini.google.com)默认上限更低,大概 4-6K。

如何判断

  • API 用户检查响应的 finishReason,值为 MAX_TOKENS = 这条
  • Web 用户:输出停在大约同样的字数(比如总在 3000 字附近停)

2. 安全过滤静默截断

Gemini 在写到敏感话题时会突然截断且不报错。常见触发点:

  • 涉及人物姓名 + 负面动作(暴力 / 自残 / 性)
  • 医疗 / 法律建议
  • 政治敏感话题
  • 含未成年人的虚构场景

如何判断

  • API 用户:finishReasonSAFETYBLOCKLIST 即是
  • Web 用户:截断点附近的话题是否敏感

3. 前端流式连接中断

stream 连接被 VPN 切换、网络波动、浏览器后台标签限流打断。输出停在很短的字数(< 100 字),且对话状态显示”还在生成”。

如何判断:浏览器 DevTools → Network 看到 SSE 连接 connection reset / timeout

4. Markdown 渲染卡死

输出本身完成了,但前端渲染长 markdown(特别是表格或代码块)卡死,显示像被截断。刷新就能看到完整内容。

如何判断:刷新页面后内容能看到完整版。

5. 模型不支持的语言段触发回退

Gemini 在写长篇时混入小众语言(古希腊语 / 罕用符号),可能触发 fallback 提前结束。

6. 单次输出超过模型 context window

Gemini 2.5 Pro 输入上下文 2M tokens,输出上下文 64K。如果对话历史已经吃掉绝大部分 context,留给本次输出的空间被压缩。

最短修复路径

按截断类型分别处理:

Step 1:先回一句”继续”

最简单也最快:

继续刚才的输出

或英文:

Continue from where you stopped

Gemini 通常会从上次截断处继续。命中场景:max_tokens 类型。失败常见原因是 safety filter——这时换 Step 3。

Step 2:API 用户增大 max_output_tokens

from google import genai
client = genai.Client()

response = client.models.generate_content(
    model="gemini-2.5-pro",
    contents="...",
    config=genai.types.GenerateContentConfig(
        max_output_tokens=64000,    # Pro 上限 64K
    )
)

Flash 上限是 8K,Pro 上限 64K。如果你需要更长,切到 Pro。

Step 3:拆分输出请求(解决 safety filter)

如果继续无效或截断点附近有敏感词:

请把这份报告分成 5 个章节,每次只输出一个章节并等我说"继续"再写下一章。
现在先输出第 1 章。

把整体生成切成 5 段,每段单独通过 safety filter——通常都能过。

Step 4:流式连接问题排查

如果是 Step 3 失败而且不是 safety:

  1. 关 VPN(特别是中国大陆)
  2. 切到不同浏览器(Chrome → Safari)
  3. 关闭其他后台标签(Chrome 会限制后台流式)
  4. aistudio.google.com(接口更稳定)

Step 5:Markdown 渲染问题

  • 刷新页面看是否能渲染完整
  • 让 Gemini “不用 markdown 输出,纯文本”
  • 输出长表格时拆成多个小表

Step 6:上下文 over 时清空对话

如果对话历史已经 200K+ tokens,每次新输出空间都被压缩:

  1. 新建对话
  2. 把之前需要的内容总结成 < 5K tokens 的 brief
  3. 在新对话里复用 brief,让 Gemini 有空间输出

Step 7:API 用户检查 finishReason 自动处理

result = client.models.generate_content(...)
finish_reason = result.candidates[0].finish_reason

if finish_reason == "MAX_TOKENS":
    # 自动续写
    continuation = client.models.generate_content(
        contents=[result.candidates[0].content, "Continue from where you stopped"]
    )
elif finish_reason == "SAFETY":
    # 拆分请求
    ...

预防建议

  • 长输出任务开头先说”分 N 段输出,等我说继续”,避免一次超限
  • API 调用永远把 max_output_tokens 设到模型上限(Pro: 64K, Flash: 8K)
  • 涉及敏感话题(医疗 / 法律 / 安全)的报告,主动拆 5 段,每段单独提交
  • API 用户检查 finishReason,自动续写 MAX_TOKENS 截断
  • 长对话超过 100K tokens 时新建对话,避免输出空间被压缩

相关阅读

标签: #Gemini #排查