一句话定义:SentencePiece 是 Google 开源的分词工具(tokenizer),它把原始文本直接当作一串 Unicode 字符来切分,不做“先按空格或词典切词”的预处理,输出的是子词(subword)。
它到底做了什么
传统分词器的流程是“两步走”:先按规则把句子切成单词——英文看空格,中文查词典或用统计模型切词——再把切出来的单词拆成更小的子词。问题就出在第一步:它绑定了语言。中文、日文没有空格,泰文连词边界都难找,每换一种语言就得换一套规则。
SentencePiece 把这一步直接砍掉。它把整句话连空格一起当成字符流,空格不是分隔符,而是一个普通符号,统一写成 ▁。然后在这个字符流上跑子词算法(BPE 或 unigram 语言模型):统计哪些相邻字符总是黏在一起,就把它们合并成一个 token,反复迭代,直到词表大小达到设定值。
打个比方:传统做法像先按词典把文章拆成一个个词,再决定哪些词该拼在一起;SentencePiece 像不看词典,只看“哪几块积木总是被同时拿起来”,就把它们预先粘成一块大积木。空格也是一块积木(▁),所以解码时能精确还原原句的空格位置。
为什么中英日能共用一张词表
因为整个过程不依赖“词”这个概念。训练语料混着中英日,算法一视同仁地统计字符共现:
- 中文里“人工智能”四个字高频连用,就合成一个 token;
- 日文里“ありがとう”连用,也会合成一个 token;
- 英文里“▁the”常出现,同样合成一个 token。
同一套统计、同一张词表,就能同时装下多种文字。遇到没见过的字也不会“查无此词”——最差的情况是拆成单字符,所以基本没有未登录词(OOV)问题。
和相邻概念的区别
| 对比项 | 传统分词器(按空格/按词典) | SentencePiece |
|---|---|---|
| 是否需要预分词 | 需要,每种语言一套规则 | 不需要,直接吃原始字符 |
| 空格 | 当作分隔符丢掉 | 当作普通符号,记作 ▁ |
| 词表 | 通常一种语言一张 | 多语言可共用一张 |
| 未知词 | 可能变成 [UNK] | 回退到字符,基本不会 |
字节级 BPE(byte-level BPE)同样不依赖语言规则,但它以字节为单位,词表里全是字节对;SentencePiece 更多以字符和子词为单位,并且显式保留空格信息。两者都是为了让模型摆脱“单词”这个包袱。
对从业者和普通人的意义
对做多语言模型的人来说,一份词表跑遍中日韩英,省掉了为每种语言维护分词器的麻烦;▁ 的存在让生成任务能准确还原空格,输出格式更可控;没有 OOV,也让低资源语言的处理更省心。具体某个模型用哪种分词器、词表多大,以该模型的官方页面为准。
对普通人来说,这解释了一个常见现象:同一段意思,中文和英文切出来的 token 数量比例,常常和字数比例对不上。因为切法不同,计费和上下文长度也不一样。知道这件事,写提示词、估算用量时会更有数。
