做产品 PMaker
空格的键盘
切分单位既不是字,也不是词 英文 Summar ize this weekly report 常见词多半只占 1 个,长词会被拆成两三段 中文 把 这份 周报 整理 成 三条 要点 12 个汉字切成 7 个 token,字数和 token 数对不上 生僻 饕餮 🥹 tokenization 4 个 token 2 个 token 3 个 token 越少见,拆得越碎,越费钱 计费按 token 走,不按字数。同一段意思换个说法,token 数能差出几成。

token 是模型眼里的最小单位。它既不是字也不是词,是从语料里统计出来的、最省事的一套切法。

Token 与计费单位

模型看不见字,它看见的是 token。你写的每一段话,都要先按一张固定的表切成碎片,再变成数字进模型。

你会遇到的现象
  • 算好的成本上线后翻了一倍,因为你按字数估的
  • 让它「数一数这段话有几个字」,它数不对
  • 同样一份文档,中文版和英文版的 token 数差得莫名其妙

怎么切出来的

切分表不是人定的,是从语料里统计出来的:把最常一起出现的字符组合并成一个 token,反复合并几万轮,得到一张几万到几十万条的词表。越常见的东西,越可能被压成一个 token;越少见的,越会被拆碎。

于是就出现了几种反直觉的情况。一个完整的英文常用词,往往只占 1 个 token。一个长一点的专业词,会被拆成两三段。一个汉字,可能是 1 个 token,也可能因为生僻而被按字节拆成 2 到 3 个。一个 emoji 通常占 2 个以上。空格和换行也算,缩进多的代码会比你想的贵。

内容大致 token 数说明
常见英文单词1词表里直接有一条
较长的专业术语2 – 4被拆成词根加后缀
常用汉字0.6 – 1高频词组会被合并成一个
生僻字、异体字2 – 3退化成按字节切
emoji2 – 4同上
一段带缩进的代码比看上去多空格和换行都要算钱
这些数字是量级,不是精确值——每家模型的词表都不一样,同一段文字换个模型算出来就不同。要准数只能拿对应模型的 tokenizer 实测。

还要知道一条:词表是训练时定死的,不能改。你们业务里那些自造词、内部缩写、产品代号,在词表里没有专门的条目,会被切得很碎。这既费钱,也让模型更难把它当成一个完整概念来理解。

账单从这来

所有模型都按 token 计费,输入一个价,输出另一个价,输出通常贵好几倍。所以估成本的公式不是「字数 × 单价」,而是要先把字数换算成 token 数。

token 不只是计费单位,它是模型的感知单位 你看到的 s t r a w b e r r y 10 个字符,r 出现 3 次,你一眼能数 它看到的 str aw berry 3 个 token,字母被封在里面看不见 这个错位直接解释了四种失灵 数不清字数 「写刚好 100 字」只能靠估,要精确得由代码截 数学不稳 长数字被切成好几段,数位关系不是强规律 字符级任务很吃力 数字母、倒着拼、判断回文,它看不见字符 200K 上下文 ≠ 20 万字 中文能塞进去更多,代码则往往比你估的少
很多「模型怎么连这个都不会」的时刻,根都在这条错位上。这类任务的正确解法不是换更强的模型,而是让它调工具去数、去算——把字符级的活交给代码。

还带来这些副作用

token 不只是计费单位,它是模型的感知单位。很多莫名其妙的失灵,根都在这。

它数不清字数。因为它看到的是 token,不是字。让它「写一段刚好 100 字的文案」,它只能凭感觉估,估不准是必然的。要精确控字数,得由你的代码去截,或者让它调工具去数。

它数学不稳。一个长数字会被切成好几个 token,数位之间的关系在统计上不是强规律。所以涉及计算的场景,正确做法是让它写出算式、交给计算工具,而不是让它心算。

字符级的任务它很吃力。数某个字母出现了几次、把一个词倒着拼、判断回文,这些任务要求它看见字符,可它只看得见 token。

上下文长度也是按 token 算的。说「200K 上下文」,指的是 20 万个 token,不是 20 万字。你能塞进去的中文内容比这个数字多一些,塞进去的代码则往往比你估的少。

接着看