大模型里的 Token 是什么?为什么中英文 Token 数量差异很大,各家 API 又为什么按 Token 计费?

模型架构

答案要点 Token 是大模型处理文本的最小单位,由分词器(Tokenizer)切出来,可能是一个词、半个词或一两个汉字 模型的输入输出、上下文窗口、计费全部以 Token 计量,而不是字符或单词 中英文差异:主流词表偏英文,1 个英文单词约 1~1.3 token,1 个汉字常需 1~2 token 按 Token 计费是因为计算量与 Token 数直接成正比,每生成一个 token 都要完整跑一遍前向计算 估算成本先估 Token:输入和输出都收费,输出单价通常更贵 核心概念 Token 是大模型读写文本时的最小处理单位,由分词器(Tokenizer,把文本切分成小片段的组件)按照训练好的词表把句子切开。它不等于「字」也不等于「词」:常见英文单词可能整体就是 1 个 token,生僻词会被拆成几段,一个汉字可能对应 1~2 个 token。主流切分算法是 BPE(字节对编码)一类:高频片段合并成一个 token,低频内容拆碎处理。 中英文 Token 差异 | 文本 | 大致换算 | |------|---------| | 英文 | 1 个单词 ≈ 1~1.3 token,100 词 ≈ 130 token | | 中文 | 1 个汉字 ≈ 1~2 token(新模型扩充中文词表后接近 1) | 原因是词表大多在以英文为主的语料上训练:英文高频词能整词进词表;汉字数量庞大,很多只能拆到字节级。这意味着同样含义的一段话,中文往往更「费 token」——窗口装得更少、调用费用更高(新一代国产模型已扩充中文词表,差距在缩小)。 为什么按 Token 计费 模型每一步计算的对象就是 token 序列,算力消耗与 token 数量近似成正比 生成阶段是逐 token 输出的,每吐一个 token 都要完整跑一次前向计算,所以输出单价通常比输入贵数倍 字符数、单词数都反映不了算力消耗,token 才是与成本对齐的计量单位 入门后可深入 BPE 的合并训练过程,以及词表大小对效果和推理成本的影响。

口语版讲法(约2分钟)

  • 一句话定义:分词器切出来的最小处理单位
  • 比喻:token 是乐高积木,模型按块干活
  • 中文比英文费 token,根源在词表偏英文
  • 计费本质:算力消耗与 token 数成正比,输出更贵
  • 埋钉子:BPE 词表怎么训、词表大小的权衡

Token 是大模型处理文本的最小单位。大模型其实不认识「字」或「单词」,它拿到一段文本后,会先用分词器,也就是 Tokenizer,按照一个提前训练好的词表把文本切成一个个小片段,这些片段就是 token。它可能是一个完整的英文单词,可能是半个词,也可能是一两个汉字。模型的输入长度、输出长度、上下文窗口的限制,全都是拿 token 来数的。 打个比方,token 就像乐高积木:模型不管你搭的是什么句子,它只按积木块的数量来干活。切分规则一般用 BPE 这类算法,思路是高频片段合并成一整块,比如 the 这种高频词自己就是一个 token;低频的生僻内容就拆碎,比如 tokenization 会被拆成 token 加 ization 两块。 这里有个对中文用户很实际的问题:同样意思的一段话,中文往往比英文更费 token。因为主流模型的词表大多是在英文为主的语料上训练的,英文高频词能整词进词表,大概一个单词一点几个 token;而汉字太多,很多字进不了词表,只能拆到更碎的字节级,早期模型一个汉字要一到两个 token。所以同样 8K 的窗口,装英文文档比装中文装得多,调 API 的费用也更高。不过新一代国产模型专门扩充了中文词表,这个差距在缩小。 至于为什么各家都按 token 计费,本质是 token 数直接对应算力消耗。模型每处理一个 token 都要做一遍完整计算,尤其是生成阶段,答案是一个 token 一个 token 往外蹦的,每蹦一个都要跑一次完整的前向计算,所以你会看到 API 定价里输出通常比输入贵好几倍。字符数、单词数都反映不了真实成本,只有 token 数和算力是对齐的。 顺着这个话题再深挖的话,BPE 词表是怎么一步步合并训练出来的、词表开多大合适,其实都很有讲究,会直接影响中文的 token 效率和推理成本,这块可以继续聊。

关键一句:Token 是分词器切出的最小处理单位,模型算力消耗与 token 数成正比,这是按 token 计费的根本原因。

面试官可能的追问

  1. 【场景切入】你要给公司做成本预算:每天 1 万次调用,平均每次输入 500 个汉字、输出 300 个汉字,你怎么估算一天大概消耗多少 token?
  2. 【概念辨析】Token、字符、单词这三个概念有什么区别?为什么模型的上下文长度不用字符数来定义,而要用 token 数?

同模块相关题目