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