knowledge-vault/discussions/project-thinking/AI/强哥的徒弟/Token速查表.md

7.0 KiB
Raw Permalink Blame History

概览

不同大模型的“1 个中文字符 ≈ 几个 token”并非固定常数但主流中绝大多数采用基于 Unicode 字符的SentencePiece/BPE分词常见纯中文正文里“1 字 ≈ 1 token”混排数字/英文/空格/标点)会拉低或升高平均值。下面给出主流闭源 / 开源模型的 tokenizer 类型、特点与中文平均映射粗略经验值(工程估算用),以及如何精确计算。

主流模型 Token 计量速查表(经验均值,纯中文语料下)

模型/系列 Tokenizer/算法 中文单字是否多为单独 token 纯中文平均:字:token 100 字约占 tokens 混合中英场景变化 主要实现/库 备注
OpenAI GPT-4 / 4o / 3.5 (cl100k_base系) tiktoken改进 BPE ≈ 1.00 : 1 ≈ 100 英文单词被拆成多 token导致“每个中文字成本”相对稳定 tiktoken 部分常见词组(如“人工智能”)仍分成 4 token
Anthropic Claude (2/3/Opus/Sonnet) SentencePiece Unigram 变体 ≈ 1.00 : 1 ≈ 100 中英混合时英文段膨胀 官方 SDK 内置 少数高频短语合并略降
Google Gemini SentencePiece (Unigram + 定制) 0.951.02 : 1 95102 英文/符号增大差异 PaLM/Gemini SDK 具体权重未公开
Microsoft Azure OpenAI同 OpenAI 同 tiktoken ≈ 1.00 : 1 ≈ 100 同 OpenAI tiktoken 计费按模型
百度 文心 (ERNIE) 基于 WordPiece/BPE 混合 高频字单 token 1.001.05 : 1 100105 新词可能被拆多 token 平台 API 词表偏向中文高频词
阿里 Qwen (通义千问) SentencePiece BPE ≈ 1.00 : 1 ≈ 100 英文长词被拆 tokenizer 模块 (qwen-tokenizer) 保留常见中文字单元
DeepSeek 系列 BPE近似 tiktoken 0.981.02 : 1 98102 英文段落增量 官方 tokenizer 词表对编程符号友好
Meta Llama 2/3 中文适配 SentencePiece BPE 1.001.10 : 1取决于是否中文增强词表 100110 若原生英文词表,中文稀有字会拆 bytes→增加 sentencepiece 未做中文特别优化版本略高
Mistral / Mixtral 中文增强版 SentencePiece BPE 多数字单 token 1.001.08 : 1 100108 未收录字 → 多 token sentencepiece 视发行版词表
Yi (零一万物) SentencePiece BPE 0.981.03 : 1 98103 英文增加 官方 yi-tokenizer 中文覆盖较全
GLM (ChatGLM 系列) SentencePiece + 字节回退 1.001.05 : 1 100105 英文/符号略上浮 tokenizer (THUDM) 旧版含词粒度碎片
MiniCPM / CPM-Bee SentencePiece BPE 1.001.05 : 1 100105 英文段落膨胀 sentencepiece 中文高频覆盖
InternLM SentencePiece BPE 0.991.03 : 1 99103 英文增量 官方 tokenizer 支持代码符号
Phi-3 (多语言版) tiktoken/BPE 变体 多数字单 token 1.051.15 : 1中文效率略低 105115 英文更碎 transformers (phi3) 词表以英文/代码偏重
Code/编程优化模型(如 CodeLlama 在中文) SentencePiece BPE 中文字经常仍单 token 1.051.20 : 1 105120 中英文符号混排差异大 sentencepiece 词表偏代码符号导致中文相对“贵”

说明:

  1. “字:token”写成 ≈1.05:1 表示 1 个中文汉字平均会产生 1.05 个 token>1 说明有少量字被拆或带上下文合并失衡)。
  2. 纯中文说明书/新闻/科普正文中,多数主流中文优化模型接近 1:1。
  3. 含数字、半角标点、Emoji、罕见汉字扩展区、繁体冷僻字、混入英文变量名或 URL会提高总体 token/字 比。
  4. 估值用于粗算费用:真实计费请实际编码测量。

为什么通常接近 1:1

  • 现代多语言 BPE / SentencePiece 会把常见 CJK Unified Ideographs 直接作为独立 token避免再拆 UTF-8 字节)。
  • 中文缺少空格,不能像英文那样以空格分词;逐字保留能兼顾 OOV未登录词泛化。
  • 高频多字词(如“机器学习”)若未被合并,与 4 个独立 token 成本相同;若被合并(部分词表会做),则字:token 比可下降到 <1。

可能导致 >1 的因素

  • 词表缺失(英文侧模型直接迁移到中文)。
  • 少量冷僻字落回 “byte fallback” (tiktoken / sentencepiece 的 byte-level 补救)1 字→2~3 token。
  • 混合含全角空格、罕见标点、EmojiEmoji 常 13 token

估算公式与实践

场景:给定中文字符数 C混合英文 token 膨胀系数 k_en (英文平均 1 英文字母 ≈ 0.30.5 token, 1 英单词 ≈ 12 token),以及中文比例 p_cn。粗估总 tokens
T ≈ C * r_cn + W * r_en + E
其中:

  • r_cn = 上表对应模型中文字->token 均值(默认 1.0)。
  • W = 英文单词数r_en 常 1.21.5(取决于 tokenizer 粒度)。
  • E = 额外符号/格式/换行/Emoji token 数。

若只要纯中文快速估算:
T ≈ 字数 (±2~5%)

如何精确测量(推荐做法)

  1. 选择对应官方 tokenizer 库:
    • OpenAI/Azurepip install tiktoken
    • Llama/Mistral/Qwen/InternLM 等:使用 transformers AutoTokenizer.from_pretrained(…)
    • Claude/Gemini通过其官方 SDK 的 count_tokens / count method闭源
  2. 调用 encode 或 encode_plus得到 token 列表长度。
  3. 对代表性语料采样(新闻、技术文、对话、混排),统计平均值与标准差。

示例(以 Qwen 或 Llama3 为例)

伪代码Python
from transformers import AutoTokenizer tok = AutoTokenizer.from_pretrained("Qwen/Qwen2-7B") text = "人工智能正在改变世界。" print(len(tok.encode(text))) # 期望 ≈ len(text_without_punct)

OpenAI
import tiktoken enc = tiktoken.get_encoding("cl100k_base") text = "人工智能正在改变世界。" print(len(enc.encode(text)))

快速经验记忆

  • 纯中文1 字 ≈ 1 token默认抓这个
  • 加入英文技术内容20% 英文):整体 token ≈ 中文字数 + 英文单词数 *1.3。
  • 有大量代码/URL再额外加 515%。
  • 费用预估宁可上浮 510% 做预算缓冲。

常见误区

  • “1 token = 4 字节” 只是某些英文平均经验,与中文不适用。
  • “所有模型都 1 字=2 token” 是旧版 GPT-2 英文词表对中文的误解;现代多语言词表已优化。
  • 不能用字节长度 /3 或 /2 去推 token必须用实际 tokenizer。

建议

  • 关键计费或限额控制逻辑中写一个 measure_tokens(text, model) 函数,真实调用。
  • 做批量文本处理前先抽样 1% 真实 encode得到平均与 p95用来设限。

如果需要我可以帮你写一个统一测多模型开源token 平均值的小脚本,再告诉你如何缓存结果。直接告诉我是否继续。