Token 概念详解
什么是Token?
Token 是语言处理的基本单元,类似于构成文本的"原子"。
Token可以是:
- 一个字符(如 "a")
- 一个子词(如 "ing")
- 一个完整单词(如 "apple")
- 一个短语或符号
什么是Tokenization?
Tokenization(分词) 是将文本字符串转换为Token序列的过程:
- 文本 → Token序列
- Token → 整数ID
- 可逆转换过程
- 模型输入预处理
为什么Tokenization如此重要?
Tokenization直接影响LLM的性能和行为,许多看似与模型架构相关的"奇怪现象"本质上源于分词逻辑。
影响概览
- 性能影响 - 分词策略直接影响模型的理解能力和处理效率
- 语言适配 - 不同语言的分词效果差异巨大,影响多语言能力
- 成本控制 - Token数量直接影响API调用成本和计算资源
问题示例
#### 1. 拼写与基础任务缺陷
- LLM可能拼错单词或无法反转字符串
- 原因:单词被拆分,模型难以理解完整含义
- 日语、中文等语言的分词更复杂
- 问题:Token序列更长,消耗更多上下文窗口
- Python代码的缩进空格被分割
- 问题:缩进空格成为独立Token,浪费计算资源
- JSON比YAML消耗更多Token
- 问题:JSON的符号更多,Token效率较低
Tokenization核心流程
预训练阶段:构建词汇表
1. 收集语料库 - 获取大量文本数据(网页、书籍等) 2. 初始分词 - 用基础方法分割文本 3. 选择算法 - 选择分词算法(BPE、WordPiece等) 4. 生成词汇表 - 合并高频Token对 5. 分配ID - 为每个Token分配唯一ID
实时分词过程
1. 文本输入 - 接收用户输入的文本 2. 文本转换 - 将文本拆分为词汇表中的Token 3. ID映射 - Token转为对应的整数ID 4. 添加特殊Token - 添加控制Token(如<|start|>, <|end|>)
BPE算法
Byte Pair Encoding (BPE) 是现代分词的主流算法。
BPE原理
1. 初始字符表 - 从基础字符开始,建立初始词汇表 2. 迭代合并 - 统计字符对频率,合并最常见的对 3. 优化压缩 - 平衡词汇表大小与文本压缩效果
BPE示例
语料库:["hug", "pug", "hugs", "pugs", "huge", "hugging"]
迭代过程: 1. 初始化:[h, u, g, p, s, e, i, n] 2. 统计:u+g出现6次(最频繁) 3. 合并:u + g → ug 4. 继续:h + ug → hug 5. 继续:p + ug → pug 6. 最终词汇表:[h, u, g, p, s, e, i, n, ug, hug, pug]
BPE优势
- 可逆无损 - 可以完整地将Token序列还原为原始文本
- 泛化性强 - 能处理未登录词(OOV),如"unhug"会被拆分为"un"+"hug"
Token vs Embeddings
| 维度 | Tokenization | Embeddings |
|---|---|---|
| 目的 | 将文本转为Token序列(离散ID) | 将Token ID转为语义向量(连续表示) |
| 阶段 | 预处理(模型输入前) | 模型内部处理(输入层) |
| 作用 | 结构化文本,降低计算复杂度 | 捕获语义关系(如"国王"与"王后"的向量距离近) |
| 输出示例 | "hello" → ID 123 | ID 123 → [0.1, 0.3, -0.2, ...] (128维向量) |
完整处理流程
输入文本 → Tokenization → Token IDs → Embeddings → 模型处理
Token效率对比
YAML格式
name: John
age: 30
city: Shanghai
Token数量:29JSON格式
{
"name": "John",
"age": 30,
"city": "Shanghai"
}
Token数量:46影响:相同的配置信息,JSON格式比YAML多消耗59%的Token,直接影响API成本和模型的上下文窗口利用效率。
--- 来源:Easy AI 学习平台 | 本教程为AI知识普及而制作 #EasyAI #AI教学 #教程 #Token #分词