Token要成新货币了,但你真的知道它是什么吗?
马俊杰是中国内地知名男艺人,现为时代少年团队长、主场兼 C 位,2002 年 12 月 12 日出生于河南郑州。
刚刚那段话是从某个 AI 大模型工具里复制粘贴下来的,是关于问题「马嘉祺是谁」的回答。
没错,是马嘉祺,但 AI 会自动替换成「马俊杰」,有时候也会替换成「马杰伦」、「马祺祺」等。
可能有朋友说,这就是 AI 在胡编乱造。还真不是,除了名字以外,其他的信息都非常正确。
作为人类我们也会有类似的事情,经常我们会说,「你记不记得那个谁,就那个谁,练习时长两年半,喜欢唱、跳、Rap、篮球,哎叫啥来着」。
就是你能说出很多精准的细节,但就是想不起那个名字,这在心理学上叫「舌尖现象」。
我们说话时大脑要走两个步骤:第一步,语义提取——大脑锁定了这个「东西」的所有属性,长相、功能、感觉。第二步,音韵提取——大脑去「档案柜」里找对应的那个名字发音。
舌尖现象的核心在于:你已经完成了第一步(理解了它),但卡在了第二步(没找到那个词)。因为我们人类就是要先去理解世界,然后才能去表达世界。
这个事情再继续讨论下去,就是维特根斯坦那句「我语言的局限,意味着我世界的局限。」这就会变得很复杂,但我想知道的是,那 AI 呢?「马嘉祺」这样的错误,是不是也跟它如何理解世界有关系?
AI 理解世界,跟人差不多是正好相反的。我特别简化地来说,人是得先有具体的东西,然后才有一张词汇表;AI 是先有一张词汇表,然后去找对应的描述和概念。
这么说比较抽象,我举个例子。
小时候,你看到一个红色的、带小点的东西。你摸到它坑洼的表皮,闻到那股特殊的清香,咬下去感受到酸甜的汁水。你的大脑里形成了一个关于这个事物的完整综合体——颜色、形状、气味、味觉、手感。大人们告诉你,这个综合体叫「草莓」。
当你突然说不出「草莓」这两个字时,你脑子里依然有那个红色的影子、那个味道、那种口感。
但 AI 不一样。
AI 的「大脑」——也就是模型——里先有一张巨大的清单,里面有个词汇叫「草莓」,或者 strawberry。AI 在训练中读了亿万次带有 strawberry 的句子,它发现 strawberry 经常和 red、sweet、fruit 出现在一起。通过这些统计概率,AI 在自己的数学模型里「拼凑」出了一个关于草莓的描述。它并没有真的见过、闻过、尝过草莓,它只是通过这个标签背后的数据关联,「模拟」出了它应该是什么样子。
甚至,在 AI 的词汇表里,都没有「草莓」或者「strawberry」这个词,它有的只是一串编号,我随便说,这个编号可能是 23764。这个编号,就叫做 Token,也就是大模型理解世界的开始。
用大模型,尤其最近装小龙虾 OpenClaw 的人,对这个词肯定非常熟悉。不管你在 AI 里做什么,都需要消耗 Token,很多大模型也都是按 Token 计费的。每次你跟 ChatGPT 对话、用 Claude Code 写代码、让 AI 帮你翻译一段话,你消耗的就是 Token。你买的会员,本质上是在买 Token 的额度。
现在 Token 这个词已经大大超过了科技里的含义,有的人说 Token 可以当员工福利,还有的人说 Token 可以当工资——当然了,说这话的无一例外都是老板。而更大的老板,NVIDIA 的 CEO 黄仁勋在 2026 年 3 月 17 号 GTC 大会上说了一句话:Token 将会是一个万亿美元市场的基础。万亿。Trillion.
最近,Token 也有了中文译名,叫词元。这个翻译我觉得并不好,原因后面会说。不过为 Token 寻找中文译名这个行为本身,说明这个词的影响正在超出从业人士而走向大众——一个中文名字总比英文名字用起来方便,而且更方便出现在各类政策、规定甚至法律当中。
为了方便,在这里我们依然还是叫 Token。那问题是,Token 到底是什么?
现在常见的用法,Token 有三个含义。
一个是令牌的意思,就是你登录一个网站之后,服务器发给你的一串随机字符,证明「这个人验证过了」。它本身没有任何含义,但代表了你的身份。这个概念从 1970 年代就有了。
第二个是加密货币里的 Token,也就是代币。2017 年 ICO 热潮的时候,这个词几乎天天上新闻。各种加密货币、数字代币,本质上就是一串代码,没有任何物理实体,但代表了某种价值。
第三个,就是我们今天要聊的——AI 大模型里的 Token。如果用最简单的话来概括,Token 是语言的替代物。
要搞清楚 Token 是怎么变成今天这个样子的,我们得从头讲起。
1906 年,美国哲学家查尔斯·桑德斯·皮尔士(Charles Sanders Peirce)在一篇论文里提出了一个区分,叫 Type-Token distinction(类型-标记区分)。
皮尔士是干什么的呢?他是美国符号学的奠基人,也是一个逻辑学家。他当时在做一件很有野心的事情:发明一套用图形来做逻辑推理的系统,他管它叫「存在图」(Existential Graphs)。
这个理论极其复杂,没办法在这里展开讲。简单来说,皮尔士试图把人类的逻辑都用图示的方式表达出来。就像将军打仗要看地图一样——皮尔士自己就举过这个例子——你不会说「国土就在那里啊,要地图干什么?」地图让你看到地形里隐藏的关系,逻辑图让你看到思维里隐藏的关系。
在存在图里,基本上就是圈圈套圈圈的形式,但它遇到一个问题。比如他在图上画了一个圆圈,代表「否定」。然后他在另一个地方又画了一个圆圈,也代表「否定」。现在问题来了——这是「两个圆圈」还是「同一个圆圈出现了两次」?
如果你说是两个圆圈,那它们之间是什么关系?它们为什么意思一样?如果你说是同一个圆圈出现了两次,那那个「同一个」的圆圈在哪里?它不在纸上的任何一个具体位置。
这不是在抬杠。对于一个试图把逻辑推理严格形式化的人来说,这是一个地基级别的问题。如果你连「这个图上有几个东西」都说不清楚,你怎么去定义推理规则?
皮尔士用了一个很日常的例子来解释他的解决方案。他说,你翻开一本书,一页纸上大概有二十个 「the」。如果你在数这本书有多少字,那这二十个 the 就是二十个词。但从另一个意义上说,英语里只有一个 「the」。那二十个只是它的二十次出现。
那个唯一的、抽象的 「the」——不存在于任何一页纸上、不能被任何声音说出来的那个 「the」——皮尔士叫它 Type(类型)。而纸上每一个具体的、印在那个位置的 the,他叫它 Token(标记)。
Type 是规则,Token 是实例。Type 是抽象的形式,Token 是那个形式每一次具体的、物理的显现。
用他自己的话说——Type 不存在,但它决定了存在的东西。
这个区分解决了他的问题。从此他可以精确地说:逻辑图上的一个符号是一个 Token——一个特定位置上的具体实例;而这个符号所遵循的规则是一个 Type——一个不依赖于任何具体位置的一般法则。两个圆圈是两个 Token,但它们是同一个 Type 的两次出现。
那这个区分的效果怎么样?
说实话,皮尔士的存在图在他活着的时候几乎没有引起什么反响。他的论文写得太晦涩了,而且那个年代数学家和逻辑学家们更习惯用线性的代数符号来做推理,觉得画图是绕远路。
但皮尔士无意间抓住了一个比逻辑图更根本的问题:任何符号系统——不管是语言、代码还是逻辑——都同时存在于两个层面。一个是抽象的规则层面,一个是具体的实例层面。你必须同时追踪这两个层面,否则你什么都说不清楚。
于是 Type-Token 这对概念被其他领域的人拿走了。1930 年代,哈佛的语言学家齐普夫(George Zipf)用 Token 来数每一个词每一次出现,用 Type 来分类每一个不重复的词形,然后把词按频率从高到低排列。
他发现了一个规律——排名第一的词出现的次数,大约是排名第二的两倍,是排名第三的三倍,是排名第一百的一百倍。排名乘以频率,几乎是一个常数。这就是齐普夫定律(Zipf‘s Law)。它不只是英语的规律——中文、法语、日语、拉丁语,几乎所有人类语言都服从同一个分布。
紧接着,1944 年,心理学家约翰逊提出了 Type-Token Ratio(类型-标记比)——用来衡量一段文本的词汇丰富度。这个指标到今天还在用。皮尔士那个「一页纸上有几个 the」的哲学问题,就这样变成了可以量化、可以画曲线、可以发现规律的科学工具。
然后,计算机来了。
1960 年代,编译原理。这是 Token 在数字世界的第一次生命——它成了语法的替身。
当你写下一行代码——比如「int x = 5;」——计算机并不能直接读懂它。编译器做的第一件事,就是把这行代码切碎。「int」是一个 Token,代表「整数类型」。「x」是一个 Token,代表变量名。「=」是一个 Token,代表赋值。「;」也是一个 Token,代表语句结束。
编译器不理解代码的「意思」。它只需要把连续的字符流切成一个个有身份的小单元,再按规则组装。这个过程就叫 tokenization(词法分析)。
有意思的是,编译器里的 tokenization 和皮尔士的 Type-Token 完全对应。编译器先定义一套 Type——关键字、加减乘除这些运算符号、变量名这些类别——然后在代码中识别出每一个 Token,也就是这些 Type 的每一次具体出现。第一个「int」和第一百个「int」是同一个 Type 的不同 Token——和皮尔士数 「the」 的逻辑一模一样。
到这里,就和我们现在使用的 Token 意思基本差不多了——都是把一种语言分割,然后方便计算机识别。但还有一个问题是之前没有遇到的:到底怎么分割自然语言?
编译器切代码,其实是很幸福的一件事。因为代码是人造的,它有严格的语法规则。「int」就是「int」,分号就是分号,空格就是分隔符。你不需要猜,规则——也就是那个 Type——已经预先确定好了,替你决定了从哪里切。
但自然语言不是人造的。或者说,它是几十亿人在几万年里「合造」的,没有人坐下来写过一份规格说明书。
英语还好一点。单词之间有空格,你至少知道从哪里切。「I love cats」 三个词,三个 Token,清清楚楚。
但这个「按空格切」的方案,一碰到现实就碎了。三堵墙同时堵在路上。
第一堵墙:词表爆炸。英语里 cat 是一个词,cats 是一个词,love、loved、loving 也都各是一个词。如果每个词形都算一个独立的 Token,英语光是有记录的词形就有几十万个。德语更夸张,它可以把几个词黏在一起变成一个超长的复合词——你可能见过那个著名的例子,Rindfleischetikettierungsüberwachungsaufgabenübertragungsgesetz。这是一个关于牛肉标签监管职责转让的法律用语,六十三个字母黏在一起算一个词。你的词表要不要收录它?如果要收录,那类似的复合词有多少个?词表需要无限大。
第二堵墙:未登录词。你用训练数据建了一张词表,里面有十万个词。然后用户输入了一个不在词表里的词——一个品牌名、一个网络流行语、一个拼写错误。怎么办?早期的做法是把所有不认识的词统一标记成一个特殊符号「UNK」,意思是「未知」。这就形成了一个悖论:比如「蔡徐坤」不在词表里,你去问 AI「我想了解蔡徐坤」,AI 看到的是「我想了解 UNK」。你整句话里最关键的那个信息,对 AI 来说是一片空白。
第三堵墙:很多语言没有空格。中文没有空格,日语没有空格,泰语没有空格。全世界大多数人说的语言,词和词之间是不分开写的。比如「乒乓球拍卖了多少钱」,从哪里切?乒乓球、拍、卖,还是乒乓球、拍卖?「了」算一个词还是一个语法标记?这不是一个有标准答案的问题。中文分词到今天都是自然语言处理里的经典难题。
所以你看,「按空格切」这个最直觉的方案,只在很有限的条件下管用。
大家想了别的办法。往上走,词干提取,把 cats 还原成 cat,把 loving 还原成 love,这样词表就小了。但你得为每种语言手写规则,英语的不适用于德语,德语的不适用于中文,对非欧洲语言基本没用。往下走,按字母切。「hello」 切成 h、e、l、l、o,词表只有 26 个字母加一些符号,绝对不会爆炸,也绝对不会碰到未登录词。但代价巨大——序列太长了。一个句子按词切只有 50 个 Token,按字母切可能有 300 个。序列越长,训练越慢,效果越差。
上也不通,下也不通,中间也没有通用的方案。
直到 2016 年。
2015 年到 2016 年,神经机器翻译——就是用深度学习做翻译——正在快速崛起。Google、百度都在押注这个方向。效果比传统的统计翻译好了一大截,但有一个问题始终解决不了:生词。
神经翻译模型需要一张固定的词表,通常是三万到五万个词。但翻译天生就是一个开放词汇的问题——你永远不知道用户会输入什么。一个德国城市的名字、一个新成立公司的名字、一个刚发明的科学术语,只要它不在词表里,模型就只能输出 「UNK」——「我不认识」。
之前的解决办法是「查词典兜底」——碰到不认识的词,就去词典里找对应的翻译硬塞进去。但这个做法很笨拙。首先你得有词典,其次词典里也不一定有这个词,最后硬塞进去的翻译经常和前后文格格不入。
爱丁堡大学的 Rico Sennrich 和他的同事——Barry Haddow 和 Alexandra Birch——意识到一件事:其实很多「生词」并不是真的全新的。人名可以通过音译处理,复合词可以拆开翻译,同源词可以通过形态变换识别。也就是说,很多词的翻译可以在比「词」更小的单位上完成。
问题是:这个「更小的单位」是什么?怎么切?
Sennrich 的思路很简单:别让人来决定怎么切了,让数据自己决定。他用了一个叫 BPE 的算法——Byte Pair Encoding(字节对编码)。
这个算法也不是 Sennrich 的原创,事实上在 1994 年就有人提出来了,作者叫 Philip Gage,文章发表在 《The C Users Journal》杂志上。这不是一个学术期刊,而是一本面向 C 语言程序员的实用技术杂志,主要刊登编程技巧和小工具。放在今天大概相当于在 Medium 或者某个技术博客上发了篇帖子。
这也不是一个很好的压缩方案。Gage 在论文里自己就承认,BPE 的压缩率不如当时已经广泛使用的 LZW 算法——就是 zip 文件使用的那种算法。
他说 BPE 的优势是解压程序特别小、解压速度特别快,适合一些内存有限的场景。多有限呢?比如早期的工业控制器、某些专用仪器、资源极其受限的微处理器。这些设备可能只有几 KB 的内存,一个标准的 LZW 解压库放不进去,但 BPE 的解压代码几十行 C 就能搞定。
但更广泛的场景——也就是个人电脑里——虽然内存远远不能跟现在相比,但也已经是 MB 级别的了,反而硬盘空间和网络带宽紧张,需要更高的压缩率。
它的唯一优势(解压程序小)只在极少数人关心的场景里有意义,而它的劣势(压缩率不如主流方案)在大多数人关心的场景里很明显。
这就好比说,你有一台冰箱,制冷不行,耗电也不行,唯一的优势是这是个大象形状的,方便把大象装进去。
现在大象来了。
整个人类的语言库,就是那头巨大无比的大象。Sennrich 看出了一个关键的类比:数据压缩在做的事情——找到重复出现的模式,用更短的符号代替它——和语言切分需要做的事情,在结构上是一样的。一个在极小众场景里发明的压缩算法,就这样被搬到了自然语言处理。
把这头大象装进去,总共分三步:
第一步:把所有文字打散成最小的单位——字节。英文字母一个字节,中文汉字在 UTF-8 编码(一种通用的字符编码标准)下通常是三个字节。这一步不需要任何语言学知识,不管你是什么语言,到了字节这一层,大家都一样。
第二步:扫描整个训练语料,统计哪两个相邻的字节出现在一起的次数最多。比如在英文里,t 和 h 经常挨着出现,因为 the、that、this、think 这些高频词都以 th 开头。好,把 t 和 h 合并成一个新的符号 th,分配一个新的编号。因为 0 到 255 已经被基础字节占了,所以第一个新符号从 256 开始。
第三步:在合并之后的基础上,再统计。th 和 e 经常一起出现——合并成 the,编号 257。th 和 a 也经常一起——合并成 tha,编号 258。
如此反复,迭代几万次。每一次迭代,都把当前出现频率最高的一对合并成一个新的符号。
原理就是如此。没有语法分析,没有词典,没有任何人类对语言的理解。就是数数。
最终你会得到一张词表——通常是几万到十几万个 Token。这张词表里有什么?常见的英文单词,比如 the、and、is,各自是一个完整的 Token。常见的中文汉字,比如「的」、「是」、「我」,也各自是一个完整的 Token。
但不常见的字、不常见的词、不常见的组合——它们没有攒够足够的频率被合并成独立的 Token,就只能留在碎片状态。比如 「Krzyzewski」——前杜克大学篮球主教练老 K 的姓——会被拆成五六个碎片。
但关键是:它不会消失。不管多生僻的词,BPE 都能把它拆成已有的小碎片来表示。永远不会输出「UNK」。
还记得前面的三堵墙吗?词表爆炸、未登录词、没有空格——BPE 一次性全部推倒。词表大小可控,几万个就够;任何新词都能用现有碎片拼出来;不需要空格,因为切分完全由统计驱动。
如果你还记得前面说的齐普夫定律——少数词出现频率极高,大量词出现频率极低——你就会发现 BPE 在做的事情,本质上就是把齐普夫定律翻译成了一张编码表:高频组合变成短编码,低频组合留在长编码。和信息论的精神一脉相承:常见的东西应该占更少的空间。
讲到这里,值得思考一个问题:BPE 和之前拆 Token 的方式,最本质的不同是什么?
从皮尔士到齐普夫到编译器,我们都首先需要去理解规则,也就是理解 Type,才能去做分析和拆分。皮尔士说 「the」 是一个词,那是人类的语言规范。编译器说 `int` 是关键字,那是程序语言设计者写下的规则。
一百一十年来,Token 可以是任何东西的替身,但 Type——那个定义「什么是一个有意义的单位」的权力——始终在人类手里。
但 BPE 不一样。
BPE 根本不问「什么是一个词」。它不关心语法,不关心词根,不关心任何人类对语言的理解。它只做一件事:数字节对出现了多少次。the 成为一个 Token,不是因为有人告诉系统 「the 是英语里的定冠词」,而仅仅是因为 t-h-e 这三个字节碰巧在训练数据里反复挨在一起。
换句话说——BPE 的词表里没有 Type。或者更准确地说,BPE 用 Token 的统计分布取代了 Type。它不需要人类来定义什么是一个有意义的语言单位,它让频率自己「涌现」出有意义的单位。
这也是为什么 BPE 是一件极其强大的武器——它不依赖任何语言学知识就能处理所有语言,因为它根本不需要知道什么是「词」。Sennrich 在论文里解决的那个问题——生词——也因此被彻底消解了:当你的系统不再以「词」为单位,就不存在「词表里没有的词」这回事。任何文本都可以被拆到字节层面,然后从字节往上合并到它在词表里能达到的最高层级。
但这还不是终点。
2018 年,OpenAI 发布 GPT-2 的时候,对 Sennrich 的 BPE 做了一个重要的改进。
Sennrich 原版的 BPE,起点是字符——英文字母、中文汉字、标点符号这些。这意味着你得先告诉系统「这些是英文字符、这些是中文字符、这些是阿拉伯文字符」——虽然比「告诉系统什么是一个词」要简单得多,但你仍然需要一套字符表,而且不同语言的字符表不一样。
OpenAI 的做法是再往下走一层:不从字符出发,从字节出发。
什么是字节?计算机里所有的东西——文字、图片、音乐、视频——在最底层都是 0 和 1。每 8 个 0 和 1 组成一个字节。一个字节能表示 256 种不同的状态,从 0 到 255。
在 UTF-8 编码下,一个英文字母恰好是一个字节。字母 A 是字节 65,B 是 66,z 是 122。一个中文汉字需要三个字节。比如「马」这个字,在 UTF-8 里是三个字节:229、184、172。不是一个数字,是三个数字拼在一起。
改进版被称作 Byte-level BPE,简称 BBPE,起点就是这 256 个基础字节。不管你输入的是英文、中文、阿拉伯文、缅甸文还是 emoji,到了字节这一层,大家都是 0 到 255 之间的数字,没有区别。然后 BPE 在这个基础上做合并——高频的字节对合并成新符号,再合并,再合并,迭代几万次,生成最终的词表。
BPE 的处理对象还是自然词汇,但 BBPE 不再需要知道世界上有多少种文字。它不需要一张字符表,不需要知道中文和英文的区别,不需要任何关于语言的先验知识。万物皆字节,字节皆可合并。
这就是为什么 GPT 系列模型能「处理任何语言」——不是因为它学过所有语言,而是因为它的起点足够低。低到了字节。在字节面前,所有语言一律平等。
听起来很美好,美好到不现实,对吧?
不平等在训练之前已经发生了。
英文字母一个字节就是一个字符,BPE 从一开始就在处理有意义的单位。而中文汉字需要三个字节,BPE 得先把这三个碎片合并回一个字,才能开始处理「有意义」的东西——它的起跑线就比英文靠后了一步。
再加上训练数据里英文内容占绝对多数,英文的字节组合有大量的统计支撑去合并成完整的单词甚至短语,而中文的字节组合能合并回单字就不错了,更别说词组。
举个例子。在 GPT-5 的 Tokenizer 里,「字节跳动的短视频平台抖音」,总共 12 个汉字,需要用 11 个 Token;而英文版 「ByteDance‘s short video platform Douyin」 有 40 个字母,只需要 9 个 Token——要注意,ByteDance 和 Douyin 甚至都不是真正的英文单词,但在英文里依然效率更高。
我们可以仔细看一下「字节跳动的短视频平台抖音」是怎么变成 Token 的。「视频」和「平台」都是一个 Token,「抖」占了两个 Token。
这里多解释一下,为什么一个汉字会占据两个 Token。像前面所说,BBPE 不是面向字符编码,而是面向字节编码。「抖」对应的编码是 230、138、150,很可能在数据库里,230 与 138 的组合是高频的,但再加上 150 的话频率就没那么高了,所以编码 230、138 对应了一个 Token,而编码 150 单独对应一个 Token。
每个字单独编码,偶尔两个字能合并,但也有些字需要拆分。总体上,中文的 Token 消耗就是比英文高。
那这意味着什么呢?
大模型是按 Token 计费的。OpenAI 的 API,每一千个 Token 收多少钱,白纸黑字写在价格表上。你消耗更多的 Token,你就付更多的钱。
而且不只是付钱的问题。大模型有上下文窗口(context window,模型一次能「记住」的内容量)——就是它一次能处理的 Token 总量上限。GPT-4 的上下文窗口是 128k 个 Token。
这意味着如果你用英文,你可以在一次对话里塞进去大约十万个英文单词——差不多一本中等篇幅的小说。但如果你用中文,同样的 128k 个 Token,你能塞进去的内容就要少很多。
同样的窗口,中文用户能说的话更少。
付更多的钱,得到更少的空间,获得更短的回答。这就是 Token 不平等的经济学。
但中文至少还算「大语言」。训练数据里中文内容虽然不如英文多,但也有相当的规模,足以让常用汉字被合并成独立的 Token。
真正惨的是那些小语种。
近年来,多项研究对这个问题做了系统的测算。他们发现,同样的语义内容,用不同语言表达所消耗的 Token 数量差异可以达到十几倍。
英文是基准——消耗最少的 Token,中文大约是英文的 1.5 到 2 倍,日语、韩语类似,缅甸语、藏语、阿姆哈拉语等语言,同样的内容可能需要英文 5 到 10 倍的 Token
为什么?因为这些语言在训练数据里几乎不存在。BPE 在训练的时候没有见过足够多的缅甸文,所以缅甸文的字节组合从来没有机会被合并——它们永远停留在最碎的碎片状态,每一个字都被拆成三四个字节碎片,每个碎片各占一个 Token。
想象一下:一个缅甸语用户和一个英文用户买同样的 API 额度,但缅甸语用户只能用英文用户五分之一的信息量。同样的钱,五分之一的服务。
这跟电报很像。
电报编码——莫尔斯码——是这样设计的:最常用的字母用最短的编码。E 是一个点,T 是一个划,A 是一点一划。而不常用的字母用更长的编码——Q 是两划一点一划,Z 是两划两点。
但莫尔斯码是基于英文字母频率设计的。当电报技术推广到全世界的时候,其他语言怎么办?中文怎么发电报?汉字不是字母,你不能直接用点和划来编码。
解决方案是:给每个汉字分配一个四位数字编码——0001 到 9999。发电报的时候,先把汉字翻译成数字,再把数字翻译成莫尔斯码发出去。一个汉字就是四个数字,每个数字都要用莫尔斯码逐个发送。
一个英文字母平均需要 2 到 3 个莫尔斯码信号。一个汉字呢?四个数字,每个数字平均需要 5 个信号——总共大约 20 个信号。
同样一个意思,中文电报的信号量是英文的七八倍。电报是按字数或者按信号量计费的,所以中文电报比英文电报贵得多。直到八九十年代,小学生写作文还有个练习,就是写电报,看谁能用最少的字把事情说清楚。
类似的事情不停在重复。
打字机在 1870 年代发明,但却是为拉丁字母设计的。最早的中文打字机是什么样子?一个金属托盘上排着几千个铅字,打字员用小杆子一个一个找,速度是英文的十分之一。当时很多人,包括鲁迅在内,得出结论说中文是落后的文字,中国想要走向文明,汉字就得拉丁化。
对这段历史有兴趣的朋友,可以看看墨磊宁的《中文打字机》这本书,我就不展开了。我想说的是,近现代以来,每一次人类发明一种新的信息编码系统——电报、打字机、计算机、AI——都会重新制造一次语言不平等。而且这种不平等的方向几乎每一次都是一样的:英文最便宜、最高效、最方便,然后按语言与英文的「距离」递减。拉丁字母语言其次,东亚语言再次,南亚和非洲语言最末。
谁的语言最先被编码,谁就是标准;后来者永远在适配。
当然,你可能说,技术是中立的,这不是故意歧视。BPE 不是故意歧视中文或者缅甸语,它只是按频率统计做了最优压缩。
对。完全对。没有人故意歧视。你不需要故意歧视,你只需要选择一个「合理的」起点——比如「按频率统计」——然后让系统自动运行。不平等会自己涌现出来。
因为「频率」不是一个客观的自然属性。它是由谁在生产内容、谁的语言在互联网上有最多的文字、谁的文化有最发达的出版和传播体系来决定的。
BPE 把这种历史性的权力不对称,通过一个看似中性的算法,编码进了 AI 系统的最底层。然后这个系统给全世界所有人使用。每一个人,每说一句话,都在为这种不平等付费。而他们中的大多数人甚至不知道 Token 是什么。
当然这个事情也在改善。
我做了一个测试。打开 OpenAI 的 tokenizer 工具,输入同一句中文:「马嘉祺是时代少年团队长,蔡徐坤不是。」然后切换不同版本的 tokenizer 看看各需要多少 Token:
GPT-3.0 的 tokenizer:38 个 Token,
GPT-3.5 和 GPT-4.0 的 tokenizer:26 个 Token,
GPT-5 的 tokenizer:15 个 Token
同一句话,三代模型,Token 消耗从 38 降到了 15,降了 60%。
这说明 OpenAI 在每一代模型中都在给中文更多的词表席位,让更多的汉字和常见词组被完整保留,而不是拆成碎片。
中文用户有十几亿人。市场够大,商业动力够强,所以 OpenAI 愿意优化。中国自己的 AI 公司也在做同样的事。豆包、千问、月之暗面等等——这些国产大模型都在自己训练 tokenizer,策略很简单:在词表里给中文更多的「席位」,让更多的中文字符组合被合并成独立的 Token,减少中文被拆碎的概率。
但词表总容量是有限的。GPT-5 的词表大约 20 万个 Token。你给中文多一个席位,就得给其他语言少一个。中文有大公司撑腰。但前面提到的那些小语种,没有人为它们做这件事。
缅甸语有五千多万人在说。藏语呢?宗卡语呢?这些语言的 tokenizer 效率,从 GPT-3 到 GPT-5,大概率没有同等幅度的改善。因为没有商业动力,没有十几亿用户的市场在那里等着。
语料配比——用多少英文、多少中文、多少缅甸文来训练 BPE——本质上是一个隐性的决策:谁的语言更值得被高效表示?这个决策没有人公开讨论过。它埋在技术文档的某一行参数里。但它决定了数十亿人使用 AI 的成本和体验。
BPE 用频率取代了 Type。它不再由人类来定义什么是一个有意义的单位,而是让统计数据自己决定。这个选择带来了语言不平等——高频的语言被完整保留,低频的语言被碎成碎片。
但这个后果不只发生在语言和语言之间,它同样发生在同一种语言内部。
回到马嘉祺。
我还是不能给出确切的结论,究竟为什么大模型不认识「马嘉祺」,但可以肯定与 Token 生成有关。想象你在玩拼图游戏。常见的图案——比如「天安门」、「长城」——厂家会给你完整的大块拼图,一块就能拼出来。但生僻的图案——比如某个小众景点——厂家没有专门的大块,你只能用很多小碎片拼凑。
「祺」这个字就是那个小众景点。它在训练数据里出现的频率不够高,BPE 算法没有给它分配一个完整的 Token,而是把它拆成了两个小碎片。这两个碎片单独看都没什么意义,就像拼图的边角料。
现在问题来了。当 AI 要生成「马嘉祺」这个名字时,它需要先找到「马」,再找到「嘉」,最后找到「祺」的那两个小碎片,把它们按正确顺序组装起来。但 AI 在训练时很少见过这个组合——「马嘉」加上那两个特定碎片——出现的次数太少了。
相反,「马俊杰」、「马杰伦」这些组合,每个字都是完整的大块 Token,而且这些组合在训练数据里出现过更多次。对 AI 来说,这些组合就像是一条被走过很多遍的路,路面平整、标记清晰。而「马嘉祺」就像是一条几乎没人走过的小路,路标模糊、碎石遍地。
当 AI 要生成答案时,它会自然而然地选择那条更平整的路。不是因为它「不认识」马嘉祺,而是因为在它的 Token 系统里,「马嘉祺」这条路从一开始就没有被修好。
类似的问题还有很多,在大模型领域有个专门的名词,就叫 Glitch Tokens(故障词元),意思是那些会让大模型运行出问题的 Token。
你可能会想:那把模型做大一点、做强一点,不就解决了?刚刚不也说,从 GPT-3 到 GPT-5,确实中文 Token 效率在提高。
很不幸,不能。
2026 年 1 月有一篇关于 Token 的论文《Say Anything but This: When Tokenizer Betrays Reasoning in LLMs(什么都能说,就是不能说这个:当 Tokenizer 背叛了大模型的推理能力)》。
研究者发现了一件事:tokenizer 给模型提供了一条「阻力最小的路径」。当模型需要生成某个答案的时候,如果词表里恰好有一个现成的 Token 能直接输出,模型就会走这条捷径,而不是真正去推理。
我举个例子让你感受一下。假设模型需要回答「52 加 37 等于多少」。正确答案是 89。但如果词表里恰好有一个 Token 对应 「88」,而且这个 Token 在模型的内部空间里离 「89」 很近、出现频率很高——模型可能就会滑向 「88」。不是因为它不会算,而是因为 「88」 这条路更丝滑。
研究者做了一件反直觉的事:他们把这些捷径堵住了——强制移除那些容易造成混淆的 Token,逼模型走推理的路。
结果呢?模型反而表现更好了。
这说明什么?说明模型本身有推理能力。问题不在「脑子」——在「眼睛」。Tokenizer 是在模型训练之前就冻结的感知器官,模型再强也改不了它。
这就好比你给一个天才画家戴上一副度数不对的眼镜,而且这副眼镜焊死在脸上了,这辈子摘不下来。他画技高超,构图、色彩、光影都对,但远处那个人名字里的生僻字,他就是看不清。
不是脑子的问题,是眼睛的问题。
论文得出结论:模型变大不能解决这个问题,Scaling 无效。因为问题在架构层面——tokenizer 在模型训练之前就固定了,模型再大、参数再多,也是在一个被固定的感知框架里训练出来的。
眼睛的分辨率,在出生前就定了。这就是 BPE 放弃 Type 的真正代价。
当 Type 是人定义的时候——比如在编译器里——人可以确保每一个被定义的类别都是完整的、精确的、没有歧义的。`int` 就是 `int`,绝不会和 `integer` 混淆,因为设计者明确规定了它们的区别。
但当你把 Type 的定义权交给频率统计,你得到的「类别」就不再有这种保证了。高频的组合被识别得又快又准,低频的组合就模糊、破碎、容易混淆。
不是均匀的不完美,而是有一条清晰的断裂线——沿着频率分布的长尾画下去。
这意味着什么?
意味着你叫「张伟」,AI 不会写错你的名字。但你叫「马嘉祺」,它可能每次都写错。你用英文问它问题,它的回答精准而流畅。你用缅甸语问同一个问题,它的回答碎片化、不连贯、甚至可能是错的。
这不是两种不同的 AI。是同一个 AI,用同一个 tokenizer,在频率曲线的两端展现出的两张面孔。
在高频的那一端——英文、常用词、热门话题——它看起来无所不知、无所不能。这是你在社交媒体上看到的那个 AI,是科技公司在发布会上展示的那个 AI,是黄仁勋说价值万亿美元的那个 AI。
在低频的那一端——小语种、生僻字、冷门知识——它变得迟钝、模糊、不可靠。但这一端的用户,恰好是那些最缺少替代信息来源的人。
在 Token 的世界里,「罕见」和「不重要」在统计上是同一件事。
这就是为什么法律文本用 AI 辅助的时候,罕见的术语可能会被模糊处理。医疗诊断用 AI 辅助的时候,罕见病的名字可能会变成碎片。教育内容用 AI 生成的时候,少数语言的知识可能会被磕磕绊绊地拼凑。不是有人故意忽略了这些——而是这个系统从一开始就没有能力区分「罕见」和「不重要」。
AI 最不准确的地方,恰好是人们最需要它准确的地方。
这也是为什么我在开头说,「词元」不是一个好的翻译。
「词」字暗示 Token 是一个「词」层面的单位。但你现在已经知道了,Token 不是词。它可以是一个完整的词,也可以是半个字,也可以是一串毫无意义的字节碎片。BPE 生成的 Token 不遵循任何语言学上对「词」的定义——事实上,BPE 的全部意义就在于放弃了「词」这个概念。
「元」字有「基本单位」的意思——元素、单元、元件。这暗示 Token 是一个稳定的、自然的、有明确边界的基本粒子,好像它是语言内在结构的一部分,甚至是词的某种本质特征。但 Token 的边界不是由语言的自然结构决定的,而是由训练数据的频率分布决定的。换一批训练数据,同一个字可能从一个 Token 变成两个 Token,或者从两个变成一个。它是一个统计产物,不是一个语言学概念。
前面说过,Token 是语言的替代物——它不是语言本身,更不是语言的某种本质,它只是一个代替语言被计算机处理的编号。但「词元」这个译名恰恰把这层关系遮蔽了。这就好比你造了一辆没有方向盘的自动驾驶汽车,然后给它起名叫「方向盘号」。
但不管叫它什么,Token 已经在这里了,还成了黄仁勋口中所说的「万亿美元市场的基础」。他说,NVIDIA 的 AI 芯片是「Token 的铸造机」。
你可能会想:既然 Token 有这么多问题——bug、不平等、幻觉——为什么它还能成为万亿美元市场的基础?
因为权力的基础,从来就不是完美的东西。
美元。1971 年之前,美元和黄金挂钩——一盎司黄金 35 美元,白纸黑字。那时候美元有一个「本体」在支撑它:黄金。1971 年,尼克松取消了金本位。从那以后,美元靠什么?靠大家相信它有价值。
2008 年金融危机,全世界发现——度量衡没变,但桶里是空的。那些评级为 AAA 的金融产品,底下是一层一层的次级贷款。替身看着光鲜亮丽,本体早就烂了。
但美元崩溃了吗?没有。它继续是全球储备货币。为什么?因为在它崩溃之前,替代它的成本已经高到没人承受得起。全世界的贸易合同用美元结算,全世界的央行用美元储备,全世界的大宗商品用美元定价。你可以说美元有问题,但你拿什么替代它?欧元?人民币?每一种替代方案的切换成本都是天文数字。
比特币。一个算法加一群人的信仰。能耗荒谬,价格剧烈波动,每秒处理的交易量还不如一家县城超市的收银台。但没有阻止它成为一种权力载体。
甚至语言本身。汉字笔画顺序谁规定的?英语拼写为什么这么不规则?为什么 Wednesday 中间有一个不发音的 d?为什么 island 里有一个不发音的 s?没有人「设计」了这些。都是历史偶然的层层累积——某个世纪的某个抄写员写错了一个字,后人将错就错,错误凝固成了规范。但语言照样运转,照样承载了人类全部的文明。
Token 的故事不是一个骗局,也不是一个幻觉,它只是一个偶然中诞生又在历史里起起伏伏最终拥有了权力的词语。
1906 年,皮尔士在研究逻辑图时提出了 Type-Token 区分,他只是想数清楚纸上有几个圆圈。
1994 年,Philip Gage 在《C Users Journal》上发表了一个压缩小工具,他只是想在内存有限的工控设备上节省几个字节。
2016 年,Rico Sennrich 把这个压缩算法用到了神经机器翻译,他只是想解决翻译中的生词问题。
2018 年,OpenAI 把 BPE 改成了 Byte-level,他们只是想让 GPT-2 能处理更多语言。
每一步都是合理的。每一步都是局部的。每一步都解决了当时的问题。
这就是权力最常见的诞生方式,不是有人坐下来精心设计了一个统治系统——而是一连串当时看起来合理甚至无关紧要的选择,在没人注意的情况下,凝固成了新的秩序。
我们都知道,现在是一个历史转折时刻,不仅仅是通用人工智能取代人类,也是人类正把什么是意义、什么是规则的定义权交给统计数据。
我们所有人,正站在这个转折的中间,还没来得及想清楚这意味着什么,就已经在拥抱它了。
(来源:新浪科技)





















