Stop sequences (language models) — 停止序列
Stop Sequence (停止序列) 在大型语言模型 (LLM)的语境中,是一种特殊的字符或词元序列,它向模型发出信号,要求停止生成文本[1]。该机制是自回归语言模型的重要组成部分,可确保以可控和可预测的方式完成响应。
使用停止序列时,模型在生成的每个步骤都会检查已生成的文本是否以指定的序列之一结尾。如果找到匹配项,生成过程将立即停止,而停止序列本身不会包含在最终输出中[2]。这使得开发者能够精确控制响应的边界,而无需更改请求本身。
基本工作原理
在自回归语言模型中,文本是逐个词元顺序生成的。在每个步骤中,模型会根据之前的所有序列(输入提示和已生成的文本)预测下一个词元。在数学上,这表示为条件概率:
其中 是当前生成的词元, 是先前生成的词元序列,而 是输入序列[3]。
停止序列机制是中断此迭代过程的外部标准。
停止序列的类型
存在几种主要的停止机制类型,它们可以单独使用,也可以组合使用。
1. 序列结束 (EOS) 词元
End-of-Sequence (EOS) 是一些特殊的词元(例如 `<|endoftext|>`),它们被内置在模型的词汇表中,用于表示文本逻辑片段的结束。模型被训练在认为响应完成时生成 EOS 词元,因为训练数据集中的所有文本都以该词元结尾[4]。当检测到 EOS 词元时,生成会自动停止。
研究表明,EOS 词元的存在会影响注意力架构:模型会发展出内部的位置计数机制,但这可能会限制其在处理远超训练样本长度的序列时的外推能力[5]。
2. 自定义序列
这些是开发者为特定任务设置的任意字符串。它们不是模型词汇表的一部分,而是在字符级别进行跟踪。示例包括:
- 换行符:`\n` 或 `\n\n`,用于在段落后停止。
- 上下文标记:`Human:`、`User:` 或 `Q:`,用于在对话中分隔话语。
- 特殊标记:`###`、`</output>` 或 `END`。
3. 结构化序列
这些是用于完成特定结构化元素的专用标记,在生成格式化内容时至关重要[1]:
- 代码:三个反引号 (```) 用于结束代码块。
- JSON/XML:闭合括号 (`}`) 或标签 (`</element>`)。
技术实现与问题
有效检测停止序列是一项复杂的任务,伴随着一系列难题。
检测算法与优化
实际系统中的检测过程包括:
- 每步检查:在生成每个新词元后,系统会检查当前输出是否以指定的停止序列之一结尾。
- 处理部分匹配:系统必须跟踪序列的一部分已经生成但尚未完全匹配的情况。
- 多标准检查:大多数系统(例如 OpenAI API)允许同时跟踪多个(最多四个)停止序列[2]。
在 Hugging Face Transformers 框架中,为此实现了抽象类 `StoppingCriteria`,它允许创建自定义的停止标准,例如 `MaxLengthCriteria`(按长度)或 `EosTokenCriteria`(按 EOS 词元)[4]。
问题与限制
- 分词问题:这是主要的技术难题。同一字符序列(例如 `\nUser:`)可能会根据上下文以不同方式被分词。这使得可靠检测变得复杂,因为停止序列可能会被分割到多个词元中[5]。
- 性能:在每个步骤检查多个长停止序列可能会减慢生成速度,尤其是在实时处理长序列时。
- 误报:指定的序列可能会在期望的响应中间偶然出现,导致过早终止。因此,选择足够独特和特定的标记非常重要(例如 `\n###\n`)[6]。
应用与使用场景
停止序列是控制 LLM 行为的强大工具。
- 控制长度和成本:允许限制响应的最大大小,从而减少词元消耗,这在使用付费 API 时非常重要。
- 对话系统:用于清晰地分隔对话者的话语,以防止模型助手为用户生成回复。
- 生成结构化内容:在以 JSON、XML 格式获取正确输出或编写代码时不可或缺,可防止在结构完成后添加多余信息[7]。
- 防止不当行为:有助于在出现重复或不正确内容(幻觉)时中断生成。
- 训练与微调 (fine-tuning):在训练数据集中,通常使用独特的标记(例如 `###`)作为停止序列,以教会模型在正确的位置结束响应[6]。
当前研究方向
- 自适应停止标准:开发根据上下文和生成文本的质量动态确定终止点的方法。
- 基于熵的方法:使用词元分布的熵作为标准。高熵可能表示模型的不确定性,并可作为停止生成的信号。
链接
参考文献
- Sutskever, I.; Vinyals, O.; Le, Q. V. (2014). Sequence to Sequence Learning with Neural Networks. arXiv:1409.3215.
- Vaswani, A. et al. (2017). Attention Is All You Need. arXiv:1706.03762.
- Keskar, N. S. et al. (2019). CTRL: A Conditional Transformer Language Model for Controllable Generation. arXiv:1909.05858.
- Holtzman, A. et al. (2020). The Curious Case of Neural Text Degeneration. arXiv:1904.09751.
- Brown, T. et al. (2020). Language Models are Few-Shot Learners. arXiv:2005.14165.
- Zong, M.; Krishnamachari, B. (2022). A Survey on GPT-3. arXiv:2212.00857.
- Zhao, Y. et al. (2022). Calibrating Sequence Likelihood Improves Conditional Language Generation. arXiv:2210.00045.
- Hu, J. C.; Cavicchioli, R.; Capotondi, A. (2023). A Request for Clarity over the End-of-Sequence Token in the Self-Critical Sequence Training. arXiv:2305.12254.
- Zhu, W. et al. (2024). Improving Open-Ended Text Generation via Adaptive Decoding. arXiv:2402.18223.
- Zhang, H. et al. (2024). Adaptable Logical Control for Large Language Models. arXiv:2406.13892.
- Suh, Y. J. et al. (2025). The Curious Case of Sequentially Mis-calibrated Language Models. arXiv:2205.11916.
注释
- ↑ 1.0 1.1 “Stop Sequence: Understanding & Setting It Correctly”. Promptitude.io Help Center. [1]
- ↑ 2.0 2.1 “How do I use stop sequences in the OpenAI API?”. OpenAI Help Center. [2]
- ↑ “How to use stop sequences?”. Vellum. [3]
- ↑ 4.0 4.1 Brown, Tom, et al. “A Survey on GPT-3”. arXiv:2212.00857 [cs.CL], 1 Dec. 2022. [4]
- ↑ 5.0 5.1 Suh, Y. J., et al. “The Curious Case of Sequentially Mis-calibrated Language Models”. arXiv:2205.11916 [cs.CL], 24 May 2022. [5]
- ↑ 6.0 6.1 Eric, Mihail. “How to Finetune GPT3”. mihaileric.com. [6]
- ↑ Corin, Daniel. “Way Enough - Cursor Triple Backticks Stop Sequence”. danielcorin.com. [7]