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,做统计前先对齐一次口径。
把结束原因的处理分支写进客户端示例代码:示例是最有效的规范,文档反而容易被忽略。