Token 是大语言模型(LLM)处理文本时的最小单位。
模型不会直接识别汉字、英文字母,它处理文本有自己的最小颗粒度,这个颗粒就叫 Token。所有的语义理解、内容生成都建立在 Token 的基础上,不会拆得比 Token 更小。
你可以把它理解为模型 "阅读" 文本时的 "碎片"—— 但这些碎片不一定对应我们日常理解的字或词。
当你输入一句话时,模型会通过一个叫做 Tokenizer(分词器) 的组件,将文本切分成一个个 token。
Tokenizer(分词器) :是大模型自带的一个前置工具,相当于 “文本切割器”。它有一套固定的分词规则(由训练阶段的词表决定),输入原始文本,输出切好的 Token 序列,是模型处理文本的第一步。
没有分词器,模型就看不懂原始的文字字符串,必须先转成它认识的 Token 格式。
比如「我喜欢猫」可能被切成 ["我", "喜欢", "猫"] 三个 token;而英文单词如 "unbelievable" 可能被拆成 ["un", "believ", "able"] 三个 token。
这是中英文分词的典型例子,背后是行业通用的 “子词分词” 思路:
unbelievable 拆成前缀un-、词根believ、后缀-able,是因为英语单词总量太多,如果每个整词都做一个 Token,词表会爆炸。拆成语义子单元后,既可以覆盖几乎所有英文单词,又能控制词表大小,还能让模型理解词根词缀的规律。模型会将每个 token 转换成一个高维向量(embedding),所有的计算(注意力机制、前馈网络等)都是在这些向量上进行的。
这句话讲的是 Token 的 “数字化” 过程:
这也是大模型 API 按 token 数量收费的原因——输入和输出的 token 总数直接决定了计算量。
解释了大模型按 Token 计费的底层逻辑:
上下文长度限制即模型一次能处理的 token 数量上限,如 4K、128K、200K,存在的原因主要有以下几点:
先解释基础概念:
Transformer 的核心是自注意力(Self-Attention),其计算复杂度与序列长度呈二次方关系(O(n²))。如果上下文从 4K 扩展到 128K,计算量不是增加 32 倍,而是增加约 1000 倍。这直接导致推理速度急剧下降、显存爆炸。
这里先补充两个核心术语:
注意力机制需要存储一个 "注意力矩阵"(Attention Matrix),记录序列中每个 token 与其他所有 token 的关系。序列越长,这个矩阵占用的显存越大。
注意力矩阵:是一个 n 行 ×n 列 的表格(n 是 Token 数量),每个格子里存的是 “第 i 个 Token 和第 j 个 Token 的关联程度(注意力权重)”。
自注意力计算时,必须先把这个矩阵存在显存里,才能进行后续运算,它是长文本最占显存的部分之一。
128K 长度的注意力矩阵需要占用数十 GB 的显存,这对硬件是巨大挑战。
可以做个简单估算:
即使技术上能处理长文本,模型在长序列中的注意力分数会变得非常稀疏和稀释,导致模型 "看不清楚" 远距离的信息关联。
注意力分数:一个 Token 对其他所有 Token 的 “关注度” 总和是固定的(总和为 1)。序列越长,每个 Token 能分到的关注度就越少,就像一杯水倒进越来越大的池子里,浓度会越来越低。
最终结果:相隔很远的两个 Token,关联权重会变得极低,模型相当于 “没注意到” 两者的关系,长文本的逻辑推理效果就会下降。
训练超长上下文模型需要更长的训练时间、更大的显存,且长序列的梯度传播更不稳定。
训练模型比推理更费资源:训练时不仅要做前向计算,还要存反向传播的梯度数据来更新模型参数,显存压力是推理的数倍。
梯度传播不稳定:训练时,误差信号要从输出层一层一层传回输入层来调整参数。序列越长,梯度传递的路径就越长,很容易出现 “梯度消失”(梯度传着传着变成 0,参数不更新了)或 “梯度爆炸”(梯度太大,参数乱掉),模型很难学好长序列的规律。
目前业界主要通过位置编码优化(如 RoPE、ALiBi)和稀疏注意力(如 Sliding Window Attention)等技术来缓解这些限制。
这句话讲了两类主流的长文本优化方案:
位置编码优化
稀疏注意力
无限进步,共勉~