Token、词元、分词?让我解开你的面具!词元到底是什么?一文彻底搞懂大模型的“最小思考单位“
Token、词元、分词?让我解开你的面具!词元到底是什么?一文彻底搞懂大模型的"最小思考单位"
🤔 从一张图说起:你有没有想过,AI 是怎么"读"你说的话的?
先看这张图,这是我在google AI studio里,AI回复的内容,我们可以分析这段词元。👇
![![词元示意图]](https://i-blog.csdnimg.cn/direct/02b9eadd77b346b39d2bb17795a3acb1.png)
你注意到了吗?图中那段 AI 的回复,被五颜六色的色块分割成了一个个小片段——红色、黄色、绿色、蓝色……而当鼠标悬停在某个片段上时,弹出了一个提示:
词元 ID:2430
这个"词元"是什么?这个"ID"又是什么意思?
你可能经常听到这些说法:
- “GPT-4 的上下文窗口支持 128K Token”
- “这次调用消耗了 3000 个 Token,费用 0.02 美元”
- “这个模型的 词元(Token) 数上限是……”
Token 这个词,在大模型时代几乎无处不在——它影响着 AI 的理解能力、回复长度、API 费用,甚至模型训练的效果。但如果你真的追问:
一个 Token 到底是什么?是一个字?一个词?还是一个句子?凭什么"accident"是一个 Token,而"unhappiness"可能被拆成三个?中文的"人工智能"又会被拆成几个?
很多人会愣住。
别急,这篇文章就是要把"词元(Token)"这件事彻底讲明白——从概念到原理,从分词算法到实际应用,再到你日常使用中最该关心的那些事。
📖 一、基础概念:什么是词元(Token)?
1.1 一句话定义
词元(Token),是大语言模型处理文本的最小单位。
你可以把它理解为:AI 不认识"文字",它只认识"编号"。而词元就是文字在变成编号之前,被切分出来的那个"碎片"。
1.2 用类比来理解
想象你要给一个只懂数字的外星人解释一本中文小说。你会怎么做?
| 步骤 | 你的做法 | 对应 AI 的做法 |
|---|---|---|
| 第 1 步 | 把小说拆成一个个"块"——可能是字、词、或常见短语 | 分词(Tokenization) |
| 第 2 步 | 给每个"块"编一个唯一的数字编号 | 编码(Encoding) —— 每个词元得到一个 ID |
| 第 3 步 | 把这串数字交给外星人处理 | 模型推理(Inference) |
| 第 4 步 | 外星人输出一串数字,你再翻译回文字 | 解码(Decoding) |
回到开头那张图:
图中的文本被切成了一个个彩色小块,每个色块就是一个词元(Token)。鼠标悬停的那个片段,它在模型的"字典"里对应的编号是 2430——这就是词元 ID(Token ID)。
所以,彩色色块 = 词元,编号 = 词元 ID,整本字典 = 词表(Vocabulary)。
1.3 词元 ≠ 字,词元 ≠ 词
这是最常见的误解。来看几个真实的例子(以 GPT 系列使用的 BPE 分词器为例):
英文场景:
输入: "unhappiness"
分词结果: ["un", "happiness"] → 2 个 Token
输入: "cat"
分词结果: ["cat"] → 1 个 Token
输入: "extraordinary"
分词结果: ["extra", "ordinary"] → 2 个 Token
中文场景:
输入: "人工智能"
分词结果: ["人工", "智能"] → 2 个 Token(运气好时)
或者: ["人", "工", "智", "能"] → 4 个 Token(取决于模型)
输入: "今天天气真好"
分词结果: ["今天", "天气", "真", "好"] → 4 个 Token
你看出规律了吗?
- 一个 Token 可能是一个完整的单词(
cat) - 也可能是一个词的一部分(
un+happiness) - 在中文里,可能是一个字,也可能是一个词
- 甚至可能是一个标点符号或一个空格
核心原则:Token 的切分方式取决于分词器(Tokenizer)的训练结果,而不是人类语法规则。
⚙️ 二、工作原理:分词器是怎么把文本"切碎"的?
这部分是理解词元的核心。我们来看看"切碎文字"这件事,经历了怎样的技术演进。
2.1 最朴素的想法——按字符切 / 按单词切
方案 A:按字符切(Character-level)
"hello" → ["h", "e", "l", "l", "o"] → 5 个 Token
- ✅ 优点: 词表超小(英文就 26 个字母 + 标点),永远不会遇到"不认识的词"
- ❌ 缺点: 序列太长,模型很难从单个字母中学到"含义",效率极低
方案 B:按单词切(Word-level)
"I love natural language processing"
→ ["I", "love", "natural", "language", "processing"] → 5 个 Token
- ✅ 优点: 每个 Token 都有明确的语义
- ❌ 缺点: 词表爆炸!英文单词何止百万?而且遇到新词(如
ChatGPT)就直接"不认识"(OOV 问题)
两个极端,都不理想。 那怎么办?
2.2 现代主流方案——子词分词(Subword Tokenization)
核心思想:既不按单个字符切,也不按完整单词切,而是找一个"中间地带"——按照高频出现的"子词片段"来切。
这就好比:
你在整理一个巨大的乐高积木库。如果把每块最小的积木都编号(按字符切),编号简单但搭建费劲;如果给每个成品模型编号(按单词切),查找方便但编号无穷无尽。最聪明的办法是:找出那些最常被反复使用的"组件"(子词),给它们编号。
目前主流的子词分词算法有三种:
| 算法 | 代表模型 | 核心思路 |
|---|---|---|
| BPE(Byte Pair Encoding) | GPT 系列、LLaMA | 从字符开始,反复合并最高频的相邻字符对 |
| WordPiece | BERT、DistilBERT | 类似 BPE,但合并依据是最大似然而非频率 |
| SentencePiece(Unigram) | T5、ALBERT、ChatGLM | 从大词表开始,反复删除贡献最小的子词 |
2.3 以 BPE 为例,手把手演示
假设我们的训练语料只有一句话:
"aabaabaab"
第 1 步:初始化——将每个字符视为一个 Token:
词表: {a, b}
序列: [a, a, b, a, a, b, a, a, b]
第 2 步:统计相邻 Token 对的频率:
(a, a) → 出现 3 次 ✅ 最高频!
(a, b) → 出现 3 次
(b, a) → 出现 2 次
第 3 步:合并最高频对 (a, a) → 新 Token aa:
词表: {a, b, aa}
序列: [aa, b, aa, b, aa, b]
第 4 步:再统计、再合并:
(aa, b) → 出现 3 次 ✅ 最高频!
(b, aa) → 出现 2 次
合并 (aa, b) → 新 Token aab:
词表: {a, b, aa, aab}
序列: [aab, aab, aab]
完成! 最终词表有 4 个 Token:{a, b, aa, aab}。
当词表大小达到预设上限(比如 GPT-2 是 50,257,LLaMA 是 32,000,GPT-4 是约 100,000)时,合并停止。
实际场景中,BPE 在海量文本上训练后:
- 高频词(如
the、is)会成为独立 Token - 常见词缀(如
un-、-ing、-tion)会成为独立 Token - 罕见词会被拆分为多个子词 Token
这就解释了为什么 unhappiness 会被拆成 un + happiness —— 因为 un 和 happiness 在训练语料中分别都是极高频的片段。
2.4 中文的特殊性
中文没有天然的空格分隔符,而且每个汉字本身就承载了较多语义。不同模型的处理策略差异很大:
| 模型 | 中文分词策略 | "自然语言处理"的分词结果 |
|---|---|---|
| GPT-3.5/4(早期) | 基于 UTF-8 字节的 BPE,中文几乎按字切 | ["自", "然", "语", "言", "处", "理"] → 6 Token |
| ChatGLM | 专门优化的 SentencePiece | ["自然", "语言", "处理"] → 3 Token |
| Qwen(通义千问) | 针对中文优化的 BPE | ["自然语言", "处理"] → 2 Token |
同样的中文内容,在不同模型里消耗的 Token 数可能差好几倍! 这也是为什么中文用户使用 GPT-3.5 时经常觉得"Token 不够用"的原因之一。
🔬 三、回到那张图:逐细节解读
现在让我们带着知识回看开头的图片:
┌──────────────────────────────────────────┐
│ **Interpreting the Prompt** │ ← 一整段 AI 输出
│ │
│ I've been analyzing the user's input, │
│ which is rather brief. My initial │
│ thought is that it's incomplete, │
│ perhaps an accid[词元 ID: 2430]ental... │ ← 鼠标悬停处
│ ▲ │
│ │ │
│ 这个彩色色块 = 一个词元 │
│ ID 2430 = 它在词表中的编号 │
└──────────────────────────────────────────┘
我们可以从图中读出以下信息:
| 观察 | 含义 |
|---|---|
| 文本被彩色色块分割 | 每个色块代表一个词元,是模型实际处理的最小单位 |
| 不同色块长度不同 | 有的词元是一个完整单词,有的只是单词的一部分 |
词元 ID: 2430 |
该词元在模型词表中对应的唯一编号。模型内部只看到这个数字,不看文字 |
| 多种颜色交替 | 这是可视化工具用来帮你区分相邻词元边界的手段 |
本质上,你看到的这段"流畅的英文",在 AI 眼里是这样的:
人类看到: "I've been analyzing the user's input, which is rather brief."
AI 看到: [40, 1053, 1027, 28085, 279, 1217, 596, 1946, 11, 902, 374, 4856, 9775, 13]
这串数字,就是词元 ID 的序列。 整个大语言模型的训练和推理,都建立在这串数字之上。
📊 四、为什么你应该关心 Token?——实用影响全解析
4.1 Token 与你的钱包 💰
几乎所有 LLM API 都按 Token 数量计费:
| 服务 | 计价单位 | 价格示例(2025年参考) |
|---|---|---|
| GPT-4o | 每百万输入 Token | ~$2.50 |
| Claude 3.5 Sonnet | 每百万输入 Token | ~$3.00 |
| Qwen-Max | 每千输入 Token | ¥0.02 |
同样一段中文,如果模型 A 切出 100 个 Token,模型 B 只切出 50 个,那模型 B 在等价条件下直接省一半钱。
4.2 Token 与上下文窗口 📏
所谓"128K 上下文",指的是模型一次能处理的最大 Token 数——不是字数,不是字节数,而是 Token 数。
┌──────────────────────────────┐
│ 128K Token 的上下文窗口 │
│ │
你的输入 (Prompt) │ ████████████░░░░░░░░░░░░░░░░ │
│ ← 已占用 → ← AI 可回复空间 → │
└──────────────────────────────┘
- 输入越长 → 占用 Token 越多 → 留给 AI 回复的空间越少
- 中文在未优化的模型里,同样字数消耗更多 Token
4.3 Token 与生成速度 ⚡
AI 生成文本时,是一个 Token 一个 Token 往外"蹦"的(自回归生成)。所以:
- 模型参数量 × 每个 Token 的计算量 = 单个 Token 生成耗时
- Token 粒度越大(一个 Token 包含的文字越多),同样长度的回复所需 Token 数越少,生成越快
这也是为什么针对中文优化了分词器的国产模型,在中文生成场景下往往又快又省。
4.4 速查:如何查看你的文本有多少个 Token?
| 工具 | 地址 / 方式 | 适用模型 |
|---|---|---|
| OpenAI Tokenizer | platform.openai.com/tokenizer | GPT 系列 |
tiktoken (Python 库) |
pip install tiktoken |
GPT 系列 |
| Hugging Face Tokenizer | https://huggingface.co/docs/transformers/main_classes/tokenizer | BERT, LLaMA, etc. |
| 国产模型官方平台 | 通义千问、智谱等 API 返回值中自带 Token 统计 | 对应模型 |
Python 快速示例:
import tiktoken
# 选择 GPT-4 使用的编码器
enc = tiktoken.encoding_for_model("gpt-4")
text = "今天天气真好,适合学习什么是Token!"
tokens = enc.encode(text)
print(f"文本: {text}")
print(f"Token 数量: {len(tokens)}")
print(f"Token ID 列表: {tokens}")
print(f"每个 Token 对应的文本:")
for t in tokens:
print(f" ID {t} → '{enc.decode([t])}'")
输出可能类似:
文本: 今天天气真好,适合学习什么是Token!
Token 数量: 11
Token ID 列表: [108386, 99, 35946, 3922, 104, 98, ...]
每个 Token 对应的文本:
ID 108386 → '今天'
ID 99 → '天'
...
📜 五、前世今生:分词技术是怎么一步步走到今天的?
时间轴:
1966 最早的 NLP 系统 ELIZA
│ └── 基于关键词匹配,没有"分词"概念
▼
1990s 统计 NLP 兴起
│ └── 按词切分 + 词袋模型(Bag of Words)
│ └── 遇到新词就抓瞎(OOV 问题严重)
▼
2012 Word2Vec 横空出世
│ └── 仍然按词切分,但赋予了词"向量语义"
▼
2015 BPE 被引入 NLP(原本是数据压缩算法!)
│ └── Sennrich et al. 将 BPE 用于机器翻译
│ └── 子词分词时代开启
▼
2018 BERT 发布 → 使用 WordPiece 分词
│ GPT-2 发布 → 使用 Byte-level BPE 分词
▼
2019 SentencePiece 工具成熟
│ └── Google 推出,语言无关,不依赖预分词
▼
2023- 大模型爆发
│ └── GPT-4: ~100K 词表
│ └── LLaMA: 32K → LLaMA 3: 128K 词表
│ └── 中文模型普遍扩充中文词表至 60K-150K
▼
2025 多模态 Token 化
└── 图片、音频、视频也被切成 "Token"
└── Token 不再只是文字的概念
一个有趣的事实: BPE 算法最初是 1994 年由 Philip Gage 提出的数据压缩算法。它的核心思想就是"把高频出现的字节对替换为新符号以缩短数据"。21 年后,NLP 研究者发现这个思想完美适用于文本分词——压缩和分词,本质上都是在寻找数据中的重复模式。
🔍 六、进阶话题:你可能还想知道的
6.1 词元 vs 词向量(Embedding):什么关系?
文本 → [分词] → 词元序列 → [查词向量表] → 向量序列 → [送入Transformer]
↑ ↑
Token ID Embedding
(离散编号) (高维连续向量)
- 词元/Token 是离散的符号编号(如 2430)
- 词向量/Embedding 是把编号映射到的高维空间向量(如 768 维浮点数组)
- Token 是"门牌号",Embedding 是"房间里的内容"
6.2 为什么有些词被"拆碎"会影响理解?
模型是在子词级别学习语义的。如果一个词被拆成过于零碎的片段,模型需要跨多个 Token 来"拼凑"这个词的含义,这会:
- 增加理解难度
- 浪费上下文窗口
- 在极端情况下影响准确率
这也是为什么词表设计和分词器训练是大模型的核心基础设施之一,绝非无关紧要的预处理步骤。
6.3 多模态时代:万物皆可 Token(有余力的同学进一步了解一下Embedding)
2024-2025 年,Token 的概念已经扩展到:
| 模态 | Token 化方式 |
|---|---|
| 文本 | BPE / WordPiece / SentencePiece |
| 图像 | 切成 16×16 patch → 每个 patch 是一个 Token(ViT) |
| 音频 | 切成固定时长的帧 → 每帧编码为 Token |
| 视频 | 空间 + 时间维度切分 → Token 序列 |
大一统的趋势:不管是文字、图片还是声音,都变成 Token 序列丢进 Transformer。 Token 已经从 NLP 概念升级为 AI 的通用"信息量子"。
✅ 七、总结:关于词元(Token),你只需记住这些
🎯 核心要点回顾
| # | 要点 | 一句话说明 |
|---|---|---|
| 1 | 词元是什么 | 大模型处理信息的最小单位,不等于字,不等于词 |
| 2 | 词元怎么来的 | 由分词器(Tokenizer)按照训练好的规则把文本切分而成 |
| 3 | 词元 ID 是什么 | 每个词元在模型词表(词典)中的唯一编号,模型实际处理的就是这些 ID |
| 4 | 为什么不按字/词切 | 按字切太碎(丢语义),按词切太多(词表爆炸),子词是最佳折中 |
| 5 | 中文消耗更多 Token | 中文在非专门优化的模型中,每个字可能单独占一个 Token,性价比低 |
| 6 | Token 决定成本和上限 | API 按 Token 计费,上下文窗口按 Token 计量,生成速度按 Token 衡量 |
| 7 | 万物皆可 Token | 图片、音频、视频都在 Token 化,这是 AI 理解世界的统一接口 |
💡 一句话总结
词元(Token)就是 AI 的"文字原子"——人类用眼睛看句子,AI 用词元 ID 读世界。图中那些彩色小方块,就是你亲眼看到的 AI 的"阅读颗粒度"。
📌 回到最初那张图
现在你完全理解了:
- 彩色色块 → 每一块是一个词元,是模型"读"和"写"的最小单位
- 不同颜色 → 只是为了帮你肉眼区分相邻词元的边界
- 词元 ID: 2430 → 这个词元在模型词表中的唯一身份编号
- 这段回复的生成过程 → 模型一个 Token 一个 Token 地输出数字 ID,再由分词器解码成你看到的文字
📝 如果这篇文章帮你搞清楚了"词元",不妨动手试试:打开 OpenAI Tokenizer ,输入一句中文和一句英文,亲眼看看它们分别被切成了多少个 Token。那种"原来如此"的感觉,比读十篇文章都管用。
参考资料:
- Sennrich et al., “Neural Machine Translation of Rare Words with Subword Units”, 2015
- OpenAI, “Tiktoken: BPE tokeniser for use with OpenAI’s models”
- Google, “SentencePiece: A simple and language independent subword tokenizer”
- Kudo & Richardson, “SentencePiece: A simple and language independent subword tokenizer and detokenizer for Neural Text Processing”, 2018
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐


所有评论(0)