## 概览 不同大模型的“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.95–1.02 : 1 | 95–102 | 英文/符号增大差异 | PaLM/Gemini SDK | 具体权重未公开 | | Microsoft Azure OpenAI(同 OpenAI) | 同 tiktoken | 是 | ≈ 1.00 : 1 | ≈ 100 | 同 OpenAI | tiktoken | 计费按模型 | | 百度 文心 (ERNIE) | 基于 WordPiece/BPE 混合 | 高频字单 token | 1.00–1.05 : 1 | 100–105 | 新词可能被拆多 token | 平台 API | 词表偏向中文高频词 | | 阿里 Qwen (通义千问) | SentencePiece BPE | 是 | ≈ 1.00 : 1 | ≈ 100 | 英文长词被拆 | tokenizer 模块 (qwen-tokenizer) | 保留常见中文字单元 | | DeepSeek 系列 | BPE(近似 tiktoken) | 是 | 0.98–1.02 : 1 | 98–102 | 英文段落增量 | 官方 tokenizer | 词表对编程符号友好 | | Meta Llama 2/3 中文适配 | SentencePiece BPE | 是 | 1.00–1.10 : 1(取决于是否中文增强词表) | 100–110 | 若原生英文词表,中文稀有字会拆 bytes→增加 | sentencepiece | 未做中文特别优化版本略高 | | Mistral / Mixtral 中文增强版 | SentencePiece BPE | 多数字单 token | 1.00–1.08 : 1 | 100–108 | 未收录字 → 多 token | sentencepiece | 视发行版词表 | | Yi (零一万物) | SentencePiece BPE | 是 | 0.98–1.03 : 1 | 98–103 | 英文增加 | 官方 yi-tokenizer | 中文覆盖较全 | | GLM (ChatGLM 系列) | SentencePiece + 字节回退 | 是 | 1.00–1.05 : 1 | 100–105 | 英文/符号略上浮 | tokenizer (THUDM) | 旧版含词粒度碎片 | | MiniCPM / CPM-Bee | SentencePiece BPE | 是 | 1.00–1.05 : 1 | 100–105 | 英文段落膨胀 | sentencepiece | 中文高频覆盖 | | InternLM | SentencePiece BPE | 是 | 0.99–1.03 : 1 | 99–103 | 英文增量 | 官方 tokenizer | 支持代码符号 | | Phi-3 (多语言版) | tiktoken/BPE 变体 | 多数字单 token | 1.05–1.15 : 1(中文效率略低) | 105–115 | 英文更碎 | transformers (phi3) | 词表以英文/代码偏重 | | Code/编程优化模型(如 CodeLlama 在中文) | SentencePiece BPE | 中文字经常仍单 token | 1.05–1.20 : 1 | 105–120 | 中英文符号混排差异大 | 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。 - 混合含全角空格、罕见标点、Emoji(Emoji 常 1–3 token)。 ## 估算公式与实践 场景:给定中文字符数 C,混合英文 token 膨胀系数 k_en (英文平均 1 英文字母 ≈ 0.3–0.5 token, 1 英单词 ≈ 1–2 token),以及中文比例 p_cn。粗估总 tokens: T ≈ C * r_cn + W * r_en + E 其中: - r_cn = 上表对应模型中文字->token 均值(默认 1.0)。 - W = 英文单词数;r_en 常 1.2–1.5(取决于 tokenizer 粒度)。 - E = 额外符号/格式/换行/Emoji token 数。 若只要纯中文快速估算: T ≈ 字数 (±2~5%) ## 如何精确测量(推荐做法) 1. 选择对应官方 tokenizer 库: - OpenAI/Azure:pip 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:再额外加 5–15%。 - 费用预估宁可上浮 5–10% 做预算缓冲。 ## 常见误区 - “1 token = 4 字节” 只是某些英文平均经验,与中文不适用。 - “所有模型都 1 字=2 token” 是旧版 GPT-2 英文词表对中文的误解;现代多语言词表已优化。 - 不能用字节长度 /3 或 /2 去推 token;必须用实际 tokenizer。 ## 建议 - 关键计费或限额控制逻辑中写一个 measure_tokens(text, model) 函数,真实调用。 - 做批量文本处理前先抽样 1% 真实 encode,得到平均与 p95,用来设限。 如果需要:我可以帮你写一个统一测多模型(开源)token 平均值的小脚本,再告诉你如何缓存结果。直接告诉我是否继续。