推理参数与优化50 条

stop:停止序列

生成命中指定字符串时立即停止:OpenAI 兼容字段 stop 支持单个字符串或数组,常用于切割多轮对话与服务端分节输出。

停止序列是什么

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 是两套互补的刹车:前者管语义边界,后者管最坏情况下的长度上限,两者都建议显式设置。

易错点

  • 选宽泛词(如「总结」「以上」)作停止串:正文里一出现就被切断,表现为回复莫名变短
  • 拿单个换行符作停止串:模型在正文里频繁换行,输出被切成碎片,下游拼接更难
  • 停止串在代码里转义写错(JSON 中 \n 写成了字面量):条件永远不命中,只能顶到 max_tokens 才停
  • 多轮拼接时假设返回文本含停止串:实现或版本一变,拼出的对话格式就错位

数据来源与参考

  • OpenAI API 参考:stop(platform.openai.com/docs)
  • vLLM 官方文档:SamplingParams(docs.vllm.ai)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌