首页/AI/大模型部署与运维速查/finish_reason:结束原因的处理

finish_reason:结束原因的处理

响应里的 finish_reason 说明生成终止原因:stop(正常或命中停止串)、length(达到上限被截断)、tool_calls(转为工具调用)等;网关与前端按它决定后续动作。

finish_reason 是什么

响应里的 finish_reason 说明这次生成为什么停下来:stop 表示正常结束或命中了停止串,length 表示到达输出上限被截断,tool_calls 表示模型转而请求调用工具。网关、前端与统计都应按它决定后续动作,而不是只凭文本看起来是否完整来猜。

基本信息

stop正常结束或命中停止串
length达到 max_tokens 被截断
tool_calls模型请求调用工具
content_filter命中内容过滤(部分实现)
用途决定重试、补全与统计口径

典型使用场景

  • 前端判断回答是否被截断,决定要不要给「继续」入口
  • 网关按长度截断率做质量监控
  • 工具调用链路里判断该走哪个分支
  • 统计平台据此评估提示词与输出上限是否合理
  • 复盘时区分「模型答不完」与「连接断了」
  • 把截断率纳入发布后的观察指标,作为提示词迭代的输入

取值与处理

取值与处理
# 取值速查
# stop           正常结束,或命中停止串
# tool_calls     模型请求调用工具
# length         达到 max_tokens 被截断
# content_filter 命中内容过滤(部分实现)

res = resp.choices[0]
if res.finish_reason == "length":
    pass     # 调大输出上限,或收紧提示词让回答更短
elif res.finish_reason == "tool_calls":
    pass     # 转交工具执行链路

各取值的处理

取值含义处理建议
stop正常结束正常返回给用户
length被上限截断调大上限或改提示词
tool_calls请求调用工具转工具执行链路
content_filter命中过滤按合规策略处理
统计 length 的占比是常见的质量观测:截断率升高,要么是请求变长了,要么是输出上限被改小,两种情况的处理方式完全不同。
流式返回里 finish_reason 出现在最后一个数据块:客户端要在流结束前收齐,否则判断不出这次到底是正常结束还是连接中断。
同一段文本在不同实现里可能给出不同的结束原因:命中停止串常被归为 stop,而达到上限一定是 length,做统计前先对齐一次口径。
把结束原因的处理分支写进客户端示例代码:示例是最有效的规范,文档反而容易被忽略。

易错点

  • 忽略 finish_reason 直接展示:被截断的回答当成完整输出,用户侧表现为话说到一半
  • 把流式中断当成 stop:连接断开与正常结束在文本上难以区分,必须看结束标记
  • 不监控 length 比例:截断率升高不会报错,业务效果却会持续变差
  • 只看第一个候选:多候选或多次调用时,需要逐条判断而不是取一个代表

数据来源与参考

  • OpenAI API 参考:finish_reason(platform.openai.com/docs)
  • vLLM 官方文档:OpenAI 兼容服务器(docs.vllm.ai)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌