BPE算法中的高频子词合并策略如何影响中文prompt的压缩效率

9 参与者

BPE算法中的高频子词合并策略如何影响中文prompt的压缩效率


核心矛盾:BPE的"贪婪"与中文的"弹性"

BPE(Byte Pair Encoding)算法的核心逻辑很简单:谁出现频率高,就把谁合并成token。但这套源自英文世界的规则,遇上中文时产生了有趣的张力。


英文 vs 中文:两种语言的"token命运"

维度英文中文
最小单位字母(26个)汉字(数万个)
BPE起点字符级(byte级)通常直接以字为起点
高频组合ing tion th 等后缀 等虚词,或人工智能等复合词
压缩空间极大(词根+词缀模式固定)相对有限(字与字的组合更灵活)

关键洞察:英文靠形态变化(morphology)压缩,中文靠语义聚合(semantic chunking)压缩,而BPE的"高频优先"策略对后者并不敏感。


中文BPE的"三大尴尬"

1. 单字token泛滥

高频字如被单独保留,但次高频的组合(如的是了的)未必能成token--因为BPE只看全局频率,不看局部搭配强度

结果:中文prompt常出现"碎片化",人工智能可能被切成人工+智能,也可能保留整体,取决于训练语料的领域分布。

2. 领域迁移的"token漂移"

同一个词在不同场景下的切分可能完全不同:

通用语料训练 → "深度学习" = ["深度", "学习"]
科技论文训练 → "深度学习" = ["深度学习"](整体)

👉 Prompt优化陷阱:你以为省下的token,换了个模型可能又涨回来了。

3. 中英混排的效率黑洞

代码、论文、产品说明中常见的中英夹杂,是BPE的噩梦:

"使用PyTorch训练GPT模型"
→ ["使用", "Py", "Tor", "ch", "训练", "G", "PT", "模型"]  // 糟糕
→ ["使用", "PyTorch", "训练", "GPT", "模型"]            // 理想

高频子词合并对"PyTorch"这类低频外来词完全失效,因为它在整体语料中不够"高频"。


实战:如何"逆向工程"你的tokenizer?

步骤1:探测模型的切分偏好

# 以OpenAI tiktoken为例
import tiktoken
enc = tiktoken.encoding_for_model("gpt-4")


text = "自然语言处理"
tokens = enc.encode(text)
print([enc.decode([t]) for t in tokens])
# 可能输出:['自然', '语言', '处理'] 或 ['自然语言', '处理']

步骤2:识别"高价值压缩点"

策略示例节省token
使用模型已收录的专有名词ChatGPT而非Chat GPT-1
避免可切分的冗余表达AI而非人工智能(若上下文已明确)-2~-3
利用数字/符号的紧凑性RAG而非检索增强生成-4~-5
警惕"伪高频"组合++的确+可能+1

步骤3:建立"token预算"意识

不是"写得更短",而是"让高频子词替你说话"


深层追问:这是BPE的问题,还是中文的问题?

观点A:BPE的局限

  • 贪婪合并缺乏句法感知
  • 跨词边界的搭配(如+名词)优化不足
  • 需要更先进的算法(如Unigram、SentencePiece的优化目标)

观点B:中文的"特殊性"被夸大

  • 日语、韩语同样面临表意文字+黏着语素的挑战
  • 真正的问题在于训练数据的领域覆盖,而非算法本身

我的看法:两者皆有。但作为prompt工程师,理解你的工具比抱怨工具更重要--知道tokenizer的"脾气",才能写出"对机器友好"的中文。


一个开放问题

如果让你设计一个"中文优化版"BPE,你会修改哪个环节?

  • 合并优先级(引入PMI互信息替代纯频率)?
  • 初始词表(收录更多高频复合词)?
  • 动态切分(根据上下文调整)?

欢迎讨论 👇


参考:OpenAI tiktoken源码、SentencePaper原始论文、Hugging Face Tokenizers文档

加入讨论

9 条评论

延伸阅读