
最近在做大模型应用落地时经常被团队同学问到一组概念“预训练、后训练、微调、对齐这几个到底有什么区别为什么有的模型对话能力强有的只会续写”说实话这些问题如果只看文档确实容易绕晕——很多资料把微调和对齐混在一起讲又有人把后训练当成微调的同义词实际项目里选型时很容易踩坑。本文就围绕这条技术主线把大模型从“会说话”到“听懂指令”的完整训练链路拆开讲清楚。内容分为三部分先解释每个阶段的核心目标和数学直觉再给出可运行的 PyTorch / PEFT 微调示例让零基础读者也能跑通最小实验最后补充工程选型建议和排错清单。无论你是刚接触 NLP 的学生还是正在做垂直领域大模型落地的工程师这篇都能帮你建立起清晰的训练认知框架。先说结论预训练决定“上限”后训练和微调决定“可用性”对齐决定“安全性”。下面我们逐步展开。1. 四个核心概念先建立全局认知1.1 预训练到底是什么预训练Pre-training是让模型习得语言规律的过程。传统机器翻译时代我们需要为每个任务单独标注大量数据而预训练语言模型如 GPT、BERT、RoBERTa的思路是先用海量无标注文本让模型学会预测下一个 token或者还原被遮蔽的 token。这个过程可以被通俗地理解成“通识教育”。模型读了几千亿 token 的网页、书籍、论文从中掌握了语法、事实知识、推理链条的统计规律。但此时它只知道“这段话接什么最通顺”并不知道用户会以“帮我写一封请假邮件”这样的指令来调用它。以 GPT 系列为例预训练的目标函数是最大化下一个 token 的似然概率Loss -Σ log P(token_t | token_1, token_2, ..., token_{t-1})这段代码展示了构建训练数据时的核心逻辑def build_pretrain_samples(text: str, block_size: int 128): 将原始文本切割为定长序列用于 next-token 预测。 这里只演示数据组织方式实际预训练还要考虑 tokenizer、注意力掩码等。 tokens tokenizer.encode(text) samples [] for i in range(0, len(tokens) - block_size, block_size): x tokens[i : i block_size] y tokens[i 1 : i block_size 1] samples.append((x, y)) return samples注意这段逻辑在 BERT 中略有不同BERT 使用 [MASK] 遮蔽部分 token然后让模型还原被遮蔽的内容即掩码语言建模MLM。而 GPT 系列是自回归建模。这两类预训练模型后来走上了不同的应用路线这是很多初学者容易混淆的第一处。1.2 后训练预训练与微调之间的关键桥梁“后训练Post-training”是这两年业界逐渐统一起来的叫法。它泛指在预训练模型之后为了提升模型在具体任务或人类偏好上的表现而进行的训练过程包括但不限于指令微调SFT、人类反馈强化学习RLHF、直接偏好优化DPO等。为什么要把这一层单独拎出来因为预训练出来的模型虽然“知识渊博”但它的交互范式是“补全”而不是“对话”。如果我们不做任何后训练直接拿它来聊天会出现两种情况模型回答很长但风格像是续写文章模型不理解“请用三句话总结”这种指令约束。后训练阶段的本质是让模型完成“能力→行为”的转换。业内人士常说的“预训练和后训练哪个薪资高”其实反映的是行业分工预训练对算力和数据工程的要求极高而后训练更贴近业务效果优化因此两者都需要专门人才薪资水平在不同公司侧重点也不同。1.3 微调后训练的一种具体手段微调Fine-tuning严格来说是方法层面的概念在预训练模型基础上用标注数据继续更新部分或全部参数。全量微调、Freeze 微调、LoRA 微调都属于这个范畴。那么微调与后训练是什么关系可以用一句话解释后训练是目标范围微调是实现手段。后训练阶段通常会使用微调的方式例如对全模型参数做 SFT但后训练还包括 RLHF 这类不直接拟合标签的方法后者不是传统意义上的“微调”。此外微调这个词在 CV 领域也很常见比如加载 ResNet 预训练模型后再训练分类头在 NLP 领域加载 RoBERTa 中文预训练模型做文本分类。这种“基座预训练 任务微调”是迁移学习的经典范式和大模型时代的“预训练 指令微调”思路一脉相承。1.4 对齐让模型行为符合人类期望对齐Alignment这个概念源自 AI 安全领域核心目标是让模型行为与人类意图、价值观一致。它关注的不是模型“懂不懂知识”而是模型“愿不愿意听话”以及“在边界场景下如何表现”。对齐的典型场景包括拒绝回答违法、有害问题在不确定时承认不知道而不是编造遵循格式要求、语气要求在敏感话题上保持中立。值得注意的是对齐不是一次训练就能完成的。它通常需要指令微调 偏好优化多轮交替。很多人把 SFT 叫作对齐这是不严谨的SFT 更多是让模型学会指令格式而 RLHF/DPO 才是真正把人类偏好“写入”模型权重。下表可以帮助快速建立四者关系的整体印象阶段目标数据参数更新结果预训练学习语言规律与知识海量无标注文本全量更新基座模型后训练提升任务表现与交互指令数据、偏好数据可选多种方式可用模型微调适配下游任务任务标注数据全量/部分/LoRA任务模型对齐行为符合人类价值观人工偏好标注、规则RLHF/DPO/SFT安全模型2. 预训练模型的“通识教育”2.1 预训练数据从哪来预训练阶段最重要的资产不是模型架构而是数据。GPT-3 的训练数据来自 Common Crawl、WebText、书籍语料等后续模型还引入了高质量代码、多语种语料。数据清洗通常会做以下几件事去重用 MinHash 或 SimHash 去除近似重复文本过滤去掉低质量、有毒内容、个人隐私信息混比调节不同来源语料的比例例如代码比例、多语种比例分词选择 Byte-Pair EncodingBPE或 SentencePiece 等子词方法。其中“质量过滤”直接影响模型能力。如果原始语料里掺杂大量机器生成的垃圾文本模型后续生成质量也会被拉低。所谓“Garbage in, garbage out”在预训练阶段表现得尤为明显。2.2 损失函数与训练稳定性预训练的损失函数在不同架构上略有差异GPT 系列使用自回归语言建模损失即每个位置的输出都预测下一个 tokenBERT 使用遮蔽语言建模损失 下一句预测损失后来很多模型放弃了下一句预测T5 使用 span corruption 风格的目标。训练稳定性的关键是学习率调度。常见做法是先用 warmup 将学习率线性升到峰值再用余弦退火逐步降低。如果 batch size 很大还需要同步提高学习率并配合梯度裁剪防止梯度爆炸。一个简化版预训练循环如下# 伪代码演示训练循环结构不依赖具体框架细节 model.train() optimizer torch.optim.AdamW(model.parameters(), lr3e-4) for step, batch in enumerate(train_dataloader): input_ids batch[input_ids].to(device) labels batch[labels].to(device) outputs model(input_idsinput_ids, labelslabels) loss outputs.loss loss.backward() torch.nn.utils.clip_grad_norm_(model.parameters(), max_norm1.0) optimizer.step() scheduler.step() optimizer.zero_grad() if step % 100 0: print(fstep {step}, loss {loss.item():.4f})这段代码虽然简单但已经包含了预训练的核心要素前向计算、损失回传、梯度裁剪、学习率调度。真实预训练还需要张量并行、流水线并行、数据并行等分布式策略这里不展开。2.3 预训练模型的分类应用预训练不只是大语言模型的专利。在 CV 领域ResNet 预训练模型就是经典的视觉特征提取器在 NLP 领域RoBERTa 中文预训练模型常用于句子分类、命名实体识别等任务。它们的共同理念是在一个大数据集上训练通用表示再迁移到下游小数据集。但这里要提醒一点预训练模型本身不解决所有问题。加载 ResNet 预训练模型做分类时我们仍然需要替换最后的全连接层加载 RoBERTa 做分类时需要在 [CLS] 输出上接一个分类头。这说明预训练提供的是“可迁移的特征底座”而不是开箱即用的完整系统。3. 后训练与微调走向任务实战3.1 全量微调、Freeze 微调与 LoRA 微调进入后训练阶段我们最先接触的就是三种微调方法。下面用表格先做对比方法更新参数范围显存占用适用场景全量微调全部参数最高数据充足、追求极致效果Freeze 微调只训练部分层较低基座较强、资源有限LoRA 微调低秩矩阵参数最低低成本适配、多任务切换全量微调的实现最直接from transformers import AutoModelForCausalLM, AutoTokenizer, Trainer, TrainingArguments model AutoModelForCausalLM.from_pretrained(your-base-model) tokenizer AutoTokenizer.from_pretrained(your-base-model) training_args TrainingArguments( output_dir./output, per_device_train_batch_size2, gradient_accumulation_steps8, learning_rate2e-5, num_train_epochs3, logging_steps50, save_strategyepoch, ) trainer Trainer( modelmodel, argstraining_args, train_datasettrain_dataset, ) trainer.train()全量微调的问题在于显存和存储成本。一个 7B 模型用 FP16 加载本身就接近 14GB如果还要保存全部梯度、优化器状态一张 24GB 消费级显卡往往不够用。于是有了 Freeze 微调和 LoRA 微调。Freeze 微调的做法是冻结大部分参数只训练顶层附近的参数。它的直觉是底层参数已经学到通用语言特征顶层参数更接近具体任务语义。代码实现时可以这样冻结层for name, param in model.named_parameters(): if layers.0 in name or layers.1 in name: param.requires_grad False这种做法的风险在于冻结层过多可能导致表达力不足冻结层太少又退化为全量微调。需要根据任务复杂度尝试。LoRALow-Rank Adaptation是当前最主流的轻量微调方案。它的原理是在原始权重矩阵旁引入低秩分解矩阵只训练新增的低秩参数。由于新增参数很少通常不到原模型的 1%显存占用显著降低而且可以通过切换 LoRA 权重实现多任务共用一个基座模型。3.2 LoRA 微调实战示例下面给出一段基于 Hugging Face PEFT 库的 LoRA 微调完整示例注意需要安装peft、transformers、datasetspip install peft transformers datasets accelerate核心代码from transformers import AutoModelForCausalLM, AutoTokenizer, TrainingArguments from peft import LoraConfig, get_peft_model, TaskType from trl import SFTTrainer model AutoModelForCausalLM.from_pretrained(your-base-model) tokenizer AutoTokenizer.from_pretrained(your-base-model) tokenizer.pad_token tokenizer.eos_token lora_config LoraConfig( task_typeTaskType.CAUSAL_LM, r8, lora_alpha16, lora_dropout0.05, target_modules[q_proj, v_proj], ) model get_peft_model(model, lora_config) training_args TrainingArguments( output_dir./lora-ckpt, per_device_train_batch_size4, gradient_accumulation_steps4, learning_rate2e-4, logging_steps10, save_total_limit2, num_train_epochs3, bf16True, ) trainer SFTTrainer( modelmodel, argstraining_args, train_datasettrain_dataset, tokenizertokenizer, max_seq_length1024, dataset_text_fieldtext, ) trainer.train()这段代码的要点target_modules指定插入 LoRA 适配器的网络层通常选择注意力层中的 q、v 矩阵有的任务也会加上 k、o 矩阵r是低秩的秩秩越高表达能力越强但参数量也会增加lora_alpha决定适配器权重的缩放比例一般取r的 1~2 倍SFTTrainer是 TRL 库提供的高层封装能自动处理指令数据格式。LoRA 微调结束后可以单独保存适配器权重model.save_pretrained(./lora-ckpt-final)推理时需要先加载基座模型再加载 LoRA 适配器from peft import PeftModel base_model AutoModelForCausalLM.from_pretrained(your-base-model) lora_model PeftModel.from_pretrained(base_model, ./lora-ckpt-final)这种“基座模型 LoRA 适配器”的模式在企业应用中非常常见。多个团队可以在同一个基座模型上挂载不同的 LoRA实现模型复用降低存储成本。3.3 指令微调的数据与格式后训练阶段最容易被低估的是数据。很多人以为 LoRA 配好参数就能出效果结果训练完模型要么学会“复读”要么完全不听指令。问题往往出在数据上。指令微调数据的典型格式是三元组指令instruction、输入input、输出output。对于对话场景还要加入历史轮次和系统提示词。一个最小可用的指令样本长这样{ instruction: 请给出这个问题的三点建议如何提高团队协作效率, input: , output: 1. 建立透明的任务看板明确每个人当前优先级\n2. 设置固定的同步节奏减少临时打扰\n3. 项目结束后复盘流程持续优化协作机制。 }数据数量的重要性大于一味追求模型参数。一般经验是先准备几千条高质量指令数据验证流程再逐步扩充到几万条。有些公开数据集可以直接使用但需要检查许可证和敏感内容。4. 对齐从“会答”到“答得好、答得稳”4.1 指令微调属于对齐吗严格来说指令微调SFT是对齐的起点但不是全部。SFT 让模型学会遵循指令格式例如“请用 JSON 输出”“请用一句话总结”。但如果模型在格式上听话在内容上仍然可能输出有害、偏见或编造的信息这时就需要偏好对齐。一个简单区分方式SFT教会模型“应该怎么回答”基于人工标注的期望输出RLHF/DPO教会模型“什么回答更好”基于成对偏好数据约束解码推理时不改变权重但通过规则限制输出。这三者不是互斥的。在实际产线里通常是先 SFT再做 RLHF 或 DPO最后在推理阶段加规则护栏。4.2 RLHF 的基本流程RLHFReinforcement Learning from Human Feedback是 OpenAI 在 InstructGPT 论文中提出的对齐方法流程拆成三步收集人类对模型多个回答的偏好排序用偏好数据训练一个奖励模型Reward Model给回答打分用 PPO 算法优化策略模型使得奖励分最大化。奖励模型是 RLHF 的关键。它本质上是一个回归模型输入是“提示词 回答”输出一个标量分数。训练奖励模型时常用 pairwise ranking loss让好的回答得分高于差的回答。PPO 阶段会引入参考模型限制策略模型的更新幅度防止模型为了刷奖励分而崩溃。这就是“KL 散度”在 RLHF 中的意义既要提高奖励又不能偏离原始模型太远。4.3 DPO更简单的偏好优化DPODirect Preference Optimization是 RLHF 的简化版本。它的核心发现是奖励模型的优化目标可以隐式嵌入到策略损失中不需要显式训练奖励模型也不需要 PPO 的复杂采样流程。DPO 的损失函数基于 Bradley-Terry 偏好模型直接用偏好数据对优化策略。对于中小团队来说DPO 更容易实现和调参。很多开源项目的对齐阶段都从 SFT 直接跳到了 DPO跳过了 RLHF。DPO 训练数据格式是三元组提示词、偏好回答chosen、次优回答rejected{ prompt: 如何应对工作压力, chosen: 适当运动、规律作息、与同事沟通……, rejected: 不用管压力忍一忍就过去了。 }这里需要强调chosen 和 rejected 的差异要足够明显如果两个回答质量接近训练信号会减弱模型难以学到有效偏好。4.4 对齐的边界与“隐式空间对齐”对齐并不只在训练阶段发生。在实际系统中模型可能还需要与检索结果、外部知识库、用户权限体系对齐业界称之为“隐式空间对齐”或“RAG 对齐”。例如模型输出的向量表示需要与向量数据库中的文档嵌入在同一向量空间中多模态场景下图像特征与文本特征需要对齐到同一语义空间推荐场景中模型的商品向量与用户向量需要计算余弦相似度。这种“对齐”与 RLHF 的价值观对齐不同它属于表征层面的空间对齐。两者同名不同义阅读文献时要特别注意语境。5. 完整实战用一个小项目串联训练流程前几节概念较多这一节我们用一条可执行的最小链路把“基座模型 → 指令微调 → 偏好优化”串起来。为了便于阅读示例采用开源工具链transformerspefttrl。5.1 创建项目结构建议使用下面的目录结构llm-training-demo/ ├── data/ │ ├── sft_data.jsonl │ └── preference_data.jsonl ├── scripts/ │ ├── prepare_sft_data.py │ ├── run_sft.sh │ └── run_dpo.sh ├── output/ │ ├── sft_model/ │ └── dpo_model/ └── README.md注意output目录不需要提前创建训练脚本会自动生成。5.2 准备指令微调数据data/sft_data.jsonl按 JSONL 格式每一行是一条指令样本{instruction: 用一句话介绍什么是大模型微调。, input: , output: 大模型微调是在预训练模型基础上用特定任务数据继续训练模型使其适应该任务的生成风格和内容要求。} {instruction: 列出三种常见的微调方法。, input: , output: 全量微调、Freeze 微调和 LoRA 微调。}准备数据脚本体量不大主要作用是统一格式。这里给出一个简单示例# scripts/prepare_sft_data.py import json from datasets import Dataset def load_and_format(path: str, tokenizer): rows [] with open(path, r, encodingutf-8) as f: for line in f: obj json.loads(line) text ( f|im_start|user\n{obj[instruction]}\n f|im_start|assistant\n{obj[output]} ) rows.append({text: text}) return Dataset.from_list(rows)实际项目中文本模板要跟基座模型的对话模板保持一致。不同模型的 chat template 不同需要自行查看对应模型卡文档。5.3 运行 LoRA 指令微调在 5.2 数据就绪后执行下面的脚本# scripts/run_sft.sh python -m torch.distributed.run \ --nproc_per_node1 \ run_sft.pyrun_sft.py的核心代码与前文 3.2 节类似这里额外加入对话模板处理from transformers import AutoModelForCausalLM, AutoTokenizer, TrainingArguments from peft import LoraConfig, get_peft_model, TaskType from trl import SFTTrainer from datasets import load_dataset model_name Qwen/Qwen2-1.5B-Instruct # 请按实际可用模型调整 dataset load_dataset(json, data_filesdata/sft_data.jsonl) tokenizer AutoTokenizer.from_pretrained(model_name, trust_remote_codeTrue) tokenizer.pad_token tokenizer.eos_token model AutoModelForCausalLM.from_pretrained( model_name, trust_remote_codeTrue, torch_dtypeauto, ) lora_config LoraConfig( task_typeTaskType.CAUSAL_LM, r8, lora_alpha16, lora_dropout0.05, target_modules[q_proj, k_proj, v_proj, o_proj], ) model get_peft_model(model, lora_config) training_args TrainingArguments( output_dir./output/sft_model, per_device_train_batch_size1, gradient_accumulation_steps16, learning_rate2e-4, logging_steps10, save_total_limit1, num_train_epochs3, remove_unused_columnsFalse, bf16True, ) trainer SFTTrainer( modelmodel, argstraining_args, train_datasetdataset[train], tokenizertokenizer, max_seq_length1024, dataset_text_fieldtext, ) trainer.train() model.save_pretrained(./output/sft_model) tokenizer.save_pretrained(./output/sft_model)需要提醒的是Qwen/Qwen2-1.5B-Instruct只是一个示例性模型名实际运行时必须确认目标模型允许商用、支持当前 transformers 版本并下载到本地或配置好网络环境。如果你的显存小于 16GB建议换用更小的模型或者进一步降低 batch size 并增加梯度累积步数。5.4 运行 DPO 偏好优化有了 SFT 模型后可以进一步做 DPO。data/preference_data.jsonl里的每一行包含 prompt、chosen、rejected 三个字段。核心示例# scripts/run_dpo.sh python run_dpo.pyrun_dpo.py代码骨架如下from transformers import AutoModelForCausalLM, AutoTokenizer, TrainingArguments from peft import LoraConfig, get_peft_model, TaskType from trl import DPOTrainer model_name ./output/sft_model tokenizer AutoTokenizer.from_pretrained(model_name) model AutoModelForCausalLM.from_pretrained(model_name) lora_config LoraConfig( task_typeTaskType.CAUSAL_LM, r8, lora_alpha16, target_modules[q_proj, k_proj, v_proj, o_proj], ) model get_peft_model(model, lora_config) training_args TrainingArguments( output_dir./output/dpo_model, per_device_train_batch_size1, gradient_accumulation_steps8, learning_rate1e-5, logging_steps10, save_total_limit1, num_train_epochs2, bf16True, ) dpo_trainer DPOTrainer( modelmodel, argstraining_args, train_datasetpreference_dataset, tokenizertokenizer, beta0.1, ) dpo_trainer.train() model.save_pretrained(./output/dpo_model)beta是 DPO 中的温度参数控制对偏好差异的敏感程度。beta太大会让模型过度拟合偏好数据beta太小则对齐效果不明显。一般初始值设置在 0.1 到 0.3 之间再根据评估指标调整。5.5 验证与效果评估训练完成后不能只看训练 loss。推荐做两类评估能力评估用标准评测集如 C-Eval、MMLU 的中文版本看通用能力是否下降行为评估准备一组合规测试用例例如“有害请求拒绝率”“格式遵循率”“编造率”。实际项目中最好再准备一组“回归用例”覆盖历史修复过的问题防止对齐训练导致旧问题回退。这一条在工程中经常被忽略但价值非常大。6. 常见问题与排查思路6.1 概念混淆向问题现象常见原因解决思路分不清预训练和后训练以为只有一次训练认清预训练得到基座模型后训练是后续所有目标训练的总称把微调和记忆混为一谈以为微调就是“记住知识”微调确实有记忆成分但更重要的是行为调整与能力迁移把 SFT 直接等同于对齐忽略偏好优化环节明确 SFT 是对齐的起点RLHF/DPO 才是偏好对齐核心不知该用全量微调还是 LoRA没有评估资源与数据量数据多、资源足用全量资源有限、需要多任务切换用 LoRA“微调和记忆的区别”是一个很好的切入点微调确实会让模型学习到训练数据中的事实但它更核心的作用是调整模型的输出分布让模型“在什么输入下说什么话”。如果只是想让模型记住某个文档更好的做法是接入 RAG 做检索增强而不是靠微调硬记否则既容易过拟合也难以更新知识。6.2 训练过程报错向问题现象常见原因解决思路CUDA out of memorybatch size 太大或激活值缓存过多调小 batch size、开启梯度累积、使用 LoRAloss 震荡不下降学习率过高或数据噪声大调低学习率、检查数据质量、增加 warmup训练完成后模型复读SFT 数据只有一个回答风格或轮次过多过拟合检查数据多样性、减少 epoch、加入 dropoutDPO 训练不收敛chosen/rejected 差异不显著、beta 不合适清理偏好数据、调整 beta、增加正则推理时模板错乱tokenizer 的 chat template 与训练不一致显式调用 tokenizer.apply_chat_template 并比对输出6.3 效果不佳排查清单当训练后模型效果不符合预期时按以下顺序排查看训练 loss如果 loss 未明显下降问题在数据或超参看验证集 loss如果训练 loss 低但验证 loss 高说明过拟合看具体输出把小样本预测打印出来人工判断是格式问题还是内容问题看基线用未微调的基座模型做同样的提示词测试确认是否是微调引入的回退看数据泄漏确认训练集和评估集来源不同避免“伪性能”。7. 最佳实践与工程选型建议7.1 何时选择全量微调、Freeze 微调还是 LoRA项目评估选型时可以遵循下面几条经验如果目标是垂直领域能力提升且有几十万级以上的高质量标注数据资源也允许考虑全量微调如果基座模型本身已经很强只是想改变输出语气、格式、增加少量领域规则优先尝试 Freeze 微调或 LoRA如果要在多个任务间频繁切换强烈推荐 LoRA。每个任务一个适配器推理时动态加载能显著节省存储。7.2 数据质量优先于一切无论是预训练还是后训练数据的重要性都高于模型超参。建议在数据上投入至少 70% 的精力。具体做法建立数据清洗流水线过滤低质量、重复、有毒内容统计 token 长度分布避免过长或过短样本导致 batch 效率低下对标签做交叉验证确保多个标注人员之间的一致性每次训练前做一次数据抽样人工检查。7.3 版本对齐与配置管理在训练工程中“版本对齐”不只是软件工程里的依赖版本问题也包括模型权重版本、tokenizer 版本、训练脚本版本。依赖版本transformers、peft、trl的版本必须锁定避免 API 变化导致训练结果不可复现模型版本记录基座模型的 commit id 或快照时间有时候同一个模型名在不同时间拉取的权重并不完全一致配置版本将训练超参记录到配置文件训练结束后一并归档随机种子固定 seed保证同数据、同代码下可以复现结果。7.4 安全、合规与最小权限训练数据中如果包含用户个人信息、受版权保护文本或内部业务数据必须提前做合规评估。涉及数据获取时要确认数据来源的授权许可不能使用爬来的未授权内容。训练服务器、模型存储的访问权限也要保持最小化尤其是微调后的模型可能具备较强的指令遵循能力一旦泄露可能被恶意利用。7.5 评估与监控不要只在训练结束时看一次指标。建议训练过程中定期保存 checkpoint每次 checkpoint 都跑一遍回归用例上线前对比基座模型、SFT 模型、DPO 模型的输出差异上线后持续监控用户反馈、拒绝率、位置偏差等。8. 下一步学习路线到这里本文已经把“预训练、后训练、微调、对齐”这条主线梳理完了。如果你能从零跑通第 5 节的最小链路那么后续学习方向可以这样规划如果你想深入“预训练”可以学习数据并行、张量并行、流水线并行以及 MoE 架构、长上下文扩展如果你想做好“微调”建议仔细研究 LoRA 的秩选择、target_modules 的选择以及 Adapter、QLoRA、DoRA 等变体如果你想做好“对齐”可以从 DPO 出发再学习 RLHF 中的奖励模型训练、PPO 实现以及 Constitutional AI、KTO 等新方法如果你想做好“工程落地”必须掌握 LLaMA-Factory、vLLM、Triton 推理服务等工具链。LLaMA-Factory 是目前比较流行的微调工具它把 SFT、DPO、LoRA、全量微调等流程封装成了标准化操作适合快速验证实验。不过工具只是加速器理解底层原理才能真正应对复杂业务场景。建议下一步动手做一个小实验用 1000 条指令数据微调一个小模型再准备 100 条偏好数据做 DPO观察模型在不同训练阶段的行为变化。你会发现“听懂指令”不是一个顿悟过程而是多个训练阶段叠加的结果。这种从第一性原理出发的实验体验比看任何文章都更能加深理解。希望这篇拆解能帮你建立清晰的大模型训练认知框架。如果你在跑通示例时遇到问题欢迎在评论区贴出报错信息一起交流。