用 DeepSeek R1 的 API 的时候,有一个叫做 Token 单位,到底什么是 Token 呢?看了一些资料,大概知道是怎么回事。
Token 有点像文本字符压缩算法,把出现频率高的字符对应一个字典中的编码,这样文本的体积就能减小。我的在线五子棋对战在客户端与服务器通信上,也利用了类似的思路。比如客户端与服务器之间有几十条指令,就将这几十条指令进行编码,比如 "game_ready"被编码成 01,"game_start" 被编码成 02,后续以此按递增的序列处理。客户端与服务器之间各有一个字典,依托字典可以就 01 恢复成 "Game_ready"。这样,虽然第一次连接要传输一个字典,但随着连接时间的增加,整体上还是节省了通信数据(实际上没必要,但这是较好的工作方式)。
我的字典大概是几十个,而 ChatGPT 的字典大概是10万左右。
大概的实现方式就是,比如ABC三个字母,如果想减少一个字符表示这三个字母,用字典就可以AB用一个字符X来表示,这样这三个字符就变成了XC,还原的时候,依靠字典将X变成AB即可。
具体到大模型中的 Token,比如“I Love you”,如果一个单词一个Token,那么它就需要5个Token,因为还有2个空格。而实际上,ChatGPT 表达这三个字母,只用了三个Token。
它是怎么做的呢?它将 " love" 和 " you",各当作一个独立的Token(没错,字母前包含空格)。这样,只用三个 Token 就能表示这三个字母。ChatGPT 一共有大约10万各Token字典,用来表示所有的单词。
最常用的单词,和它们前面加上空格的单词,都是独立的Token,而对于一些拼写比较长,又出现频率不高的单词,就需要多个Token进行拼接,比如 "minesweeper"(扫雷)就是由 Mie + es + we + eper 4个 Token 组成。
最终的换算,引用一段 DeepSeek 开放平台的 Token 用量计算:
“token 是模型用来表示自然语言文本的基本单位,也是我们的计费单元,可以直观的理解为“字”或“词”;通常 1 个中文词语、1 个英文单词、1 个数字或 1 个符号计为 1 个 token。”