什么是词元(Token)
一、基本定义
词元(Token) 是自然语言处理(NLP)和大语言模型(LLM)中的最小处理单位。它是把一段文本切分后得到的"碎片",模型不直接读取文字,而是读取这些碎片对应的数字编号。
简单来说:词元 = 模型眼中的"一个字符块",可以是一个字、一个词、一个子词,甚至是一个标点。
二、词元的几种粒度
不同分词策略下,"一个词元"代表的内容不同:
| 粒度类型 | 示例(输入:"人工智能很强大") |
说明 |
|---|---|---|
| 字符级(Char) | 人 工 智 能 很 强 大 |
每个字一个词元,词表小但序列长 |
| 词级(Word) | 人工智能 很 强大 |
按完整词切,符合直觉但词表巨大 |
| 子词级(Subword) | 人工 智能 很强 大 |
当前主流(BPE / WordPiece / SentencePiece) |
| 字节级(Byte) | 0xE4 0xBA 0xBA ... |
GPT 系列使用的 BBPE,对所有语言友好 |
三、英文 vs 中文的差异
```text 英文:"Hello, world!" → ["Hello", ",", " world", "!"] 约 4 个词元
中文:"你好,世界!" → ["你", "好", ",", "世", "界", "!"] 约 6 个词元 ```
经验法则(以 GPT 类模型为例):
- 英文:约
1 token ≈ 4 个字符 ≈ 0.75 个单词 - 中文:约
1 个汉字 ≈ 1~2 个 token(取决于模型分词器)
四、为什么要有词元?
- 降维:把无限的"字符串空间"映射到有限的"整数空间"(词表,通常 3 万 ~ 20 万)。
- 加速:模型只需对固定大小的词表做 embedding 查表。
- 泛化:子词切分能处理未登录词,例如
unhappiness→un+happi+ness。
五、和 LLM 使用相关的几个点
text ┌──────────────┐ 分词器 ┌──────────────┐ 模型 ┌──────────────┐ │ 原始文本 │ ───tokenizer───▶ │ 词元 ID 序列 │ ──forward─▶ │ 下一个词元 │ │ "你好" │ │ [872, 1962] │ │ ID = 65510 │ └──────────────┘ └──────────────┘ └──────────────┘
- 上下文长度(Context Length):例如
128K tokens,指模型一次能"看到"的词元数量上限。 - 计费单位:OpenAI、Claude、通义千问等 API 都按 input tokens + output tokens 计费。
- 截断(Truncation):超过上下文长度时,最早的词元会被丢弃。
六、一个直观例子
```text 输入: "ChatGPT is amazing!"
分词后(以 GPT-4 的 cl100k_base 为例): ["Chat", "G", "PT", " is", " amazing", "!"] ↓ ↓ ↓ ↓ ↓ ↓ ID: 1163, 38, 2898, 374, 8056, 0
共 6 个 token ```
七、一句话总结
词元是把"人类的文字"翻译成"模型能算的数字"的桥梁,它决定了模型的输入长度、训练效率,以及你调用 API 时要付多少钱。