![[从零训练一个200B大语言模型] 10/25:怎样让已有模型帮我们编写训练教材?](/_next/image?url=%2Fblog%2Ftraining-200b-part-10-cover.webp&w=3840&q=75&dpl=dpl_6sJvvaDqX2UeBuF897WcL7hriP1z)
[从零训练一个200B大语言模型] 10/25:怎样让已有模型帮我们编写训练教材?
前几篇已经把训练材料清洗、整理好,可以交给模型读取了。接下来要考虑的是,这些材料让模型学什么。我们希望它既能给出结果,也能把结果和依据、操作过程联系起来。有些原文只写结论,有些程序省略了解释,值得再补一份把过程展开的教材。已有模型可以帮助编写这些补充材料;它们是否让新模型学得更好,要通过训练后的对照测试来判断。
假设我们找到一段很短的材料:“第一天读了2页,第二天读了3页,第三天读了4页。三天累计读了9页。”这段材料给了结果,我们还可以补出它怎样一步步得到。
我们可以把它展开:“第一天累计2页;第二天把3页加进去,累计5页;第三天再加4页,累计9页。”两段话说的是同一件事,后一段把怎么算出来也留下了。给新模型准备教材时,我们也可以保留原材料,再补上一些把过程讲清楚的材料,看看这样的搭配能否让它学得更好。
已有模型可以帮忙做这项工作。我们把已经训练好、负责写教材的模型叫作教师;把这个系列正在从零训练的200B模型叫作学生。教师根据原材料补出解释,我们核对解释,再把合格的文字放进学生的教材。最后让学生做没见过的题,用相同训练预算下的对照实验,判断这些补充材料有没有价值。
教师写出的材料,叫合成数据。学生通过训练学习教师提供的内容,是蒸馏的一种方式。这件事可以用在自然语言、数学和代码上。这一篇就沿着“把结果背后的过程展开”这条线,看看一份材料怎样走完这段路。
合成数据:由模型等工具生成的训练材料。本文用已有模型帮助编写解释,再检查这些解释。
蒸馏:利用教师提供的输出等学习信号训练学生。本文采用核验后的教师文本。
为什么这份教材里也会有代码?
先继续看刚才读书的例子。每天读了多少页是一串数:2、3、4。逐日累计的结果是另一串数:2、5、9。假如要记录一年,每次都把前面的页数重新加一遍会很麻烦。我们可以写一个小程序,让它记住已经读了多少,每来一个新数字就加进去,再保存当前的累计值。
这段程序做的,正是刚才那段自然语言描述的事情。程序也是文字,只是用更严格的规则表达操作。我们希望通用模型既能解释一段普通文字,也能读懂别人写的程序、帮助写程序。因此,训练材料里除了中英文文章,还安排了代码和相关文档。分词器会把它们都变成模型能读取的token。
原始代码往往很简洁,省略了“为什么这样写”和“每一步发生了什么”。这就给教师留下了一个明确的工作:把适合讲解的代码展开成教材,让学生同时看到程序、执行过程和结果。
这样的教材已经进入实际预训练配方。2026年10月20日发布的Domyn Edge数据说明介绍,他们为大部分Python、Java和C++文档加入了推理过程,再用于预训练。它把“代码旁边补过程”做成了数据生产工作。我们可以借鉴这个做法,按自己的任务检查效果;这部分增强代码仍待完成来源标注后公开。
第七篇已经介绍合成数据与蒸馏,并在4T训练配方里为这类讲解预留10B token,占总量0.25%。它和590B原始代码及文档合在一起,构成600B的代码份额。第八篇讲怎样清洗材料,第九篇讲怎样把材料做成训练输入。现在,我们来把预留的这一部分做具体。
Token:文字被分词器切成的小单位。普通句子和程序都会被切分,再变成模型读取的编号。
教师怎样把一个结果讲成一份教材?
我们先给教师一份已经确定用途的小程序。它接收一串数字,返回截至每个位置的累计和。对于2、3、4,结果就是2、5、9;如果一个数字都没有,结果也是空的。读书页数只是帮助我们理解这个操作的例子,程序也能处理其他需要累计的数字。
下面的自写函数用于演示。看不懂Python也可以继续读:它只做三件事,记住累计值、加上新数字、保存新累计值。
看看这段累计求和程序
def running_totals(numbers):
total = 0
result = []
for number in numbers:
total += number
result.append(total)
return result
数据团队把原始程序交给教师,同时说明希望它补出什么:
请把这段程序写成一份简短教材。先解释它解决什么问题,再用输入2、3、4逐步展示累计值和结果怎样变化,最后解释没有输入数字时会发生什么。保留原程序,让解释中的每一步都能与程序执行对应。
这样,教师拿到的任务就足够具体。它要把短程序里省略的过程写出来,并给出能核对的例子。下面是一份按这个要求编写的教材示意:
累计求和
给出一列数字,返回截至当前位置(包括当前数字)的累计和。例如,每天分别读了2、3、4页,逐日累计就是2、5、9页。
开始时,累计值是0,结果列表为空。
读到2,把2加进累计值,得到2。保存以后,结果是[2]。
读到3,把3加进刚才的2,得到5。保存以后,结果是[2, 5]。
读到4,把4加进刚才的5,得到9。保存以后,结果是[2, 5, 9]。
每一步保存的都是到当前位置为止的累计值。没有输入数字时,循环一次也不执行,返回空列表。
完整教材在“例如,每天分别读了2、3、4页”这一段之后插入上面折叠框里的原始程序,再接着写“开始时,累计值是0”。这样,原始程序、输入、解释和结论就放在同一篇正文里。这个小例子让我们看清教师补了什么。实际生产沿用第七篇选定、可用于目标训练的教师与获取方式,从获准使用的代码和文档中选择材料,再提出对应的讲解要求。
得到教材以后,先检查它。数据团队运行程序,核对输出是不是2、5、9,再逐步检查解释里的累计值。空输入也要实际运行。随着材料扩大,可以增加负数、零、重复数字等输入,检查程序是否仍然满足累计求和的规律:相邻两个累计值之差,应当等于当前位置新加入的数字。
解释也要单独检查。程序运行正确,讲解仍可能把“当前数字”和“累计值”混淆。数字可以用程序核对,文字是否准确、清楚、遗漏条件,则需要抽查和审阅。只有两边都对得上,教材才进入合格库存。
这个“生成以后接着检查”的过程,也适用于普通语言材料。NVIDIA与AI4Bharat在2026年10月19日发布的研究,把筛选后的英文文档翻译成印度语言,评估翻译质量,修复低质量内容,并保留源文档记录。他们发布的合成语料约有2.83T token,覆盖22种印度语言;这是语料库的规模。研究再从中选取材料,与自然文本混合做继续预训练,用对照实验检验价值。代码检查执行过程,翻译检查原意是否保留,各自有不同的检查方法。
接下来才扩大生产。我们需要不同程序、不同难度和不同解释角度;只把2、3、4换成其他数字,会很快得到大量相似教材。第八篇的去重和来源追踪继续使用,同一来源衍生出的材料也要放在一起管理。
学生最后读到的是什么?
学生读到的,仍然是一篇文档。标题是“累计求和”,正文包含任务、程序、逐步解释和结论。数据团队还会附上一张管理标签,记下原材料来自哪里、哪个教师版本写的、经过什么检查。
正文和标签分开保存。在下面的数据记录里,text装完整教材;metadata装管理标签。训练时,读取器只取正文交给分词器。程序和自然语言解释都会被模型读到,来源编号和审核记录则留在数据系统里。
查看一条完整的数据记录
下面用JSON展示字段和内容,正文中的换行写成\n。示例编号说明字段用途,实际生产时填写对应记录。
{
"text": "累计求和\n\n给出一列数字,返回截至当前位置(包括当前数字)的累计和。例如,每天分别读了2、3、4页,逐日累计就是2、5、9页。\n\n程序:\ndef running_totals(numbers):\n total = 0\n result = []\n for number in numbers:\n total += number\n result.append(total)\n return result\n\n开始时,累计值是0,结果列表为空。\n\n读到2,把2加进累计值,得到2。保存以后,结果是[2]。\n\n读到3,把3加进刚才的2,得到5。保存以后,结果是[2, 5]。\n\n读到4,把4加进刚才的5,得到9。保存以后,结果是[2, 5, 9]。\n\n每一步保存的都是到当前位置为止的累计值。没有输入数字时,循环一次也不执行,返回空列表。",
"metadata": {
"record_id": "example-001",
"source_id": "self-authored-running-totals-example",
"teacher_version": "illustrative-output",
"review_record": "illustrative-review-record",
"family_id": "running-totals-example",
"split": "train"
}
}
Metadata:附在正文旁边的管理信息,例如来源、教师版本和审核记录。它帮助数据团队管理教材。
JSON:保存结构化数据的文本格式。上面一条记录分别保存正文和管理信息。
正文合格以后,用学生的分词器计数,再加入库存。教师生成了多少文字,用于算生产花费;学生最终读了多少合格token,用于算训练量。被淘汰的材料仍然花过生产成本,因此这两笔记录都要保留。
这时再回来看10B,就有了实际含义。若合格教材平均每篇2,000个学生token,10B对应500万篇:10,000,000,000除以2,000。这个算式帮助我们估计生产规模,真正能留下多少,要看每批材料的长度、通过率和去重结果。先做小批量,才能知道得到一百万个合格token需要花多少钱。
第九篇的混合配方负责安排学生什么时候读它们。按预留比例,每读取10B训练token,其中2,500万来自教师讲解。累计走完4T计划,教师讲解对应10B,它已经包含在总量里。原始代码与文档仍占590B,二者合计600B;教师生产教材所用的算力另外计算。
读到这篇教材,模型怎样学习?
回到累计求和这篇教材。人可以顺着句子读到“累计值从2变成5”,模型则把同一篇文字切成token,从前面的内容预测后面会出现什么。它读到输入2、3、4,又读到开始时累计值为0,后面的程序和解释就在这些条件下继续展开。
训练时,教材本身提供实际的后续文字。模型给这些文字分配的概率越低,预测损失就越大。训练程序根据损失计算参数怎样调整,更新模型权重。下一篇材料到来时,模型继续使用更新后的权重学习。
题目、代码、过程和结论都属于这份预训练文档,也都提供学习信号。长文怎样切、短文怎样拼、文档边界怎样处理,沿用第九篇的规则。我们此时是在训练通用基础模型,完整文档都参与学习;以后教它按照对话要求回答问题,会另做后训练安排。
教师在这里完成的是供稿工作。学生训练时读取保存好的教材。累计求和只演示一份材料怎样提供信号;大量不同教材让学生接触更多写法和关系。它能否把学到的东西用在新材料上,要在下一步检验。
预测损失:衡量模型给实际后续token分配的概率是否足够高。训练程序据此调整参数。
权重:模型在不同输入之间反复使用的参数。训练修改并保存这些参数。
教师还能提供文字以外的学习信号吗?
可以。教师在预测下一个token时,会给多个候选分配概率。保存这些信息,学生就能学习教师怎样分配可能性,而不只是学习最终出现的那一个词。
2026年10月21日的Nemotron 3.5技术报告采用了这种方法:Super和Lightning分别从已有基础模型出发,利用更大的教师提供的预测信息,各进行1T token蒸馏。这是一条需要教师概率信息的训练路线。我们当前的10B计划采用保存为文档的教师文字,沿着前面讲的教材流程推进。
怎样知道这些解释值得继续生产?
我们期待更完整的解释能帮助学生建立联系。这个期待可以直接做实验:从同一个训练检查点出发,两组模型继续读取相同数量的token,保持其他训练设置一致。一组按配方读教师讲解,另一组用等量原始代码和文档替换这部分。两组总代码份额相同,中英文和数学材料的份额也相同。
然后让学生处理没有学过的新材料。它能否解释新的程序,跟踪新的执行过程,或者完成新的代码任务?中文、英文和数学能力有没有变化?我们训练的是通用模型,因此局部改动也要看整体表现。
这些考题在生产教材以前就留好,并与训练材料按来源和任务家族分开。平时用开发验证集发现问题、调整材料,最终测试集留到方案确定以后再用。小模型帮助筛掉明显无效的生产方法,再用目标模型的检查点检验实际收益,同时记录教师生产、核验和学生训练的花费。
ICLR 2026论文《Front-Loading Reasoning》的初稿发表于2025年,用8B模型比较了不同阶段加入推理数据的效果,为在预训练阶段研究这类教材提供了依据。我们的10B是本项目预留的试验份额。是否保留、调整或扩大,要由自己的实验结果决定。
这篇文章从一段有答案、缺少展开过程的文字开始。教师帮助把过程写出来,数据团队确认它讲得对,学生把它当作教材学习。我们最终要决定的是:把一部分训练时间留给这些解释,能否让同样的200B模型学得更好。把生产、核验、训练和新题测试接起来,这个问题就有了可以一步步验证的答案。
新文章,直接发到你的邮箱。
AI、工程与实验,每月 1–2 封。
无垃圾邮件,随时取消。