第 32 篇 · LLM基础

分词:把句子切成AI能懂的小块

为什么「人工智能」有时是1个Token,有时是2个?

上一篇我们说,AI不认识文字,只认识数字。Token就是文字和数字之间的桥梁。

但你有没有想过,这个桥梁是怎么建造的?为什么「人工智能」有时候是一个Token,有时候是两个,甚至是三个?

这就要说到分词算法(Tokenization)了。它决定了AI如何「切分」文本,是AI理解人类语言的第一道关卡。

好的分词算法能让AI更聪明,坏的分词算法会让AI变笨。这可不是夸张——想象一下,如果AI把"人工智能"切成"人工"和"智能",它还能理解整个概念吗?

为什么要分词?

不分词的后果

  • • 每个句子都是1个Token
  • • 词表会无限膨胀
  • • 无法理解词的含义
  • • 遇到未知词就崩溃
  • • 学习效率极低

分词的好处

  • • 复用常见的词和片段
  • • 控制词表大小
  • • 理解词的构成
  • • 处理未知词
  • • 学习效率高

💡 类比思考:分词就像给文本建「乐高积木」库。常用的词(如"我"、"你")是整块积木,生僻的词(如"量子纠缠")可以用小块积木拼出来。

1
什么是分词?

分词:切蛋糕的艺术

📝 原始文本

"我热爱人工智能"

❌ 切法1

我/热/爱/人/工/智/能

7个Token(太碎)

✅ 切法2

我/热爱/人工智能

3个Token(刚好)

⚠️ 切法3

我热爱人工智能

1个Token(太粗)

🎯 目标

保留语义提高效率之间找到平衡

分词(Tokenization)就是把文本切分成Token的过程。听起来简单,其实是一门艺术——就像切蛋糕,切得太碎不好吃,切得太粗又不够分。

好的分词算法要能智能地判断:哪里该切,哪里不该切。

2
三种主要分词算法

算法1:字符级分词(Character-level)
🔤

字符级分词

每个字/字母都是一个独立的Token

输入:"Hello AI"

Hello AI
Token数量:8词表大小:约100(ASCII字符)
✅ 优点

词表小,不会出现未知词

❌ 缺点

Token多,效率低,语义丢失

算法2:单词级分词(Word-level)
📝

单词级分词

每个单词是一个Token(英文有效,中文难用)

输入:"Hello AI"

HelloAI
Token数量:2词表大小:数万到数十万
✅ 优点

Token少,效率高,语义保留

❌ 缺点

词表大,中文难分词,未知词

算法3:Subword分词(现代AI主流)
✂️

Subword分词

智能切分:常用词保持完整,生僻词拆分成片段

输入:"Hello AI ChatGPT"

HelloAIChatGPT
Token数量:5词表大小:3万-10万
✅ 优点

兼顾效率和语义,平衡性好

✅ 优势

能处理未知词,GPT/Claude使用

3
BPE算法:如何训练分词器?

BPE训练过程:从字符到词表
1

初始化词表

包含所有字符:a, b, c... 你, 我, 他...

2

统计频率

找出训练数据中出现最多的相邻字符对,比如 "th"

3

合并字符对

把 "th" 当作一个新的词加入词表

4

重复

继续找频率最高的字符对,直到词表达到目标大小

🔄 示例:"the" → 初始3个Token → "the"变成1个Token(因为"th"和"e"很常见)

BPE(Byte Pair Encoding)是最流行的Subword分词算法。它的核心思想很简单:统计哪些字符组合最常见,把它们合并成一个Token。

经过训练的词表会包含各种片段:有的是完整单词(如"hello"),有的是常见前缀后缀(如"ing"、"un"),有的是字符组合(如"th"、"qu")。

BPE训练实例:从'the'到完整词表

📊 训练数据(简化)

hug hug hug hug hug (5次)

the the the (3次)

th th (2次)

the the the (3次)

...

🔢 第1轮:找到最频繁的对 'h' + 'u' = 'hu'

h u g

3个Token

hu g

2个Token

🔢 第2轮:找到最频繁的对 't' + 'h' = 'th'

t h e

3个Token

th e

2个Token

🔢 第3轮:继续... 'th' + 'e' = 'the'

th e

2个Token

the

1个Token

🎯 结果:经过多次迭代,"the"、"hug"、"the"等常见词都变成单个Token,而罕见词(如"thug")可以拆成"th"+"ug"。

4
其他分词算法:BPE不是唯一选择

三种Subword算法对比
📊

BPE

Byte Pair Encoding

  • 原理:合并最频繁的对
  • 优点:简单高效,最流行
  • 缺点:可能破坏词义
  • 代表:GPT-2, GPT-3, RoBERTa

✅ 主流选择

📈

WordPiece

概率优先合并

  • 原理:合并提升概率最大的对
  • 优点:更符合语言模型
  • 缺点:训练复杂
  • 代表:BERT, BERT-tiny

🏆 BERT专用

🔄

Unigram

从大到小删除

  • 原理:从完整词开始,逐步删除
  • 优点:更灵活
  • 缺点:计算量大
  • 代表:T5, ALBERT

🔬 研究用

🧪 实验发现:大多数现代AI使用BPE,因为它简单高效。WordPiece在BERT中表现出色,但需要更复杂的训练。Unigram相对少见,但在某些特定场景下更灵活。

4
为什么Subword是主流?

Subword的优势:三个维度
效率

Token数量适中

比字符级少3-5倍,比单词级少2-3倍。处理速度更快,成本更低。
语义🧠

保留语义信息

常用词保持完整,生僻词拆分成有意义的片段。比如"unhappy" = "un" + "happy",AI能理解否定含义。
未知词🎯

解决未知词问题

即使遇到词表中没有的词,也能拆成字符片段处理。不会出现「无法分词」的情况。

💡 例子对比:词表中没有 "unbelievable" 这个词,但能拆成 "un" + "believ" + "able" 三个Token,AI依然能理解它的含义。

5
常见问题

Q:同一个句子在不同AI模型中Token数一样吗?

不一样。不同模型使用不同的词表和分词算法。OpenAI的tiktoken、HuggingFace的tokenizers,它们的切分结果可能完全不同。

Q:如何估算一段话的Token数?

可以用专门的工具,比如OpenAI的tiktoken库。一个经验公式:英文约1 Token = 0.75个单词,中文约1 Token = 1.5-2个汉字。

Q:词表越大越好吗?

不是。词表太大会增加模型大小和推理成本。通常3万到10万是个合理的范围,需要在效率和能力之间找到平衡。

Q:中文和英文的分词有什么区别?

英文有天然的分界(空格),中文没有空格。中文分词需要更复杂的算法来判断词的边界。这也是为什么中文AI比英文AI需要更多Token的原因。

Q:如何选择合适的分词算法?

对于大多数场景,BPE是最佳选择。如果你的模型需要更精细的语义理解,可以考虑WordPiece。如果需要处理多语言,可能需要特殊优化。

6
实战技巧:如何优化分词效果?

分词优化策略
📚

技巧1:选择合适的训练数据

分词器的质量取决于训练数据。训练数据应该覆盖你的应用场景:

  • • 通用聊天模型:用维基百科、网络文本等通用数据
  • • 医疗AI:用医学文献、病历等专业数据
  • • 代码AI:用GitHub代码仓库训练
🎯

技巧2:调整词表大小

词表大小需要在效率和效果间权衡:

小词表(3万)

• 效率高,成本低

• Token多一些

• 适合实时应用

大词表(10万)

• 效果更好

• Token少一些

• 适合离线模型

🔄

技巧3:特殊Token处理

除了普通Token,还要添加特殊Token:

[PAD]: 填充用[UNK]: 未知词[CLS]: 句子开始[SEP]: 句子分隔[MASK]: 掩码用

💡 最佳实践:不要自己从头训练分词器!大多数情况下,用预训练的就行(如GPT-3.5的tiktoken)。除非你的应用场景非常特殊(如医学、法律、代码),否则没必要定制。

7
多语言分词的挑战

不同语言的分词难度
🇺🇸

英文(简单)

  • ✅ 有空格作为分界
  • ✅ 词形变化少
  • ✅ 标点独立
  • ✅ 词表相对小
  • 📊 Token效率:高

示例:"Hello world" → 2-3 Token

🇨🇳

中文(中等)

  • ⚠️ 没有空格分界
  • ⚠️ 一字多义
  • ⚠️ 词义组合复杂
  • ⚠️ 词表相对大
  • 📊 Token效率:中

示例:"你好世界" → 3-4 Token

🇯🇵

日文(困难)

  • ❌ 混合文字系统(假名+汉字)
  • ❌ 没有空格分界
  • ❌ 词形变化多
  • ❌ 需要更复杂的算法
  • 📊 Token效率:低

示例:"こんにちは" → 4-5 Token

💻

代码(特殊)

  • 🔧 结构化语言
  • 🔧 关键词保留
  • 🔧 缩进敏感
  • 🔧 特殊符号多
  • 📊 Token效率:高(专门优化)

示例:"print('Hello')" → 4-5 Token

🌍 多语言模型挑战:为支持多语言,模型需要一个统一的词表。这意味着词表会更大,某些语言的Token效率会降低。GPT-4、Claude 3等大模型都面临这个挑战。

8
总结

🎓 一句话总结

  • 分词就是把文本切分成Token,是AI处理文本的第一步,直接影响AI的理解能力
  • 三种算法:字符级(太碎)、单词级(词表大)、Subword(平衡,主流)
  • BPE算法通过统计频率,把常见字符组合合并成Token,简单高效
  • Subword优势:效率高、保留语义、解决未知词
  • 其他算法:WordPiece(BERT)、Unigram(T5)各有特点,但BPE最流行
  • 多语言挑战:不同语言分词难度不同,英文最简单,日文最困难

📚
延伸阅读

分词知识地图
📖

已掌握

  • ✓ 分词的定义和作用
  • ✓ 三种主要算法
  • ✓ BPE算法原理
  • ✓ Subword的优势
  • ✓ 多语言分词挑战
🔄

下一篇

  • • 词表的构建
  • • 词表大小的权衡
  • • 特殊Token
  • • 词表优化技巧
🔮

进阶学习

  • • SentencePiece算法
  • • 动态分词
  • • 自定义分词器
  • • 分词评估指标

✏️
小测验

你理解了吗?

问题1:为什么Subword分词比字符级和单词级更好?

点击查看答案

Subword分词在效率和语义保留之间找到了平衡。它不会像字符级那样产生太多Token,也不会像单词级那样导致词表过大或无法处理未知词。

问题2:BPE算法的核心思想是什么?

点击查看答案

BPE算法通过统计训练数据中最频繁出现的字符对,将它们合并成新的Token。通过不断重复这个过程,逐步构建一个既能覆盖常用词,又能处理生僻词的词表。

问题3:为什么中文比英文需要更多Token?

点击查看答案

中文没有空格作为自然的分界,需要更复杂的算法来判断词的边界。而且中文的词义组合更复杂,一个汉字往往需要和其他汉字组合才能表达完整含义。

下篇预告

第33篇:词表:AI认识多少个字?

分词需要一个词表作为参考。词表里有多少个Token?这些Token是怎么选出来的?词表大小对AI有什么影响?下一篇,我们来聊聊词表的故事。

✏️ 手绘图解 · AI Catch 出品

第 32 篇 / 共 84 篇