DOCAI · 概念 · L2
stop 序列怎么用,什么时候会误伤
遇到指定字符串就停止生成;它擅长截断格式,不擅长做内容安全。
它是什么
停止序列是请求里的一个或一组字符串。模型生成过程中一旦写出匹配内容,就立即停止,不再往下生成。字段名因厂商而异:Anthropic 用 stop_sequences,OpenAI 的 Chat Completions 用 stop。
它和 max_tokens 的区别在触发条件:max_tokens 按数量停,停止序列按内容停。前者防止写太长,后者防止写过界。
关键细节:触发停止的序列通常不会出现在返回正文里。OpenAI 的文档明确说返回文本不包含停止序列;Anthropic 会在响应的 stop_sequence 字段里告诉你命中的是哪一个。这个设计适合截断结构化输出,但有一个后果:你无法靠搜索正文判断有没有触发停止,只能看停止原因或专门字段。
怎么工作
匹配是字面匹配。传 END 就是找这个字符串本身,不是正则,也不是语义判断。它不区分「这是标记」还是「正文里刚好写到这个词」,只要出现就停。
生成按 token 流推进,停止序列可能跨 token 边界。服务端一般会做缓冲,等拼够再判断;如果停止逻辑在客户端,你必须自己维护尾部缓冲:每来一个分片,先追加到缓冲区,再在缓冲区里找完整序列。逐块独立查找会漏掉跨块的匹配,尤其是标记被拆成两半的时候。流式处理的基础见什么是流式。
触发之后,响应会给出原因。Anthropic 返回 stop_reason: "stop_sequence",并在 stop_sequence 字段里带上命中的字符串;OpenAI 的 finish_reason 是 stop,但这个值既可能是自然结束,也可能是命中了停止序列,不额外说明是哪一个。需要区分时,只能靠请求里配置的序列和正文尾部自己判断。
常见误解
「stop 序列可以做安全过滤。」 它只能让生成提前结束,不能撤回已经流式发出的内容,也挡不住模型换一种说法。安全判断应该放在输入审核、输出审核和策略层,而不是一个字符串列表里。
「命中停止序列会把前半段也删掉。」 不会。前半段已经生成,通常照常返回;停止序列本身才是不返回的那部分。如果你的业务不能接受前半段,需要在调用方丢弃,而不是指望参数。
「空字符串最安全,表示不限制。」 空串行为各家不一致:有的直接报参数错误,有的会立即停止。官方未说明统一行为,最稳妥是不要传空串;不想限制就不传这个字段。
「停止序列不会误伤。」 常见词、单个标点、换行都可能出现在正常内容里。比如把「结束」当停止串,模型在正文里解释「结束」时就会被自己截断。
什么时候用
- 固定格式收尾:生成到某个结束标记就停,省掉后面的客套话。
- 只取第一段:用明确的分段标记截断,避免模型继续写第二段。
- 控制模板输出:在模板末尾放一个不会自然出现的哨兵字符串。
- 多候选拼接:候选之间用标记分隔,调用方按标记切分。
怎么排查
- 输出异常短:先看停止原因和
stop_sequence字段,确认是不是命中了配置。 - 正文里找不到停止串:这是正常的,很多实现本来就不返回它。
- 流式结果少一截:检查客户端缓冲区是否在没处理完时就结束了拼接。
- 中文内容被截断:检查停止串是不是常见字词,换成更长、不会自然出现的标记。
- 关闭后仍然短:看 max_tokens 是不是设得太小,或者模型自己自然结束了。
什么时候用得上
当你生成固定格式、要切掉多余的结尾标记,或在一段输出里只想要第一段时,用停止序列比生成后再裁剪更省。
常见误解
很多人把 stop 序列当成敏感词过滤器,以为命中就会拦下内容。它只让生成提前结束,不会撤回已经写出的前半段;停止串通常也不会出现在正文里,靠它判断是否命中会失真。