回答到关键处突然停住,没有报错也没有结束语。把响应打出来看,finish_reason 是 length,说明输出达到上限被截断了。

先读 finish_reason

r = client.chat.completions.create(...)
print(r.choices[0].finish_reason)

stop 是正常结束,length 是被 max_tokens 截断,content_filter 是内容被拦。只有 length 才需要调长度。

三种处理方式

  • 调大 max_tokens,但要留出输入占用的空间
  • 把长回答拆成多轮,要求先给结论再展开
  • 用流式接收,判断截断后带上已有内容请求续写
messages.append({"role": "assistant",
    "content": partial})
messages.append({"role": "user",
    "content": "从上一个字继续,不要重复"})

续写时要明确告诉模型不要重复已有内容,否则很容易从头再说一遍。长文档生成建议分段请求,每段单独校验,比一次要几千字稳定得多。

另外注意输入加输出不能超过模型上限,输入太长时调大输出上限也没用,会直接报上下文超限。

把它当成一个可观测指标

把 finish_reason 按 stop、length 分开统计,length 比例突然上升,通常意味着提示词变长或者输出要求变复杂了。这个比例比人工抽查更早发现问题。

产品侧也要兜底,截断时在界面给出「继续生成」按钮,比让用户自己发现半句话要体面得多。

作者 9823189