一、什么是 Tokenizer?

我们平时使用 ChatGPT、DeepSeek、Claude 等大语言模型时,输入的通常是自然语言,例如:

你好,今天我们来学习大语言模型。

但是,大语言模型并不能直接理解人类输入的完整文本。模型真正处理的是数字序列,而不是原始文字。

因此,在文本进入大模型之前,需要经过一个非常重要的处理步骤:Tokenization(分词或 Token 化)。

Tokenizer 就是负责完成这一过程的工具,它会将输入文本拆分成一个个 Token,再将 Token 映射为对应的数字 ID,最终转换成模型可以处理的输入序列。

例如:

原始文本:
Hello, how are you?

Token:
["Hello", ",", " how", " are", " you", "?"]

Token ID:
[15496, 11, 703, 389, 345, 30]

注意:上面的 Token 和 ID 仅用于演示,实际结果取决于具体使用的 Tokenizer。

可以简单理解为:

文本 → Token → Token ID → Embedding → 大模型

Tokenizer 是连接人类语言和大模型数字计算世界的重要桥梁。

二、Tokenizer 的核心作用

为什么大模型不直接使用文字,而要先转换成 Token?

主要有四个原因。

1. 将自然语言转换为数字

神经网络本质上是数学计算系统,无法直接处理字符串。

Tokenizer 将文本转换为离散的 Token ID,使模型能够通过 Embedding 层将其映射为向量。

2. 控制词汇表规模

如果直接将所有可能出现的单词都作为独立单位,词汇表会非常庞大。

例如:

  • run

  • running

  • runs

  • runner

这些单词之间存在一定的结构和关联。

通过子词切分,可以让模型复用部分词汇单元,减少词汇表规模。

3. 处理未登录词

现实世界中的语言非常复杂。

模型可能遇到:

  • 新出现的网络热词

  • 生僻汉字

  • 人名和地名

  • 专业术语

  • 拼写错误

  • 多语言混合文本

如果采用传统的整词词典,很容易遇到词典中不存在的词。

子词 Tokenizer 可以将未知词拆解为已有的基本单元,提高文本处理能力。

4. 控制模型输入长度

大模型通常存在上下文窗口限制。

例如,模型支持 32K、128K 或更长的上下文,并不是简单按照汉字数量或单词数量计算,而是按照 Token 数量计算。

因此,Tokenizer 的切分方式会直接影响:

  • 模型能够读取多少文本

  • API 输入和输出的 Token 消耗

  • 推理成本

  • 文本处理效率

三、Tokenizer 的整体工作流程

Tokenizer 并不是简单地按照空格拆分文字,而是包含多个处理阶段。

整体流程如下:

        原始输入文本
              |
              v
       文本预处理
              |
              v
       文本规范化
              |
              v
       初步文本切分
              |
              v
       子词编码算法
       BPE / WordPiece
       Unigram 等
              |
              v
       Token 序列
              |
              v
       Token ID 映射
              |
              v
       模型输入序列
              |
              v
       Embedding 层
              |
              v
         大语言模型

下面分别介绍每个环节。

1. 文本预处理

首先,Tokenizer 会对输入文本进行必要的预处理。

例如:

Hello, World!

根据具体 Tokenizer 的实现,可能需要处理:

  • 空格

  • 标点符号

  • 换行符

  • 特殊字符

  • Unicode 字符

  • 文本边界

不同 Tokenizer 的预处理规则并不完全相同。

2. 文本规范化

文本规范化的目的是减少不必要的字符差异。

例如,某些 Tokenizer 会对 Unicode 字符进行规范化处理。

但需要注意,并不是所有 Tokenizer 都会统一转换大小写或者删除标点。

现代大模型通常需要保留文本中的大小写、标点和格式信息,因为这些信息可能影响语义。

3. 子词切分

这是 Tokenizer 最核心的环节之一。

Tokenizer 会根据预先训练或构建的词汇表,将文本切分为合适的 Token。

常见算法包括:

  • BPE

  • WordPiece

  • Unigram

4. Token ID 映射

完成切分后,Tokenizer 会将每个 Token 映射为一个唯一的整数 ID。

例如:

Tokens:
["我", "喜欢", "人工智能"]

Token IDs:
[100, 256, 1024]

这里的 ID 仅为示意。

最终得到的 ID 序列就可以传递给模型。

四、三种主流 Tokenizer 算法详解

目前,大模型领域常见的 Tokenizer 算法主要包括 BPE、WordPiece 和 Unigram。

1. BPE:字节对编码

BPE(Byte Pair Encoding)是目前非常常见的子词编码算法。

GPT 系列模型及许多其他大模型使用了基于 BPE 的 Tokenization 方案。

其核心思想是:

从较小的字符或字节单元开始,不断合并出现频率较高的相邻单元,最终形成子词词汇表。

例如,假设训练语料中存在以下单词:

low
lower
lowest

初始状态:

l o w
l o w e r
l o w e s t

如果 l 和 o 经常相邻出现,就可以将它们合并:

lo w
lo w e r
lo w e s t

接下来,如果 lo 和 w 也经常相邻出现,就继续合并:

low
low e r
low e s t

经过多轮合并,最终得到:

low
lower
lowest

实际 BPE 训练过程会根据语料统计相邻符号对的频率,并按照合并规则构建词汇表。

BPE 的优点:

  • 能够有效压缩文本序列

  • 能够处理未登录词

  • 词汇表规模相对可控

  • 算法思路直观,容易实现

2. WordPiece:词片段编码

WordPiece 是另一种常见的子词编码算法,曾广泛应用于 BERT 等模型。

它与 BPE 类似,也是通过子词单元构建词汇表。

但两者的核心区别在于:

  • BPE:通常按照相邻符号对的出现频率进行合并。

  • WordPiece:通常使用基于语言模型概率的评分方式选择合并单元。

例如:

playing

可能被切分为:

play + ##ing

其中:

  • play:词语主体

  • ##ing:表示该子词位于前一个词片段之后

WordPiece 的优点:

  • 能够处理大量未登录词

  • 可以利用子词组合表达复杂词汇

  • 适合自然语言理解任务

3. Unigram:单元语言模型

Unigram 与 BPE、WordPiece 的思路有所不同。

它通常从一个较大的候选 Token 词汇表开始,再通过概率建模逐步删除贡献较小的 Token。

核心思想:

寻找一组合理的子词,使整个文本序列具有较高的概率。

例如:

unbelievable

可能存在多种切分方式:

un + believe + able
unbeliev + able
un + believable

Unigram 会根据概率模型评估不同切分方式,选择更合理的结果。

它的特点:

  • 支持多种可能的切分方案

  • 可以使用概率模型评估 Token 序列

  • 常用于 SentencePiece 等相关技术体系

4. 三种算法对比

对比维度BPEWordPieceUnigram
核心思想高频合并概率评分合并概率建模与剪枝
词汇表构建逐步合并选择合并单元从大词表中筛选
切分方式子词合并子词组合概率最优切分
代表应用GPT 系列相关方案BERTSentencePiece
主要特点简单高效适合子词建模概率化切分

需要注意:具体模型使用的 Tokenizer 还可能包含字节级处理、正则预切分、特殊 Token 等额外设计,不能简单地将整个方案等同于某一种基础算法。

五、中文和英文的 Token 切分有什么区别?

这是很多初学者非常关心的问题。

英文和中文的语言结构不同,因此 Tokenizer 在处理两种语言时,可能产生明显不同的切分结果。

1. 英文 Token 切分

例如:

Artificial Intelligence is amazing.

可能被切分为:

["Artificial", " Intelligence", " is", " amazing", "."]

也可能将某些长单词进一步拆分。

英文通常具有较明显的空格分隔结构,但 Tokenizer 并不一定按照完整单词切分。

2. 中文 Token 切分

例如:

我正在学习大语言模型。

可能被切分为:

["我", "正在", "学习", "大", "语言", "模型", "。"]

也可能是:

["我", "正在", "学习", "大语言", "模型", "。"]

具体取决于词汇表和编码规则。

中文 Tokenizer 不一定按照传统中文分词方式处理文本。

例如,传统中文分词可能将:

人工智能技术

拆分为:

人工智能 / 技术

而 Tokenizer 可能将其编码为一个或多个 Token。

3. 为什么中文有时候消耗更多 Token?

主要与以下因素有关:

  • 中文字符和子词在词汇表中的覆盖情况

  • Tokenizer 的训练语料分布

  • 中英文混合文本

  • 专业术语和生僻字

  • 具体模型的编码算法

因此,不同模型处理同一段中文时,Token 数量可能不同。

一个汉字不一定等于一个 Token,一个英文单词也不一定等于一个 Token。

六、特殊 Token 是什么?

除了普通文本 Token,大模型还会使用一些特殊 Token。

特殊 Token 用于标记任务边界、消息结构、角色信息以及生成状态等。

常见类型包括:

特殊 Token作用
BOS表示序列开始
EOS表示序列结束
PAD用于序列填充
UNK表示未知词
SEP分隔不同文本片段
CLS分类任务中的特殊标记

需要注意,这些是常见概念,并不是所有大模型都会使用全部这些 Token。

以部分聊天模型使用的消息格式为例:

<|im_start|>user
你好,请介绍一下人工智能。
<|im_end|>

<|im_start|>assistant
人工智能是研究如何让机器具备智能能力的技术。
<|im_end|>

其中:

  • <|im_start|>:消息开始

  • user:用户角色

  • assistant:助手角色

  • <|im_end|>:消息结束

部分模型还会使用:

<|im_sep|>
<|im_end|>
<|fim_suffix|>

用于消息内容分隔、消息结束或控制生成流程。

在实际使用中,聊天模板(Chat Template)会将角色、内容和控制信息组织成模型能够识别的输入格式。

七、Tokenizer 代码实战:如何查看文本对应的 Token?

理解原理之后,我们通过 Python 实际观察文本是如何变成 Token 的。

这里以 Hugging Face Transformers 和 BERT Tokenizer 为例。

1. 安装依赖

pip install transformers

2. 加载 Tokenizer

from transformers import AutoTokenizer

# 加载预训练 Tokenizer
tokenizer = AutoTokenizer.from_pretrained(
    "bert-base-chinese"
)

text = "我正在学习大语言模型。"

# Tokenize:文本切分
tokens = tokenizer.tokenize(text)

# 转换为 Token ID
token_ids = tokenizer.convert_tokens_to_ids(tokens)

print("原始文本:", text)
print("Tokens:", tokens)
print("Token IDs:", token_ids)

运行后可以看到类似输出:

原始文本: 我正在学习大语言模型。

Tokens:
['我', '正', '在', '学', '习', '大', '语', '言', '模', '型', '。']

Token IDs:
[对应的整数 ID 序列]

实际输出以加载的模型词汇表为准。

3. 一步完成文本编码

除了手动切分,还可以直接使用:

encoded = tokenizer(
    "我正在学习大语言模型。",
    return_tensors="pt"
)

print(encoded)

输出通常包含:

{
    "input_ids": ...,
    "token_type_ids": ...,
    "attention_mask": ...
}

其中:

  • input_ids:Token 对应的整数 ID。

  • token_type_ids:区分不同文本片段,具体模型不一定使用。

  • attention_mask:标记哪些位置是有效 Token,哪些位置是填充。

4. 将 Token ID 解码回文本

Tokenizer 不仅可以编码,也可以解码。

decoded_text = tokenizer.decode(
    encoded["input_ids"][0],
    skip_special_tokens=True
)

print(decoded_text)

通过这个过程,可以将 Token ID 重新转换为可读文本。

完整流程:

原始文本
   |
   v
tokenizer.encode()
   |
   v
Token ID
   |
   v
模型计算
   |
   v
生成 Token ID
   |
   v
tokenizer.decode()
   |
   v
自然语言文本

八、Tokenizer 对大模型有什么影响?

Tokenizer 看起来只是一个文本预处理工具,但它实际上会影响大模型的多个关键环节。

1. 影响上下文窗口

假设模型支持 32K Token 的上下文窗口。

如果一段文本经过 Tokenizer 编码后占用了 10K Token,那么理论上还剩余约 22K Token 的上下文空间。

因此,Token 数量直接关系到模型可以处理的文本长度。

2. 影响 API 调用成本

很多大模型 API 会按照输入 Token 和输出 Token 计费。

例如:

输入 Token:10000
输出 Token:2000

总计 Token:12000

实际费用需要根据具体模型的输入、输出价格计算。

不同 Tokenizer 可能会将同一段文本编码成不同数量的 Token,因此也会影响实际使用成本。

3. 影响模型的多语言能力

如果 Tokenizer 的训练语料中英文比例不均衡,那么不同语言的 Token 切分效率可能存在差异。

例如:

  • 英文常见词可能被编码成一个 Token。

  • 中文专业词汇可能被拆分为多个 Token。

  • 低资源语言可能需要更多 Token 表示相同的信息。

这会影响模型处理不同语言时的上下文利用效率。

4. 影响模型训练效率

Tokenizer 决定了训练文本如何转换成 Token 序列。

如果切分过于细碎,模型可能需要处理更长的序列。

如果切分过于粗糙,又可能导致词汇表规模过大或组合表达能力受限。

因此,设计合理的 Tokenizer 是大模型训练过程中的重要环节。

九、Tokenizer 和 Embedding 有什么区别?

很多初学者容易把 Tokenizer 和 Embedding 混淆。

实际上,两者承担的是不同任务。

对比维度TokenizerEmbedding
核心作用文本转换为 Token IDID 转换为向量
输入原始文本Token ID
输出Token ID 序列向量序列
是否涉及神经网络训练可能涉及词表训练通常是可训练参数
主要功能文本离散化特征向量化

可以通过下面的流程理解:

输入:
"我喜欢人工智能"

        |
        v

Tokenizer:
["我", "喜欢", "人工智能"]

        |
        v

Token ID:
[100, 256, 1024]

        |
        v

Embedding:
[0.12, 0.35, ...]
[-0.21, 0.56, ...]
[0.43, 0.18, ...]

        |
        v

Transformer:
注意力计算、特征提取、上下文建模

简单来说:

Tokenizer 负责把文字变成数字编号,Embedding 负责把数字编号变成模型使用的向量表示。

十、如何查看不同大模型的 Tokenizer?

学习 Tokenizer,最好的方式就是自己动手测试。

下面介绍几个常用工具。

1. Hugging Face

官网:https://huggingface.co/

可以搜索不同模型的 Tokenizer 配置、词汇表和相关代码。

2. OpenAI Tokenizer

官方入口:https://platform.openai.com/tokenizer

可以直接输入文本,观察文本被切分成多少 Token。

适合研究 GPT 系列相关 Tokenizer。

3. SentencePiece

GitHub:https://github.com/google/sentencepiece

SentencePiece 是一种常用的无监督文本 Tokenization 工具,支持 BPE 和 Unigram 等算法。

4. Hugging Face Tokenizers

GitHub:https://github.com/huggingface/tokenizers

这是一个高性能 Tokenizer 库,支持多种 Tokenization 算法,适合开发者学习和实际项目使用。

十一、总结

Tokenizer 是大语言模型中非常重要的基础组件。

它负责将人类输入的自然语言转换为模型可以处理的 Token ID 序列,是连接自然语言和神经网络计算的重要桥梁。

本文重点介绍了:

  1. Tokenizer 的基本概念和核心作用。

  2. 文本从预处理到 Token ID 的完整流程。

  3. BPE、WordPiece、Unigram 三种主流算法。

  4. 中文和英文 Token 切分的区别。

  5. 特殊 Token 的作用。

  6. 使用 Hugging Face 实现 Tokenizer 编码和解码。

  7. Tokenizer 对上下文窗口、API 成本和训练效率的影响。

  8. Tokenizer 与 Embedding 的区别。

如果你正在学习大语言模型,建议按照以下顺序理解:

Tokenizer
    ↓
Token ID
    ↓
Embedding
    ↓
Position Encoding
    ↓
Self-Attention
    ↓
Transformer
    ↓
Next Token Prediction
    ↓
文本生成

只有理解了 Tokenizer,才能真正理解大模型是如何从一段自然语言开始,逐步完成编码、计算和文本生成的。

Logo

更多推荐