停止序列是什么
stop 是生成参数,用来界定「模型说到哪里算说完」:模型逐 token 输出时一旦命中指定的字符串,就立刻结束本次生成,不再继续。它常用于切割多轮对话、限定回答范围,以及让服务端按固定标记取数。OpenAI 兼容接口用 JSON 字段 stop,vLLM 离线推理用 SamplingParams 的 stop。
基本信息
| 字段名 | stop(OpenAI 兼容与 vLLM 均为 stop) |
|---|---|
| 取值 | 单个字符串,或字符串数组 |
| 数组长度上限 | 随实现而异,以所用版本文档为准 |
| 命中后 | finish_reason 为 stop;长度截断则为 length |
| 返回值 | 多数实现不把命中的停止串包含在返回文本中 |
典型使用场景
- 多轮对话截断:命中「用户:」这类角色标记就结束,防止模型替用户继续编
- 结构化标记:要求模型以 </answer> 收尾,服务端按标记切出正文
- 批量离线生成统一长度:给每条样本一个共同的终止条件
- 把长输出切成可解析段落,便于后续规则处理
- 评测时固定终止条件,避免不同样本的结束位置不可比
请求与离线两态
请求与离线两态
# OpenAI 兼容请求:stop 可以是字符串,也可以是数组
# {"model": "<模型名>", "messages": [...], "stop": ["\n\n用户:", "</answer>"]}
from vllm import SamplingParams
sp = SamplingParams(temperature=0.7, max_tokens=1024, stop=["</answer>"])
# 校验:构造一个必然输出停止串的 prompt,确认返回文本确实在停止串处结束停止与截断的区别
| 情况 | finish_reason | 文本表现 | 排查方向 |
|---|---|---|---|
| 命中停止串 | stop | 在停止串处结束,语义完整 | 回复莫名变短说明停止串选得太宽 |
| 达到长度上限 | length | 被硬截断,可能断在半句 | 上调 max_tokens 或检查是否死循环 |
| 流式场景中断 | 同上 | SSE 连接提前关闭 | 客户端要能处理未收到完整结构的情况 |
返回内容是否包含停止串因实现而异,多数不含;做多轮拼接时不要假设它一定在或一定不在,用统一的后处理逻辑处理。
stop 与 max_tokens 是两套互补的刹车:前者管语义边界,后者管最坏情况下的长度上限,两者都建议显式设置。