deepseek输出被截断主因是max_tokens设小或未与prompt长度、模型硬限(如n_predict)、部署框架(vllm/ollama)参数对齐;需动态计算可用token余量,检查usage.output_tokens是否达设定值,并同步调高maxitertimes、max_model_len等底层限制。
☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 多模态理解力帮你轻松跨越从0到1的创作门槛☜☜☜

DeepSeek 输出被截断,八成是 max_tokens 设小了,而不是模型“说不完”——它严格按你给的数值停笔,哪怕句子正说到一半。
为什么改了 max_tokens 还是被截断?
常见错误现象:调高到 4096,结果输出仍卡在 2000 字左右就停;或响应时间变长但长度没增加。
- 输入 prompt 本身占了大量 token,
max_tokens是“新增 token 上限”,不是总长度。例如上下文窗口为 32768,prompt 已占 30000,那再设max_tokens=4096也顶多生成 2768 个新 token,超出部分会被静默丢弃 - 用的是蒸馏小模型(如
deepseek-r1-distill-qwen-1.5b),其底层n_predict硬限制可能只有 800,API 层设置再高也无效 - 服务端部署时启用了
vLLM或Ollama,但未同步调大n_predict或max_model_len,导致请求在推理引擎层就被截断
max_tokens 和 max_new_tokens 到底该用哪个?
两者语义接近,但行为差异关键:
-
max_tokens是 DeepSeek 官方 API 的标准字段,含义明确:只计新生成 token 数,不含输入 -
max_new_tokens多见于 Hugging Face Transformers 接口或本地部署场景,作用相同,但部分旧版 wrapper 会误将其与max_length混用(后者含输入) - 如果你看到输出意外包含 prompt 片段或开头重复,大概率是误用了
max_length;确认日志里实际生效的是max_new_tokens还是max_tokens
不同模型对 max_tokens 的真实承载能力
不能只看文档写的“支持 32768”,必须查你当前调用的具体模型版本和部署方式:
-
deepseek-coder-7b:实测安全上限约2048,设到4096易触发流式中断或首 token 延迟飙升 -
deepseek-r1-distill-llama-8b:默认n_predict=512,需在 Ollama 中显式配置--n-predict 2048才能放开 -
deepseek-chat-7b(原生版):可稳定跑max_tokens=2048,但若输入已超 30k token,则实际输出必然小于 2048 - 使用
vLLM部署时:max_tokens > 3072会导致分页 attention 调度压力陡增,建议分段生成
怎么验证 max_tokens 真生效了?
别只看输出长度,重点检查返回体里的 token 统计字段:
- API 响应中务必读
usage.output_tokens,如果它明显小于你设的max_tokens,说明是模型提前结束(可能是stop_sequence触发,或内容自然收尾) - 如果
output_tokens == max_tokens,且输出在句中戛然而止(比如停在“因此,综上所述——”),那就是真被截断,该继续加 - 本地部署时,开 debug 日志,搜
generated length或exceeds n_predict,比前端表现更准
真正麻烦的不是设多少,而是你得同时盯住三层:API 请求参数、模型自身的硬性 n_predict 限制、以及部署框架(Ollama/vLLM)的运行时配置。少一层对齐,max_tokens 就只是个摆设。










