Token、词元、分词?让我解开你的面具!词元到底是什么?一文彻底搞懂大模型的"最小思考单位"


🤔 从一张图说起:你有没有想过,AI 是怎么"读"你说的话的?

先看这张图,这是我在google AI studio里,AI回复的内容,我们可以分析这段词元。👇

![词元示意图]

你注意到了吗?图中那段 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 在海量文本上训练后:

  • 高频词(如 theis)会成为独立 Token
  • 常见词缀(如 un--ing-tion)会成为独立 Token
  • 罕见词会被拆分为多个子词 Token

这就解释了为什么 unhappiness 会被拆成 un + happiness —— 因为 unhappiness 在训练语料中分别都是极高频的片段。

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
Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐