千问AI API返回内容截断、JSON缺右括号等问题,本质是max_tokens参数设置不当;需先确认模型上下文总容量,精确计算输入token并预留余量,再按任务类型设定合理值,并确保其位于请求体顶层且为纯整数。

千问AI API返回内容被截断、JSON缺右括号、代码少闭合花括号,本质不是模型“说不完”,而是max_tokens参数没填对或填错位置。你得先确认用的是哪个模型、输入占了多少token、想让输出留多少空间,再动真格。
确认当前模型支持的上下文总容量
打开DashScope控制台 → 进入「用量与配额」→ 点击「配额详情」→ 找到你正在调用的模型(如qwen-plus、qwen-max-1201、qwen-longcontext),查看其标注的「最大上下文长度」。这个数字就是输入+输出的总上限,【max_tokens必须严格小于它】。比如qwen-plus标称32768,那max_tokens最高只能设32767,设成32768会直接返回400错误。
注意:qwen-longcontext虽支持超长上下文,但它的QPM(每分钟调用次数)仅5次,别拿它跑高频短问答。
计算输入prompt实际占用的token数
不能靠肉眼估字数。用官方tiktoken工具或dashscope内置tokenizer对你的完整prompt(含system、user、history所有消息)做精确核算。网页版可粘贴文本到OpenAI Tokenizer(兼容千问分词逻辑)粗略估算,但生产环境必须用dashscope SDK的tokenizer校验。
记得扣减系统指令固定开销(32–64 token)和历史轮次消耗(每轮约10–15 token)。例如你输入prompt经核算占1247 token,又带3轮对话历史(≈45 token),那留给输出的空间只剩:32768 − 1247 − 45 − 64 = 31412。此时max_tokens设31412是理论顶格,但【务必预留至少64 token余量】,否则模型可能在结尾强行截断,导致JSON不闭合或句子半截。
按任务类型设定max_tokens数值
方法一:客服对话类 设为512–1500。够覆盖多轮状态确认+一句解决方案,前端渲染不卡顿,用户一眼扫完。
方法二:技术文档摘要 设为2048–4096。能容纳原文关键句引用+逻辑链推导+三点结论,避免因截断丢失“因此”“综上”等承启词。
方法三:完整Python函数生成 设为3072–6144。尤其当要求含docstring、type hint、异常处理块时,低于3072极易缺try的except分支或少return语句。
方法四:小说章节续写或法律条款解析 启用8192以上,但必须同步将temperature设为0.7、top_p设为0.95,并确认后端模型支持该长度——qwen3.5-27B-pro需显式加请求头X-Qwen-Override-Hard-Limit: true。
在API请求体中正确填写max_tokens
第一步:确保max_tokens是JSON顶层键,不能嵌套在messages或system字段里。错误写法:{"messages": [{"role": "user", "content": "xxx"}, {"max_tokens": 1024}]} → 这个参数会被完全忽略。
第二步:值必须是纯整数,不带引号、不带小数点。错误示例:"max_tokens": "1024" 或 "max_tokens": 1024.0 → API会报400参数类型错误。
第三步:如果同时设置了max_tokens和max_output_tokens,部分后端(如Vertex AI兼容层)会优先采用max_tokens并忽略后者。若你用的是支持max_output_tokens的平台(如Gemini系),则【务必删掉max_tokens字段,只留max_output_tokens】,避免冲突。
这一步操作起来很简单,直接把"max_tokens": 2048加进请求体最外层就行。
[免责声明]如需转载请注明原创来源;本站部分文章和图片来源网络编辑,如存在版权问题请发送邮件至398879136@qq.com,我们会在3个工作日内处理。非原创标注的文章,观点仅代表作者本人,不代表本站立场。
