分词器(Tokenizer) 是一种将文本拆分为 token(标记) 的工具。在自然语言处理(NLP)和大语言模型(LLM)中,分词器负责把输入文本转换成 模型可以理解的最小单元,通常是单词、子词或字符。
为什么需要分词器?
计算机无法直接理解人类语言,它只能处理数字。所以在训练和使用 AI 模型时,我们需要:
- 把文本拆成 token(比如单词、子词或字符)。
- 给每个 token 编号(token ID)。
- 输入模型,让它进行计算。
比如,GPT-4 这样的模型不会直接处理"今天天气很好"这样的文本,而是会先经过分词器转换成 token ID,例如:
"今天" → 12034
"天气" → 8942
"很" → 104
"好" → 67
然后模型就可以用这些 token ID 进行计算。
分词器的类型
不同的 NLP 任务和模型会使用不同的分词方法,常见的分词器包括:
1. 空格分词(Whitespace Tokenization)
最简单的方法,按照空格拆分单词。例如:
"The weather is nice today."
会变成:
["The", "weather", "is", "nice", "today", "."]
适用于 英文 这样的有空格的语言,但 对中文无效(因为中文没有空格)。
2. 规则分词(Rule-based Tokenization)
使用词典或规则进行分词,适用于中文。例如:
"我喜欢自然语言处理"
可以拆成:
["我", "喜欢", "自然语言处理"]
但问题是:
- 规则太死板,遇到 新词(比如 "大模型")可能无法正确分词。
3. 子词分词(Subword Tokenization)
现代 NLP 模型(如 GPT-4、BERT)通常使用 子词分词,它会:
- 保留常见的词(如 "weather")。
- 拆分不常见的词(如 "unhappiness" → ["un", "happiness"])。
- 减少词汇量,提高泛化能力。
常见的子词分词算法:
- BPE(Byte Pair Encoding):GPT-4、GPT-3、CLIP 使用的分词方式。
- WordPiece:BERT、ALBERT、DistilBERT 使用的分词方式。
- Unigram Language Model:T5、SentencePiece 使用的分词方式。
GPT-4 使用的分词器(BPE)
GPT-4 和 GPT-3.5 使用 BPE(Byte Pair Encoding) 分词器,它的特点是:
- 可以处理多种语言(包括英文、中文、日文等)。
- 会把罕见单词拆成多个子词,但高频单词不会拆。
- 对中文的处理方式 是以「子词」为单位,不会按单个字符拆分。
示例
以 OpenAI 的 tiktoken
分词器为例:
import tiktoken
enc = tiktoken.get_encoding("cl100k_base") # GPT-4 使用的分词器
text = "今天天气很好"
tokens = enc.encode(text)
print(tokens) # 输出 token ID
print(enc.decode(tokens)) # 还能还原回去
可能会输出:
[12034, 8942, 104, 67]
模型内部只处理这些 token ID,而不是原始文本。
总结
- 分词器 负责把文本转换成 token,让模型能理解。
- 不同的分词方法 适用于不同的语言(空格、规则、子词等)。
- GPT-4 使用 BPE 分词器,能高效处理多种语言。