本节摘要:把英文产线迁到中文,麻烦不在训练(第 3 章脚本一字不改),而在数据与分词器两处。数据侧:开源中文指令集要用 2.2 的四把尺子再加四项中文特查(简繁统一、全半角与标点、翻译腔、机翻来源甄别),配比兑现 2.3 的预告——中文主力约 70% + 英文开源集约 30% 防灾难性遗忘。分词器侧:nanochat 约 2000 词表的 BPE 以英文为主,中文落到字节级兜底——一个汉字常被切成多个 token,同样内容序列更长、训练与推理更贵,本节的测量代码把这笔账量化出来;对策三种,本书主线选"沿用原分词器"。模板侧一条铁律:模板与语言无关,special tokens 一个不动——"给中文模型换中文标记"是 4.3 错位一的改造版,换了就必须重训。
阅读完本节,你应当能够:
先复用 2.2 的四把尺子(质量、规模、许可证、语言——语言这把在中文场景反向使用:查的是英文占比),再加四项中文特查:
| 特查 | 查什么 | 为什么 |
|---|---|---|
| 简繁统一 | 是否混入繁体(常见于爬取与机翻来源) | 训练分布分裂,输出繁简随机切换 |
| 全半角与标点 | 全角/半角字母数字混用、中英标点混排 | 模板与下游服务对标点敏感,模型学去也照混 |
| 翻译腔 | "作为一个语言模型"式直译腔、英文语序长句 | 小模型背什么说什么(2.2 免责腔同理) |
| 来源甄别 | 是否由英文集机器翻译而来 | 机翻数据便宜但上限低,蒸馏(2.3)常更优 |
候选举例(社区常见开源项目,规模与许可证均以数据集卡为准):BELLE 系列(百万条级中文指令)、Firefly(中文多任务语料)、COIG(开源社区的中文明细)等。评估动作与 2.2 完全同构:随机抽 20 条人眼、末轮回答精确去重、规则过滤——2.2 的 clean_sft_data.py 原样复用,只把规则里的英文免责腔正则补上中文变体。
配比落地(2.3 预告的兑现):
| 成分 | 占比(示意起点) | 作用 |
|---|---|---|
| 中文主力(开源集 + 2.3 回环的中文蒸馏) | 约 70% | 教中文表达与人设 |
| 英文开源集(如 SmolTalk 子集) | 约 30% | 英文能力不塌——防灾难性遗忘(3.3) |
nanochat 的 BPE 词表约 2000(1.2 清点的产物),预训练语料 FineWeb-Edu 以英文为主——词表里的合并规则几乎全为英文服务。中文文本进来时落到字节级兜底:按 UTF-8 字节切开再尽量合并。后果是能用,但贵:
# measure_zh_tokens.py —— 量化中文的分词效率(写法示意) from transformers import AutoTokenizer tok = AutoTokenizer.from_pretrained("base/tokenizer") CASES = [ "The Yangtze River is the longest river in China.", "长江是中国最长的河流。", "帮我写一首关于秋天的四行小诗。", ] for text in CASES: ids = tok.encode(text) print(f"{len(ids):3d} tokens | {len(text):2d} chars | {text}") # 中英两行的 tokens/字符比对比一看便知——多出的 token 全是训练与推理的额外成本
跑完这五行,账就清楚了:同样的意思,中文版本占用的 token 数倍于英文。三个连锁影响:长度预算重算(2.1 的 p95 按中文文本重测,max_seq_len 可能得放大);同 batch 实际信息密度下降;推理变慢变贵。三种对策:
| 对策 | 做法 | 代价 | 本书立场 |
|---|---|---|---|
| 沿用原分词器 | 什么都不改,中文走字节级兜底 | 序列长、成本高 | 主线:零风险,教学实验首选 |
| 扩词表 | 追加高频中文 token 并 resize_token_embeddings(4.1) |
新 embedding 需训练对齐;4.3 错位三高危 | 进阶路,篇幅所限只指方向 |
| 换中文分词器 | 从分词器阶段重来(回到第 1 章之前) | 等于重跑前半程 | 归《ht-gpt:从零搭建 GPT 训练与推理实战》的分词器章节 |
模板的铁律先立住:chat template 是结构协议,不是语言。<|beginmessage|> 一族标记、"边界 + 作者 + 终止"三件套与中文无关——中文模型用的仍是同一套标记、同一份模板、同一个终止符 id。
⚠️ 高危动作预警(4.3 错位一的改造版):"既然是中文模型,把标记换成中文(如"消息开始")"——换了模板就是换了数据,SFT 必须整个重跑;若只换标记不重训,模型当场失语。中文化发生在内容层,不发生在协议层。
内容层的中文化三处:system 提示用中文写(2.1 形态三);蒸馏的裁判提示与种子全中文(2.3 回环);2.1 契约与清洗规则原样有效(role 字段、末条 assistant、空 content 检查都与语言无关)。
训练入口 = 3.3 的 train_sft_hf.py 原样,只把 TRAIN_JSONL 指向中文配比后的数据。超参不因语言而变(3.2 量级表照用),但有两个复查点:p95 长度按中文重测后决定是否放大 max_seq_len(第二节的影响落地处);探针频率保持每几百步一次(5.1),题组换成中文为主。
观察清单(5.1/5.2 的中文版量尺):
| 观察项 | 通过标准 | 不过的处方 |
|---|---|---|
| 中文停止行为 | 中文回答干净终止 | 回 3.1 掩码(终止符是否入学习段) |
| 繁简一致性 | 输出简体稳定 | 查数据简繁特查;2.3 裁判闸加"必须简体" |
| 翻译腔 | 中文自然、无直译句式 | 查机翻来源;提高蒸馏占比 |
| 英文能力 | 英文题不显著掉分 | 英文占比上调(3.3 灾难性遗忘表) |
验收用 5.2 题库的中英对照层直接读数:改造前后对比、与英文版模型互比——分数台账又立一功。
换语言之外,另一个诱人的旋钮是模型规模——8.2 节用 TinyStories 照一照小模型的能力边界。