
前言几乎所有用过 ChatGPT、DeepSeek、Kimi 的人都见过 token 这个词 ——API 按 token 计费、上下文窗口按 token 计算。但 token 到底是什么为什么它不是 字也不是 词本文从底层机制出发做一次全面的拆解。一、模型为什么 看不懂 文字大语言模型LLM本质上是一个巨型数字运算机器。Transformer 的全部计算 —— 矩阵乘法、注意力机制、位置编码 —— 都只作用于整数和浮点数。一段文本从输入模型到产生输出要经过这样一条流水线原始文本 → 规范化(Normalization) → 分词(Tokenization) → 查表得到 token ID → Embedding 层把 ID 转成向量 → Transformer 逐层计算 → 输出 token ID → 反向解码回文本所以严格说第一步是分词Tokenization而分词的本质是把连续的字符序列切成一个个 词元token并为每个 token 映射到一个整数 ID。模型从头到尾只见到一串整数 ID一个汉字都不认识。下面逐层拆开讲。二、Token 到底从哪里来BPE 的底层逻辑现代大模型GPT、LLaMA、Qwen 等几乎全部使用BPEByte Pair Encoding字节对编码或其变体BBPE、SentencePiece、Unigram来构建词表。1. 训练过程贪心合并假设词表初始只有 256 个字节0x00–0xFF。BPE 在海量语料上反复做一件事统计所有相邻符号对的频率把最高频的那一对合并成一个新符号加入词表重复几十万次直到词表达到目标大小常见 32k、50k、100k、15 万以上。举例语料里t, h总是挨着出现就把它俩合并成th接着th, e又高频出现再合并成the。关键洞察哪些序列会成为 token完全取决于 什么在语料中出现得最多。词表里的几万十几万个 条目是训练语料频率分布的直接产物。2. 推理过程查表 回退来了新文本后分词器做反向操作从左到右贪心查找词表里最长能匹配的子串。匹配不上时字节级 BPE 还有个保底机制 —— 退回到单字节再两两合并编码。这就是为什么英文常见词the、of、intelligent都是 1 个 token但长而罕见的词如uncharacteristically会被切成un、character、istic、ally等多个 token不同语言、不同领域的常见度不同切法就完全不同。三、为什么 汉字 和 token 不是一回事这是本文的核心。两者混淆的根源是人们把 token 当成 字 或 词 的近义词实际上它是词表中一个整数条目的代号与 字 没有任何天然对应关系。1. 一个汉字可能恰好是一个 token—— 纯属巧合中文语料在互联网上极其庞大所以高频汉字的、是、我、在、国、人……在 BPE 训练时自然被合并成独立 token。这造成一种错觉一个汉字 一个 token。实际上这只是统计规律的巧合不是设计保证。高频字是 1 个 token低频字可能切成 23 个甚至更多 token。2. 低频汉字会被拆成字节汉字用 UTF‑8 编码时占 3 个字节。如果一个生僻字如 犇 鬰 从未在训练语料中出现过足够次数词表里没有它的完整条目分词器只能退回字节级编码一个字会被表示成 23 个 字节 token。也就是说一个汉字 ≠ 1 个 token它可能是 1 个也可能是 3 个甚至跨汉字的组合被切进同一个 token。3. Token 边界可以落在任何位置因为是 最长匹配 频率驱动token 边界与语义边界经常错位英文ChatGPT可能被切成ChatGPT—— 既不是字也不是词数字123456789常按 3 位一段切成多个 token中文词组训练语料中高频的双字 / 多字组合如 中国 人工智能 可能被合并成一个 token—— 这时是多个汉字 1 个 token标点、空格、换行、emoji各自都是独立的 token。token 是统计单元不是语言单元。这就是为什么下面这条恒等式几乎总是错的token 数 ≈ 字数 ❌4. 字 与 字 在模型眼中也不同汉字 指语义上的字符Unicode 码点但底层还有字形渲染、归一化全角 / 半角、简体 / 繁体被视为不同码点等层次。模型看到的连 汉字 都不是是字节序列 → 词表条目的映射结果。繁体 國 和简体 国 在多数词表里就是不同 token虽然人眼看来 是同一个字。四、从 ID 到向量模型真正 吃 的东西拿到 token ID 后Embedding 层做一个简单的查表操作向量 Embedding矩阵[ID] 矩阵规模 词表大小 × 隐藏维度如 151k × 4096这个查出来的高维向量再叠加位置编码才进入 Transformer 的自注意力计算。所以模型不认识 中 这个字它只认识某个 ID如 49374这个索引在 Embedding 矩阵里对应的那行向量两个不同的 token 即使字形相同如全角 中 vs 半角 中ID 不同向量也完全不同模型眼中的它们毫无关系词表是每个模型专属的Qwen、DeepSeek、GPT‑4 的词表互不相同同一个句子在不同模型里切出来的 token 序列、数量都不一样。五、这个区别为什么重要四个实际后果1. 计费与上下文长度都按 token 算。API 价格、上下文窗口128k 等全部以 token 计数。中文通常 1 个汉字约 12 个 token英文 1 个 token 约 0.75 个单词 —— 所以中文使用成本普遍高于英文用户的直觉。2. 模型在 token 边界 上是笨拙的。模型无法可靠地 数汉字、反转字符串、数标点 —— 因为这些操作需要在字节 / 字符层面处理而模型只在 token 层面做注意力计算。strawberry里有几个r曾难倒一大片模型根源就在此。3. Prompt 设计要顺应 token 分布。高频表达模型 更熟练生造词、混合语言、无空格英文黏连、异常大小写都会让 token 化变得不可预测影响输出稳定性。4. 语言之间不平等是词表造成的。英语等高频语言 1 个 token 携带的信息量大某些小语种一个字需要多个 token同样的信息量要花更多算力和钱 —— 这是技术结构带来的隐性偏差而非模型 歧视。六、总结大模型处理文本的第一步是分词用 BPE 等算法把文本切成语料频率驱动下的离散单元token映射为整数 ID再查 Embedding 表变成向量。汉字 是人类语言里的字符概念token 是词表里一个条目的整数索引 —— 一个汉字可能是 1 个 token可能是 3 个字节 token多个汉字也可能合并成 1 个 token。二者唯一的关系是统计上的偶尔重合不是概念上的对应。