介绍
在大模型的世界里,我们看到的流畅对话、精准代码生成、多模态交互,背后都离不开一套「隐形骨架」——特殊标记(Special Token)。它们是大模型 理解 文本边界、角色身份、任务类型 的核心载体,就像人类语言中的 标点符号、段落分隔符,甚至是暗语指令。
对于闭源大模型(如GPT-4、豆包),这些标记被封装在服务端,用户无需关心。
对于开源大模型(如Llama 3、Qwen、GLM 4),标记的使用直接决定了 微调效果 与 推理质量——用错一个标记,可能导致模型生成失控、角色串扰,甚至完全无法完成任务。
作用
其核心作用可以总结为三点:
- 界定边界:标记文本的 开始/结束、句子的分隔、多轮对话的轮次;
- 定义角色:区分系统提示、用户输入、助手回复的身份;
- 触发功能:引导模型完成掩码预测、多模态交互、工具调用等特殊任务。
特性
特殊标记是大模型分词器(Tokenizer)词典中的 保留字,具备以下三个核心特性:
- 不可分割性:标记是最小语义单元,不会被分词器进一步拆分;
- 特殊功能性:每个标记对应特定逻辑(如终止生成、界定角色);
- 模型可学习性:标记在预训练阶段被模型学习,具备固定的语义关联。
分类
1. 基础功能标记:大模型的「通用标点」
这是所有开源大模型的必备标记,负责最基础的文本序列管理,相当于大模型的「语法基础」。
提示:在markdown的表格中,下面标记不能正常显示,所以用简写,下面给出全写:
- 简写
<endoftext>:全写<|endoftext|> - 简写
<begin_of_text>:全写<|begin_of_text|> - 简写
<unk>:全写<|unk|> - 简写
<pad>:全写<|pad|>
| 标记示例 | 功能名称 | 核心作用 | 主流模型用法 |
|---|---|---|---|
<endoftext> |
EOS(文本结束符) | 生成停止信号,输出该标记后模型立即终止续写 | GPT系用<endoftext>,Llama/Mistral用</s>,Qwen双支持 |
<begin_of_text> |
BOS(文本开始符) | 标记序列的起始位置,用于界定输入的开始 | 多数模型在预训练/推理时自动添加,无需手动拼接 |
<unk> |
UNK(未知词元) | 替换分词器词典中未收录的字符/序列 | 所有模型通用,遇到生僻字、乱码时自动触发 |
<pad> |
PAD(填充符) | 批量处理时将序列填充至相同长度,方便并行计算 | 仅在批量推理/微调时内部使用,用户侧一般无需关注 |
注意:EOS是生成任务的「生命线」,微调时必须在样本末尾添加,否则模型会「刹不住车」,无限续写。
例子
通常会在每个文档或图书的 开头插入一个词元,以区分前一个文本源,这种做法有助于 模型理解,虽然在训练时是连接在一起的,但实际上是相互独立的,如图:
2. 对话/指令微调标记:定义多轮交互的「角色身份」
当开源大模型被用于对话或指令微调时,需要一套标记来界定「系统-用户-助手」的角色边界,这是实现多轮对话的核心。
这类标记的设计风格主要分为两大流派:ChatML风格与角色头风格。
提示:在markdown的表格中,下面标记不能正常显示,所以用简写,下面给出全写:
- 简写
<im_start>:全写<|im_start|> - 简写
<im_end>:全写<|im_end|> - 简写
<start_header_id>:全写<|start_header_id|> - 简写
<end_header_id>:全写<|end_header_id|> - 简写
<eot_id>:全写<|eot_id|>
| 标记流派 | 核心标记 | 作用 | 典型模型 |
|---|---|---|---|
| ChatML风格 | <im_start> / <im_end> |
包裹单轮消息,标记消息的开始与结束 | Qwen、DeepSeek、GLM |
| 角色头风格 | <start_header_id> / <end_header_id> / <eot_id> |
标记角色类型(system/user/assistant),<eot_id>表示轮次结束 |
Llama 3 |
典型示例:
- Qwen(ChatML风格)
<|im_start|>system 你是一个专业的技术助手,擅长解释大模型底层原理。<|im_end|> <|im_start|>user 什么是EOS标记?<|im_end|> <|im_start|>assistant - Llama 3(角色头风格)
<|begin_of_text|> <|start_header_id|>system<|end_header_id|> 你是一个专业的技术助手,擅长解释大模型底层原理。<|eot_id|> <|start_header_id|>user<|end_header_id|> 什么是EOS标记?<|eot_id|> <|start_header_id|>assistant<|end_header_id|>
核心注意点:
对话微调时必须严格遵循模型官方模板,角色顺序、标记位置错误会直接导致模型「答非所问」;
多轮对话中,
<|im_end|>或<|eot_id|>是轮次分隔的关键,缺失会导致角色串扰(如助手回复中混入用户输入)。
注意
标记的使用看似简单,但实际操作中很容易踩坑。以下5个原则能帮你避免90%的问题:
绝对禁止硬编码标记。避免模型版本更新导致标记不匹配;
微调与推理必须使用相同的模板
微调时使用的标记模板,必须与推理时完全一致。例如,微调Qwen时用了 ChatML模板,推理时就 不能改用 角色块模板,否则模型会完全 无法理解输入。批量处理时注意PAD标记的位置,PAD标记的位置与模型架构相关,放错位置会导致模型注意力机制计算错误,影响输出质量:
- Decoder-only模型(如Llama、Qwen):PAD标记通常放在序列的末尾;
- Encoder-only模型(如BERT):PAD标记通常放在序列的开头。
