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