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

87 lines
7.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

## 概览
不同大模型的“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 平均值的小脚本,再告诉你如何缓存结果。直接告诉我是否继续。