8.1 中文语料 SFT 实战


8.1 中文语料 SFT 实战

本节摘要:把英文产线迁到中文,麻烦不在训练(第 3 章脚本一字不改),而在数据与分词器两处。数据侧:开源中文指令集要用 2.2 的四把尺子再加四项中文特查(简繁统一、全半角与标点、翻译腔、机翻来源甄别),配比兑现 2.3 的预告——中文主力约 70% + 英文开源集约 30% 防灾难性遗忘。分词器侧:nanochat 约 2000 词表的 BPE 以英文为主,中文落到字节级兜底——一个汉字常被切成多个 token,同样内容序列更长、训练与推理更贵,本节的测量代码把这笔账量化出来;对策三种,本书主线选"沿用原分词器"。模板侧一条铁律:模板与语言无关,special tokens 一个不动——"给中文模型换中文标记"是 4.3 错位一的改造版,换了就必须重训。

学习目标

阅读完本节,你应当能够:

  1. 用四把尺子加中文特查评估一份中文指令集。
  2. 量化测量分词器对中文的效率代价,并说出三种对策的取舍。
  3. 按 70/30 配比组装中文训练集并保持模板一致。
  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 题库的中英对照层直接读数:改造前后对比、与英文版模型互比——分数台账又立一功。

本节要点回顾

  1. 中文数据 = 四把尺子 + 四项特查(简繁/标点/翻译腔/来源甄别);70/30 配比兑现 2.3 预告。
  2. 分词器:字节级兜底能用但贵(测量代码一跑便知);主线沿用原分词器,扩词表是进阶路、换分词器回前半程。
  3. 模板与语言无关:协议层一个不动,中文化只在内容层;训练复用第 3 章脚本,量尺复用第 5 章。

换语言之外,另一个诱人的旋钮是模型规模——8.2 节用 TinyStories 照一照小模型的能力边界。


作者与出处
原作者: 灏天文库
整理: 灏天文库整理
本站整理收录,版权归原作者/开源协议所有;欢迎通过原文链接访问源仓库。
发布者: 作者: 灏天文库 转发
评论区 (0)
U