Attention→K3 三十天课 · Day 2 / 30 课程首页 面试视角 自测题
Day 2 · Token:文字怎么变成数字

AI 不「认字」,它只认编号——但编号该怎么编?

昨天我们说了「AI 的本质是接龙打分」,但跳过了一步:文字怎么进计算机?今天就补这块地基——为什么按字编号、按字母编号都走不通,工程师是怎么折中的,以及为什么你调 API 花的每一分钱,都按一个叫 token 的单位来收。

学完你能回答
AI 为什么不直接「认字」?
学完你能回答
BPE 是怎么「合并」出零件的?
学完你能回答
为什么聊天要按 token 计费?

1起点:这些你早就会了

今天的主角 token 听起来陌生,但它的每个侧面,你在生活里都见过同款。先看对照表,把「你会的」翻译成「AI 在做的」:

你已经会的AI 世界里对应的东西
查字典:每个词条在字典里有个编号AI 的「词表」:每个 token 对应一个编号——编号是 AI 唯一能处理的东西
英语词根:un- 表否定、-ness 把形容词变名词AI 把文本拆成「不大不小的零件」来认,思路和拆词根一模一样
乐高:有限种积木,拼出几乎任何东西有限的词表(常见 10–20 万个零件,行业常见范围,示意)拼出几乎任意文本
商家把常一起买的商品打包成「套餐」BPE:把常一起出现的字块合并成一个 token(§4 讲)
手机流量按 GB 计费,用多少算多少大模型 API(程序接口)按 token 计费,输入输出分开算
行李箱限重 20kg,超了得扔东西上下文窗口按 token 限容量——K3 的上限是 100 万 token(§7 讲)

没有一项超出日常经验。今天剩下的时间,就是把这张表的每一行讲具体。

2按字编号?按字母编号?两头都走不通

计算机只认数字,不认文字——所以文字进 AI 之前,必须先变成编号。听起来简单,但「按什么粒度编」是个折磨了工程师很多年的问题。两个最直觉的方案,各有一个致命伤:

三种编号方案对比:按字母、按整词、token 中间路线 按字母词表小但序列太长;按整词序列短但词表爆炸且有不认识的新词;token 是平衡点 同一段文字,三种编号方案 按字母编号 ✓ 词表只有几十个 ✓ 永远没不认识的词 ✗ 一句话切成几百块 ✗ 序列太长,算得慢 ✗ 单块几乎没含义 按整词编号 ✓ 每块意思完整 ✓ 序列最短 ✗ 词表爆炸到几十万 ✗ 新词没有编号 (未登录词,直接没法算) Token 中间路线 ✓ 词表 10–20 万(示意),可控 ✓ 序列长度适中 ✓ 生词可拆回小零件 ✓ 零件本身常带含义 三个互相打架的要求:词表别太大 · 序列别太长 · 生词要认得
图 1 · 两种直觉方案各有一个致命伤:切得越细,词表越小、但序列越长;切得越粗,序列越短、但词表越大还认不得生词。出路只有一条:找「不大不小」的中间粒度。
记住这个权衡:词表大小、序列长度、未登录词——三者互相牵制,任何编号方案都是在它们之间找平衡。这个三角是今天面试题的题眼,先存脑子里。

3Token:不大不小的零件

中间路线就是:把文本切成比字母大、比整词小的零件,这些零件叫 token(中文常译「词元」)。常见的词整体保留(「学习」是一个零件),罕见的词拆成小零件拼(「unhappiness」拆成 un / happi / ness)。这和英语课拆词根是完全同一个思路:你没背过 unhappiness,但认识 un- 和 -ness,意思就能猜个八九不离十。

文本拆成 token 零件,再查编号表变成数字 英语 unhappiness 拆成 un/happi/ness,中文 深度学习 拆成 深度/学习,各自查编号表得到数字 ① 英语:按高频零件拆(思路同词根 un- / -ness) unhappiness un happi ness 查编号表 → 421 3071 88 (编号为示意) ② 中文:按高频字块拆 「深度学习」 深度 学习 查编号表 → 513 2077 (编号为示意)
图 2 · 文字进 AI 的必经之路:文本 → 拆成 token 零件 → 查编号表变成数字。注意「学习」这个零件被海量词汇共用(机器学习、深度学习、学习笔记……),这就是拆零件的好处:常用零件能拼出几乎任何文本,遇到没见过的生词也能拆回小零件拼出来——AI 永远不会碰到「没法编号的东西」。
打个比方
token 词表就像一本词典:每个词条有编号,AI 只认编号。严格来说,编号本身不含任何「释义」——421 号和 422 号并不更「亲近」,编号只是门牌号。意思从哪来?要靠给每个编号发一个「坐标」,那是明天(Day 3)的主题。
记住这个词 Token(词元):AI 处理文本的最小单位,也是本课程从今往后的唯一计量单位——上下文长度、训练量、计费,全都按它算。

4BPE:零件表是「合并」出来的

零件表不是语言学家手工编的,是从语料里「算」出来的。算法叫 BPE,思路一句话就能讲清:先从单字开始,反复把「最常挨着出现的一对」合并成一个新零件,直到词表装满为止。

BPE 合并过程:从单字出发,反复合并最高频相邻对 第 0 轮全是单字;第 1 轮合并最高频的「学+习」;第 2 轮合并「深+度」;直到词表装满 从单字出发,每轮合并「最常挨着出现的一对」(示例为示意) 第 0 轮 深 度 学 习 全是单字,谁也没合并 第 1 轮 深 度 学习 「学+习」在语料里出现最多 → 合并成新零件 第 2 轮 深度 学习 「深+度」频率也很高 → 也合并 一直合并到词表装满(常见 10–20 万个词条,示意)为止 → 这张表从此固定,AI 只认表上的零件
图 3 · BPE 的合并直觉:高频组合优先「毕业」成独立零件,低频组合留在原地继续当小零件用。所以词表里既有「学习」这样的整块,也有单个生僻字——频率决定了一切。
打个比方
像商家设计套餐:先卖单品,统计哪些商品总被一起买走,就把它们打包成套餐上架。「学习」是天天被一起买走的热门套餐;「犇骉猋」这种冷门组合就老老实实按单品卖。严格来说,BPE 只看统计频率、完全不懂语法——「unhappiness」被切成 un / happi / ness 而不是 un / happy / ness,是频率说了算,不是英语老师说了算。
进阶小注 ·BPE 全称 Byte Pair Encoding:实际实现在字节(byte)级别起步合并,所以任何语言、表情符号、乱码都能兜底拆成零件,永远不会「没法编号」。

5Token:AI 世界的最小计量单位

为什么要单独拿一节讲「单位」?因为从今天起,这门课里所有数字都按 token 报:上下文窗口多大、训练用了多少数据、聊天花了多少钱。先完成全文唯一一次换算,之后我们只说 token:

全文唯一一次换算(记住它,之后不再换算) 对中文,约 1 个汉字 ≈ 0.7–1 个 token(常用字块会被合并,所以往往不到 1)。换算示例也只此一次:K3 的 100 万 token 上下文,大约相当于一部百万汉字量级的长篇小说。从下一行起,「字」「词」退居幕后,我们只讲 token。

这个单位在两个地方直接决定你的体验和钱包:

所以「这句话多少 token」不是一个学术问题:它直接等于「这句话占了多少记忆、花了多少钱」。这也是为什么同样的聊天,有人月费几块、有人月费几百——用量差在 token 上。

进阶小注 ·不同模型的词表不同,同一段文本的 token 数也不同——比较两家 API 价格时,「每百万 token 单价」要连同各家词表的拆分粒度一起看,单看单价可能误判。这条记住结论即可。

6面试视角

面试视角
面试官可能会问:「为什么不能直接按字训练,要拆 token?」
八股答「因为按整词编号词表太大收不全,按字母或单字编号序列又太长,所以要折中成 token。」——两句话背完,追问一句「词表太大有什么坏处、序列太长有什么坏处」就卡壳了。
本课答「这其实是三个量的权衡。词表大小:按整词编号词表会爆炸,还解决不了未登录词——新造的词没有编号就没法算;序列长度:按字母或单字编号,同一句话被切成的块数翻好几倍,序列越长每步计算越贵、上下文窗口消耗越快;未登录词:token 方案遇到生词能退回小零件拼出来,永远有编号。BPE 的作用是按频率自动找到这个平衡点:高频组合合并成大零件省序列,低频组合留着当兜底小零件。所以拆 token 不是规定动作,是在这三个约束下算出来的最优折中。」

看出差别了吗?八股答的是「结论」,本课答的是「权衡的结构」——词表大小、序列长度、未登录词,把这三张牌摆出来,面试官就知道你是真懂。

7映射到 K3:报告里的 token

回到我们的「样本」Kimi K3。报告引言的第一句话,就用 token 当单位报出了它最亮眼的指标之一:

K3 原文(§1 引言)
「我们推出 Kimi K3:一个原生多模态的混合专家(MoE)模型,总参数量 2.8T,激活参数 104B,上下文窗口最高达 100 万 token。」

逐词翻译:

  • 上下文窗口:AI 一次对话能「看到」的内容总量上限(Day 6 细讲它的代价)。
  • 100 万 token:这个上限按 token 计——正是今天讲的零件。注意报告不说「多少字」,因为字不是 AI 的计量单位,token 才是。
  • MoE、2.8T、104B:先混个眼熟,第 3 周(MoE)和第 4 周(规模)会逐个拆开。
0.7–1
约 1 个汉字对应的
token 数(全文唯一换算)
10–20万
常见 token 词表规模
(行业常见范围,示意)
100万
K3 上下文窗口
(报告 §1 引言)
3
拆 token 要权衡的三方:
词表 · 序列 · 未登录词
一句话总结今天 文字进 AI 前必须变成编号;按字或按字母编号都走不通,于是有了中间粒度的 token;BPE 按频率把零件表「合并」出来;从此上下文、训练量、账单,全都按 token 这个最小计量单位算。

8自测题(先自己答,再点开看解析)

Q1AI 为什么不直接「认字」,非要把文字拆成 token?
因为计算机只认数字,文字必须先变成编号。而编号粒度是个三难权衡:按整词编号,词表爆炸且遇到生词(未登录词)没法算;按字母或单字编号,序列被切得太长,计算贵、上下文消耗快。token 取中间粒度,让词表大小、序列长度、生词覆盖三者同时可接受。
Q2用自己的话讲讲 BPE 是怎么「合并」出零件表的。
从单字开始,统计语料里哪两个相邻块最常挨着出现,把它们合并成一个新零件;重复这个动作,直到词表装满(常见 10–20 万个,示意)。所以高频组合(如「学习」)优先成为整块,低频组合留着当小零件——词表完全由频率决定,不靠人手工编。
Q3为什么大模型聊天按 token 计费,而不是按「句」或按「次」?
因为 token 才是 AI 真实的处理单位:每个 token 都要走一遍完整的计算流程,工作量与 token 数成正比,而与「几句话」无关——一句话可能 10 个 token,也可能 1 万个。按 token 计费等于按实际消耗的计算量计费,输入和输出还分开计价(输出通常更贵,因为它是逐个算出来的)。
Q4有人造了个全网没人用过的新词发给 AI,它会「不认识」吗?
不会。这正是 token 方案解决「未登录词」问题的方式:词表里没有这个新词的整块编号,就把它拆回更小的零件(字块、字母乃至字节)拼出来。零件都有编号,所以 AI 永远能处理——只是拆得越碎,消耗的 token 越多。
Q5判断题:token 词表越大越好,因为大词表里整块更多、序列更短。
错。词表大确实让序列变短,但代价是:词表本身占的参数和存储变大,每个候选 token 的打分表也变长,低频词条因为训练数据稀疏而学不充分。词表大小、序列长度、生词覆盖是三方权衡,BPE 和词表规模的选择就是在找平衡点——不是越大越好,也不是越小越好。
《从 Attention 到 K3 · 大模型近十年设计演进》30 天课 · Day 2 / 30 · 返回课程首页