大模型 Token 机制与上下文窗口管理实战
Token 是大语言模型(LLM)在理解和生成文本时的最小处理单元。它不是简单的'字'或'词',而是介于两者之间的子词(subword)或字节序列。每个 Token 会被映射为一个唯一的数值 ID,形成数字序列供神经网络运算。
分词器原理
将原始文本转化为 Token 序列的工具称为分词器(Tokenizer)。常见的算法包括字节对编码(BPE)、WordPiece 等。以 BPE 为例,它通过反复合并最频繁出现的字符对来构建词汇表,既高效又灵活,被广泛应用于 GPT 系列模型中。
不同模型的分词器存在差异,OpenAI 使用 tiktoken,而 LLaMA 使用 SentencePiece。这意味着同一段文本在不同模型下的 Token 数量可能不同。主流模型的词汇表大小通常在 50K~100K 个 Token 左右,这是在压缩效率与覆盖范围之间的平衡点。
import tiktoken
# 加载 GPT-4o 使用的分词器
enc = tiktoken.encoding_for_model("gpt-4o")
# 对文本进行编码
text = "Hello, tokenization is great!"
tokens = enc.encode(text)
print(tokens) # 输出 Token ID 列表
# 解码回文本
print(enc.decode(tokens))
多语言 Token 差异
分词效率在不同语言间差异显著。英文采用拉丁字母,训练数据最多,压缩率最高。中文等非拉丁字母语言由于 UTF-8 编码占用更多字节,Token 数甚至可能超过字符数。
| 语言类别 | 代表语言 | 相对英文效率 | 说明 |
|---|---|---|---|
| 拉丁字母 | 英文 | 1x(基准) | 训练数据最多,压缩率最高 |
| 其他拉丁字母 | 西班牙语 | ~1/2x | 词形变化更丰富 |
| 非拉丁字母 | 俄语 | ~1/3x | 字符编码占用更多字节 |
| CJK 语言 | 中文、日文 | ~1/2x | 字符字节数多,单字信息密度高 |
这一差异直接影响 API 调用成本和上下文窗口的有效利用率。
Token 计数的作用
准确的 Token 计数在实际开发中至关重要:
- 优化提示词:确保输入内容不超过模型限制,避免截断。
- 成本估算:按 Token 计费的平台需预先估算开销。
- 请求路由:将短提示分配给轻量模型,优化延迟和成本。
- 多模态处理:图片、PDF 等内容无法简单通过字符数估算。
虽然客户端可用 tiktoken 估算,但服务端会注入隐藏 Token(如系统提示、工具定义)。因此,各厂商通常提供 Token Count API 进行精确计数。
import anthropic
client = anthropic.Anthropic()
response = client.messages.count_tokens(
model="claude-sonnet-4-20250514",
system=,
messages=[{:,:}]
)
(response.input_tokens)


