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 用户:
finishReason为SAFETY或BLOCKLIST即是 - 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:
- 关 VPN(特别是中国大陆)
- 切到不同浏览器(Chrome → Safari)
- 关闭其他后台标签(Chrome 会限制后台流式)
- 用 aistudio.google.com(接口更稳定)
Step 5:Markdown 渲染问题
- 刷新页面看是否能渲染完整
- 让 Gemini “不用 markdown 输出,纯文本”
- 输出长表格时拆成多个小表
Step 6:上下文 over 时清空对话
如果对话历史已经 200K+ tokens,每次新输出空间都被压缩:
- 新建对话
- 把之前需要的内容总结成 < 5K tokens 的 brief
- 在新对话里复用 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 上下文比预期短
- Gemini 没响应
- Gemini Canvas 加载失败
- Gemini App 安卓多设备不同步
- Gemini Canvas 撤回还原不生效
- Gemini 深度研究长主题超时
- Gemini 回复语言不对怎么办:3 个原因 + 修复路径
- Gemini 在 Android 上没替换 Assistant
- Gemini Deep Research 结果太浅
- Gemini 导出 / 分享不可用
- Gemini 里的 Imagen 把正常 prompt 当违规拦下
- Gemini 视频上传被拒 / 不支持该文件类型
- Gemini Gems 保存失败或消失
- Gemini 2.5 Pro Thinking 模式中途停下
- Gemini 语音模式中断或听不到