看到各个技术社区里“from scratch”系列的项目一个接一个火起来,从大语言模型到推理模型,从训练脚本到推理引擎,大家都在往“从零构建”这个方向上挤。我最初以为这就是一群极客在自娱自乐,直到自己花四个月把一个AI engineering的完整链路——从数据处理、分词器训练、预训练、指令微调到强化学习微调——全部跑通之后,才真正明白这件事对普通工程师的价值在哪里。
这篇文章不会教你复制GPT-4,也不会带你从头推导所有数学公式,而是把一个AI工程师从零开始训练自己的语言模型、甚至尝试让模型具备基础推理能力的过程,按真实工作流拆开讲。内容包括:怎么定义“从零”的边界、一条最小可行技术路线、让模型从“能说话”走向“会推理”的强化学习实验、只有一张消费级显卡时怎么分配算力,以及我踩过的那些让项目差点中断的坑。
适合谁看呢?第一类,已经会用Transformers库做推理,但对训练全链路感到陌生的人;第二类,打算做一个“从零复现LLM”项目,却不知道从哪下手的人;第三类,想搞清楚“RL微调”到底是不是玄学、以及它和普通SFT有什么区别的人。看完之后,你应该能对“从零训练一个模型”这件事建立起完整的操作直觉。
1. 从零复现LLM这件事,到底图什么
1.1 黑盒之外的调试能力
如果你只是调用现成大模型的API,或者用开源权重做推理,那你面对的其实是一个黑盒。输入一段文本,得到一个回答,至于这个回答为什么出现、哪个环节出了偏差、换一组数据会不会更好,你没有任何控制权和观察窗口。
我刚开始做AI应用时也是一样的思路:反正有现成模型,效果不行就换提示词,提示词不行就换模型,再不行就上RAG。这套流程应付Demo足够了,直到有一天我需要一个垂直领域的小模型来降低推理成本,才发现自己完全不知道该从哪里下手——数据要什么样的、训练多少步、模型多大合适、为什么微调之后反而变笨了。这些问题,不会调用API的人是答不上来的。
从零构建一个模型,最大的收获在于:你被迫理解从数据到权重的每一个决策点。比如同样一句话在分词器里被切成几个token、不同切法对训练效率的影响、学习率过大时loss曲线会如何震荡、数据重复率高了模型会如何退化。这些知识在论文里读一百遍都不如自己亲眼看到一次损失曲线来得深刻。有了这种调试能力之后,你再回去用大模型API,会忽然发现很多之前觉得“玄学”的问题,其实都有清晰的解释。
1.2 “从零”的边界由你定义
很多人一听“from scratch”就吓退了,以为要从写矩阵乘法开始。其实没这个必要。这里要明确一下“从零”的合理边界,否则你会在无意义的事情上消耗大量精力。
我给自己的定义是:不使用任何开源预训练权重,从完全随机的参数出发,亲手完成数据清洗、分词器训练、模型架构搭建、预训练、指令微调,以及可选的强化学习微调。在这个过程中,允许使用PyTorch、HuggingFace的tokenizers库这类通用工具——它们只是“语言和工具”,不是“模型”。这就像是自己搭一栋房子,你可以用标准砖块和水泥,但不会直接买一栋精装房来改装。
这个定义有两个实际好处。第一,它保证了你能真正理解每个环节的原理:随机初始化的权重经过训练变成有语义理解能力的模型,这个过程里每一步都看得见摸得着。第二,它控制了项目的复杂度和时间成本,让你在几周内而不是几年内看到结果。也有人选择连反向传播都自己手写,我认为除了教学目的,这在工程上没有太大必要——就像你不会每次做饭都自己种小麦一样。
还有一个现实收益容易被忽略:成本控制能力。很多业务场景根本不需要几十亿甚至上千亿参数的大模型,一个几千万参数的小模型做好数据清洗和微调,效果往往出乎意料地好。但如果你只会调用外部API,就永远没有机会把这样一个“小而美”的模型优化到可用状态。从零构建的真正价值,是让你获得对整套技术栈的自由度——想用多大模型、怎么训练、怎么评估,都由你来决定,而不是被供应商牵着走。
2. 一条可以跑通全流程的最小路线:数据、分词、架构、训练
2.1 数据准备,先别急着上“全网语料”
绝大多数从零项目死在数据准备阶段,死法高度一致:想搞一个“够大、够全、够干净”的语料库,于是开始爬网页、筛去重、做格式清洗,一搞就是两个月,模型一行代码没跑。
我的建议很直接:第一阶段的目标不是“大”,而是“干净且能跑通流程”。我用的是TinyStories数据集——一个专门为小模型设计的英文故事集,每条文本都简短、多样、拼写规范。配合一个开源中文语料,两条数据合起来也就几百万条,几分钟就能完成预处理。后来我又加了一批自己用规则生成的合成数据(比如数学运算题),用来做后续的推理能力实验。
这里有一个重要认知:数据质量对最终效果的影响,远远大于模型尺寸和训练步数。一条拼写混乱、内容重复的文本,会在训练中反复干扰模型的学习;而一批结构清晰、领域聚焦的语料,即使量不大,也能让小模型在特定任务上表现惊艳。所以第一阶段宁可手动挑数据,也别盲目追求规模。
数据清洗的具体操作,我通常按这个顺序来:先按长度过滤(太短的没有学习价值,太长的会拖慢批次),再做规则去重,最后人工抽检100条看格式和内容。至于更复杂的去重算法、敏感信息过滤,等流程跑通之后再逐步加上——不要一步到位,因为你怎么知道自己在清洗过程中有没有把有用的信息也删掉呢?
2.2 分词器:最容易跳过却决定上限的环节
很多人对分词器有个误解:反正有现成的BERT或GPT-2分词器,直接用不就行了?如果你只是做推理,确实可以;但如果你要从预训练开始,这个做法会带来一个隐蔽的问题——分词器和你的语料分布不匹配,导致文本被切得又碎又低效,训练时每个句子被拉长,学习效率大打折扣。
分词器做的事情,本质上是在“字符”和“词”之间找到一组最优的子词单元。以最常见的BPE(Byte Pair Encoding)算法为例:它从单个字符开始,反复统计相邻单元的出现频率,把最高频的组合合并成一个新单元,直到达到你预设的词表大小。这样做的好处是:常见词作为一个整体被切出来,生僻词退化为多个子词,既控制了词表大小,又不会出现太多“未登录词”。
训练自己的分词器其实很容易,几行代码就能搞定:
from tokenizers import ByteLevelBPETokenizer tokenizer = ByteLevelBPETokenizer() tokenizer.train( files=["data/pretrain_corpus.txt"], vocab_size=32000, min_frequency=2, special_tokens=["<s>", "<pad>", "</s>", "<unk>"] ) tokenizer.save_model("tokenizer")我建议词表大小设为16000到32000之间。太小了,文本被切得过于细碎,序列长度飙升,训练成本增加;太大了,词表里塞满低频子词,模型需要更多数据才能学会它们的语义。32K是一个在大多数场景下都很稳妥的起点。
有一个细节容易被忽略:分词器的词表一旦训好,后续最好不要随意增删,否则之前所有预训练权重都得“翻译”到新词表上,等于模型白训了。所以在这个环节多花半小时做数据抽样、确认切分效果是值得的。
2.3 模型架构:从几十M参数开始,别一上来就7B
架构选择是整个路线里最容易“眼高手低”的地方。看到别人训练7B、13B模型,你也想做大的,结果一张显卡放不下、训练时间按周算、loss还不降,项目直接夭折。
我踩过这个坑之后悟出一个原则:先用一个极小模型跑通全流程,再逐步放大。放在这篇文章的语境里,第一阶段的模型配置大概是这样的:
| 配置项 | 数值 | 说明 |
|---|---|---|
| 层数 | 6 | 深度足够学习复杂特征 |
| 注意力头数 | 8 | 多头机制捕捉不同关系 |
| 隐藏层维度 | 512 | 与头数搭配合理 |
| 词表大小 | 32000 | 上面训练好的分词器 |
| 参数量 | 约40M | 单张消费级显卡轻松跑 |
| 最大序列长度 | 512 | 够用,超过则截断或分段 |
我特意把参数量压在40M左右,目的很明确:让单次训练实验在半小时到一小时内出结果。你可能会问,40M的模型能有什么用?答案是:它的作用是让你在几个小时内验证完“数据-分词-训练-采样”整条链路是否通畅。等这条路走通了,你再把层数从6加到12、隐藏维度从512加到768,参数量到200M左右,依然能在单卡上训练,只是时间会拉长到几小时。
架构代码我不建议自己从头写。直接用GPT-2的PyTorch实现或者HuggingFace的GPT2Config来实例化一个随机权重的模型,都是很好的选择,你只需要修改配置参数。从零训练不等于从零写代码,重要的是理解架构里几个关键模块:自注意力怎么计算、位置编码怎么加、FeedForward层的作用是什么、LayerNorm放在哪里。把这些弄明白,比手写一遍Transformer更能帮你建立可靠的心智模型。
2.4 预训练:看懂loss曲线再谈优化
预训练阶段的目标很纯粹:让模型学会“预测下一个词”。在这个阶段,你会第一次看到loss曲线,而看懂这条曲线,是整个AI工程里最重要的基本功。
我的训练配置是这样的:AdamW优化器,学习率采用warmup+cosine衰减策略,warmup步数设为总步数的3%-5%,最大学习率1e-3到3e-3之间(小模型可以相对大胆一点),权重衰减0.01,全局梯度裁剪设为1.0。批次大小在显存允许的前提下尽量大一些,8到32之间都可以,因为更大的批次会让梯度的方向更稳定。
第一次看到loss曲线下降时,很多人会误以为“只要loss在降,就万事大吉”。实际上有几个关键信号需要盯住:
- loss在持续下降但非常缓慢:先检查学习率是否过小,再看数据是不是太少、模型学到了瓶颈。
- loss在训练后期反弹:多半是学习率衰减太慢,或者数据里有重复内容导致过拟合。
- loss在某个值附近剧烈震荡:学习率过大,或者批大小太小,梯度噪声太大。
- loss降得很快但是生成质量极差:很可能数据本身太简单(比如全是短文本),模型学到的都是浅层模式。
一个容易被新手忽视的细节是:预训练loss不高,不代表模型生成的文本就有意义。因为语言模型的目标是“下一个词的概率分布”,一旦上下文稍微长一点,误差就会累积,生成结果可能完全是胡言乱语。所以我在预训练阶段就会定期做一次sample——输入一个开头,让模型续写几十个token,亲眼看一看模型到底在说什么。这一步比任何指标都直观。
预训练的步数我建议控制在1万到5万步之间(40M模型配合适量数据)。这不是一个严格数字,而是一个经验区间:步数太少模型欠拟合,步数太多后期收益边际递减,而且小模型很容易在重复数据上过拟合。核心原则是小步快跑,多训几个实验对比,而不是一次性把某一组配置跑到底。
2.5 指令微调:让模型学会“回答”而不是“续写”
预训练完成之后,你手里其实是一个“文本续写机器”:给它半句话,它会按语料风格接着写,但完全不会“一问一答”。要让模型变成能用工具,必须有指令微调(SFT)这一步。
SFT的本质是把预训练模型的行为从“预测下一个词”调整为“遵循用户意图生成回答”。具体做法是构造一批“用户指令+标准回答”的配对数据,用这些数据继续训练模型,但训练目标仍然是最小化交叉熵——只是注意力集中在“回答部分”的token上,指令部分的token只作为上下文,不参与损失计算。
这一步我有两个实操建议。第一,数据格式要统一。我在实验里统一用这样的对话结构:
<s>用户:请介绍一下太阳系的行星。 助手:太阳系有八大行星,按离太阳的距离由近到远依次是水星、金星、地球、火星、木星、土星、天王星和海王星。</s>第二,训练时不要把整条对话都丢进去让模型学,而是把损失集中在“助手:”之后的部分。HuggingFace的transformers里有一个DataCollatorForLanguageModeling或者trainer的mask机制可以做到这一点,不熟悉的话可以查一下“causal LM SFT loss masking”的写法。这个细节如果做错,模型会把“用户的指令”也当作要复述的内容,导致回答质量明显下降。
指令微调的数据不需要太多,几千条高质量对话就足以让模型学会“回答”的基本形态。如果你的目标是某个垂直领域(比如客服、代码注释生成),那数据量和领域覆盖度比通用对话更重要。
2.6 推理与评测:别只看loss
模型训练完之后,评测是你和模型之间的第一次“正式对话”。很多人的习惯是让模型生成一段话,肉眼看一下“像不像样”,这远远不够。
我推荐一套简单但系统的评测方法:准备20到50条固定测试题,覆盖你想要的能力维度,比如事实回答、逻辑推理、指令遵循、格式控制。每轮实验后用同样的测试题、同样的采样参数去问模型,把回答记录下来,对比不同训练配置之间的差异。注意采样参数要固定,否则text生成时的随机性会干扰你的判断——尤其是在温度比较高的情况下。
除了人工定性判断,还有一个自动指标值得关注:模型在测试集上的困惑度(perplexity)。这个指标能反映模型对语料的拟合程度,但要注意,困惑度低并不等于回答质量高,它只代表模型能“流利地预测文本”,不代表它能“准确理解并回答”。所以我的习惯是:困惑度作为辅助参考,人工测试问答作为主要判断依据,两者结合才能下结论。
如果你打算继续做第三章的强化学习微调,评测环节就更重要了,因为你后面要拿它来量化“推理能力提升”到底提升到了什么水平。这一步的评测基准会直接变成你的RL奖励信号来源之一。
3. 从“能聊”到“会推理”:给模型加Reasoning能力的实验路径
3.1 先说清楚“推理”在这里指什么
“推理能力”这个词在AI领域已经被用滥了。它究竟指什么?在本文的语境下,我把它限定为:模型能够通过多步中间过程,解决训练数据里没有直接出现的任务。最典型的场景是数学计算——比如训练数据里见过“23×4=92”,但没见过“37×8=296”,模型能不能算出来?
普通的SFT模型在这个问题上会暴露一个明显短板:它生成回答太快了,快到一看就是在“背答案”。比如你问它“37×8等于多少”,它可能直接回答“296”——答案碰巧是对的,但换个数字就一塌糊涂。这种“答得快但答得浅”的本质,是模型没有经历一步步推导的过程。想要让它学会推理,就必须让它“想得更久”,并且把这个思考过程显式地写在生成结果里。
这就引出了推理模型的第一个核心技术:思维链(Chain of Thought,CoT)。简单来说,就是让模型在给出最终答案之前,先产生一系列中间推理步骤。这个机制在超大模型中可能自动涌现,但对从零训练的小模型来说,必须靠数据设计来“教会”它。
3.2 三步小实验:从SFT到RL
我给自己的推理实验设计了三个递进阶段,每一步都有可测量的指标。
第一阶段,构造CoT训练数据。拿小学数学题来说,每道题都附带完整的解题步骤:
用户:小明有3个苹果,小红给了5个苹果,他又吃掉了2个,还剩几个? 助手:小明原来有3个苹果。小红给了5个,所以一共有3+5=8个苹果。吃掉了2个,所以剩下8-2=6个苹果。答案是6个。用一批这样的数据对基础模型做SFT,模型会学会“先写步骤再给答案”的输出格式。但我测试发现,它只会“模仿格式”,并没有真正学会计算——换一道没见过的题,它就露馅了,步骤写得有模有样,计算过程却是错的。这说明CoT的格式可以通过SFT学出来,但“推理能力”本身不会凭空产生。
第二阶段,引入强化学习。这里选择GRPO(Group Relative Policy Optimization)算法,原因很实际:它相比PPO不需要单独训练一个Critic价值模型,计算开销小很多,代码实现也简单,特别适合小团队在消费级显卡上做实验。GRPO的核心思路是:对同一个问题采样多组回答,然后依据一组奖励信号(比如“答案是否正确”和“格式是否符合规范”)对这组回答做相对比较,计算出优势值,再据此更新策略模型。
第三阶段,设计奖励函数。这是整个RL实验里最考验功力的一步。我在第一版设计里只奖励“最终答案正确”,结果模型很快就学会了钻空子——它会在中间步骤里胡编乱造,最后硬蒙一个正确的数字。后来我加了两条规则:一是限制中间步骤必须包含算式;二是如果某条回答的格式不符合CoT规范,就给予较低奖励。这里的原则很简单:奖励函数写清楚了,模型才知道什么叫“好的推理过程”。
3.3 一个可复现的小实验示例
拿最可控的“两位数乘两位数”作为推理任务来举例。我构造了5000道训练题和500道测试题,训练题和测试题完全无重叠。三个阶段的测试结果如下:
| 实验配置 | 测试正确率 | 观察到的生成行为 |
|---|---|---|
| 基础SFT(无CoT数据) | 约28% | 直接给答案,错误很离谱 |
| SFT + CoT数据 | 约49% | 有步骤格式,但计算经常出错 |
| SFT + CoT + GRPO | 约66% | 步骤完整,计算错误率明显下降 |
你可以看到,真正拉高正确率的是RL阶段。为什么会这样?因为SFT只是让模型“学习数据中的模式”,学完就固定了;而GRPO会不断地从模型自身采样中挑出“好的推理过程”并强化,这就相当于让模型在自己的搜索空间中不断迭代优化。这是一个从“模仿”到“超越”的关键转变。
这里的数字只是参考,不同初始权重、采样温度和奖励设计都会影响结果,但趋势是稳定的。做这个实验最大的价值在于:你能亲手验证“RL不是玄学”,它的效果确实可测量、可复现。
3.4 训练不稳定时怎么排查
GRPO并不是一路绿灯的实验。我最常遇到的两种异常情况:
第一种,奖励越来越大,但测试正确率不升反降。这个现象通常意味着模型在“奖励黑客”——它找到了某种能拿高分但没有真正提高推理能力的捷径。比如它可能学会了一种话术:步骤写得特别长、特别复杂,让格式评分器给了高分,但计算本身仍然错得离谱。解决办法是:定期在测试集上算正确率,不能只看奖励曲线;同时把格式奖励的权重降低,别让模型把精力都花在“把话说漂亮”上。
第二种,训练过程中loss崩了,生成文本变成乱码。这多半是学习率太大,或者采样温度太高导致模型离线探索太远,生成的样本质量太差。我的修复方式是把学习率降到原来的三分之一,同时降低采样温度(比如从1.0降到0.7),并且在奖励里加大对“格式错误”的惩罚力度。训练RL和预训练的节奏不同,它更像是“短线交易”,每一步都在做策略更新,所以稳定性比速度更重要。
4. 只有一张消费级显卡,怎么把流程跑下来
4.1 先从显存账算起
现实情况是,绝大多数业余做AI工程的人,手上只有一张消费级显卡。我先给大家算一笔显存账,避免有人一头扎进7B模型的训练里。
以FP16精度为例,一个7B参数的模型,光参数就要占14GB显存。AdamW优化器需要为每个参数保存一阶动量和二阶动量,这又额外需要28GB。也就是说,光是“参数+优化器状态”就已经需要42GB显存,还没算中间激活值和梯度。一张24GB的RTX 3090/4090根本放不下,更别说训练了。
所以在从零构建的过程中,我强烈建议把目标模型尺寸控制在1B参数以下。300M到1B是一个甜点区间:模型足够大,能有比较丰富的语言能力;又足够小,在单张卡上可以跑通完整的训练流程,只是需要一些技巧。具体的显存估算可以按这个公式粗略计算:
训练所需显存 ≈ 参数量 × (4字节参数 + 4字节梯度 + 8字节优化器状态 + 若干倍激活值)
其中激活值乘数取决于批次大小和序列长度,经验上挂2到4倍比较保守。对照下来,300M模型的训练显存高峰大约在6到12GB之间,1B模型则在20到30GB之间。想跑1B,就必须配合LoRA这类参数高效微调方法,因为在微调阶段冻结大部分参数后,优化器状态和梯度的开销大幅下降。
4.2 一套能落地的资源策略
我完整的算力方案分三个阶段:
第一阶段,40M模型全参数预训练,单卡RTX 3090,半小时到两小时搞定。这个阶段的目的就是把预训练跑通,体会loss曲线变化。第二阶段,把模型放大到300M左右,用同样的数据流程做一次完整的预训练,时间会拉长到几小时到一天,但依然可控。第三阶段,在SFT和GRPO阶段,一律使用LoRA,只训练低秩适配器的参数,这样显存占用断崖式下降,1B模型放在24GB卡上也变得可行。
LoRA的原理说起来也简单:冻结原模型的权重,在两个线性层之间插入一个小矩阵(低秩矩阵),训练时只更新这个小矩阵的参数。相当于给预训练模型加了一个“可拆卸的定制适配器”,效果很好、成本很低。我通常把LoRA的秩(rank)设为8到16,这是个性价比很高的区间——太大了训练变慢提升有限,太小了表达能力不足。
如果你手里的卡显存只有16GB甚至更低,也不用灰心。把模型压到100M级别、使用LoRA、再把批次大小降到1配合梯度累积,同样能完成整个流程,只是时间会拉长。关键是先跑通,再优化速度。
4.3 训练的效率与止损线
在整个从零构建过程中,最浪费时间的不是训练本身,而是“死等一个注定失败的实验跑完”。我在前面踩过无数次这种坑,后来总结出一条止损原则:预训练阶段,如果前500步loss几乎不下降,或者梯度范数异常,立即停掉改配置,不要心存侥幸。
具体操作上,我习惯用Weights & Biases或者TensorBoard记录训练曲线,每50步看一下loss和梯度范数。如果loss平坦但梯度范数保持在一个稳定值,可能是学习率太小;如果梯度范数飙升到正常值的10倍以上,说明学习率过大或者数据有异常样本,需要调小学习率或检查batch里是否有“脏数据”。另外一个常用技巧是:在正式训练前,用一小块数据(比如500条)跑几步,确认模型能正常过拟合这块数据,这说明整个链路完好,只是数据层面的问题——这一步能帮你省掉大量调试时间。
训练过程中的自动保存也值得做好。我每1000步保存一次checkpoint,同时把最优的checkpoint单独备份。RL阶段更要注意,因为策略更新一旦跑偏,生成质量可能在几百步内迅速退化,这时候如果没有早期checkpoint可以回退,就得从头再来了。这不只是时间问题,更是心态问题——项目死在最后一步,比死在起步阶段更让人崩溃。
5. 新手最容易被劝退的节点与我的解决办法
5.1 第一个坑:在流程没跑通前就追求完美数据
我见过太多人(包括曾经的自己)在数据准备阶段就耗尽所有热情。他们会花三周去清洗一个“完美的中文语料库”,结果模型训练时发现流程中一个简单的bug,浪费的所有清洗时间都变成了沉默成本。
正确的姿势是:第一版数据能用就行,几百MB甚至几十MB都够,目标是赶紧跑通流程;第二版再迭代数据质量,每轮都记录数据改动带来的效果变化。这就像做菜,先做一个“能吃”的版本,再逐步调味到“好吃”,而不是一开始就抱着米其林的标准备菜三小时。
5.2 第二个坑:模型尺寸的“先大后小”陷阱
“先跑小的,再跑大的”这句话听着像废话,但执行起来是非常反人性的。因为人总是倾向相信“大模型效果更好”,于是跳过小模型直接开搞,结果卡在显存、速度、调参的三重折磨里。我后来给自己立了一条规矩:任何新方案,先用40M模型跑通、跑稳,再谈放大。这条规矩救过我很多次——很多问题在小模型上几分钟就能暴露,放大后可能要浪费一整天。
5.3 第三个坑:loss不降只会怀疑人生,不会排查
loss不降是常态,但它背后的原因各不相同。我总结了一套排查路径,按顺序执行可以覆盖90%的问题:
- 先检查数据:batch里有没有大量重复或空文本?标签和输入有没有错位?
- 再检查优化器:学习率是否太小或太大?warmup有没有生效?
- 再看模型结构:输出层维度是否匹配词表大小?有没有用正确的损失函数?
- 最后看随机种子:小模型参数初始化对结果影响很大,换个种子再跑一次对比一下。
这套路径花了我们很长时间才摸索出来,因为前期每次loss不正常,第一反应都是“调学习率”,结果很多时候问题根本不在学习率,而在数据错位。
5.4 第四个坑:RL训练中奖励函数被“钻空子”
如果你做到了第3章,那这个坑你一定会遇到。模型是最没有道德感的优化器,只要奖励函数有漏洞,它一定会找出来。比如我奖励“回答包含答案”,模型就学会了把答案重复写三遍;我奖励“格式合规”,模型就会生成一长串模板化的废话来灌水。
治理办法是:奖励函数的设计要尽可能具体到行为层面,同时引入规则性的惩罚项。每轮训练后,抽20条生成结果人工过目一遍,亲眼看看模型是不是在“走捷径”。如果发现在钻空子,马上调整奖励,再训练。这个过程很烦,但恰恰是RL工程最核心的经验积累。
5.5 给新手的总路径建议
如果你打算完整走一遍这个流程,我的建议路径是:
- 先用40M模型+小语料跑通预训练,目标:看懂loss曲线。
- 构造几千条SFT数据,完成指令微调,目标:模型学会“一问一答”。
- 选一个具体推理任务(比如两位数乘法),构造CoT数据,做SFT+GRPO对比实验,目标:体会到RL带来的能力跳跃。
- 每一步都记录实验笔记,包括数据规模、超参数、loss曲线、生成样例、自己的判断和猜测。
完成这四步,你对“从零训练AI模型”的理解会比读十篇论文都深。接下来再遇到任何大模型相关问题,你至少知道是哪个环节出了问题,而不是只能无助地刷新页面祈祷下一次生成效果好一点。
最后聊一点个人体会。做了几个月从零AI工程,我最大的收获不是跑通了模型,而是建立了对训练过程的直觉——看到loss曲线异常时能判断出是数据问题、学习率问题还是采样噪声;模型生成质量差时知道该回去改数据还是改奖励。这种“debug训练过程”的能力,在纯调用API的工作里永远培养不出来。
如果看完你也想动手,建议按最小路线执行。还有一个实用小技巧:提前把实验记录模板做好,每个实验跑完,把配置、曲线、样例截图和当天的判断写进去。几天后再翻这些记录,你会惊讶地发现自己对模型训练的理解提升得有多快。这比任何一次“跑通实验”都更有价值。