在谈论模型能力、模型价格时,Token 这个词经常被提及,那么 Token 究竟是什么?
什么是 Token
从直觉上看,Token 可以理解为衡量模型「一次能看多少内容」的尺子。我们常说的上下文窗口(Context Window),本质上就是模型在一次推理中最多能处理多少个 Token,而不是多少个字或多少个单词。
什么是 Tokenizer
模型只能看懂数字,看不懂人类语言。要将人类语言变成模型能理解的数字序列,就需要一个中间角色,这就是 Tokenizer。它负责完成编码和解码两个方向的工作:编码时把文本切分并映射成 Token ID,送入模型;解码时再把模型输出的 Token ID 翻译回可读的文本。编码可以进一步拆成两个阶段:先把句子拆成一个个 Token,再把这些 Token 映射为对应的 Token ID。
Tokenizer 的原理
以常见的 BPE(Byte Pair Encoding)算法为例,Tokenizer 的工作可以分成训练阶段和使用阶段。训练阶段会在大规模语料上做统计,把那些经常一起出现的字或词合并成一个更大的 Token,同时由此生成词表和一套合并规则。到了实际使用阶段,编码流程通常是:先把句子按照单字或更细粒度拆开,然后根据合并规则一步步合并,得到最终的 Token 序列,最后再通过词表把每个 Token 转成对应的 Token ID;解码则是反过来,根据词表把模型输出的 Token ID 转成 Token,再拼接成完整的文本。
一个常见的问题是:为什么要合并成更大的 Token,而不是简单地「每个字就是一个 Token」?原因在于效率。如果全部用最小单位(比如单字),同样一段文本会被拆成更多的 Token,意味着模型在训练和推理时要处理更长的序列,计算量更大,也更难在给定的上下文窗口内装下足够多的信息。通过合并高频片段,Tokenizer 在一定程度上起到了「无损压缩」的作用,让模型用尽量少的 Token 看尽量多的内容。
另一个容易让人疑惑的点是:既然编码阶段要从小单位往大 Token 合并,为什么解码阶段却不需要再做类似的「切分」?原因在于,模型在推理时一次输出的单位本身就是 Token——也就是说,它已经在 Token 级别进行「逐个生成」,不需要再从更小的单位往上组合,所以只要按词表把 Token ID 查回对应的 Token,再按顺序拼起来就可以了。
总结
最后,一个值得记住的经验数字是:对于中文,你可以记成一个近似关系——1 个 Token 大约对应 1.5 个汉字,或者 4 个英文字符,或者约 0.74 个英文单词。这个数字并不精确,但足够用来估算一段文字大概会占用多少 Token,从而帮助你在实际使用大模型时,对上下文窗口和成本有一个直观的感觉。