《动手学大模型》:上海交大 3 万+ Star 的 LLM 编程实践教程——微调/提示工程/知识编辑/RLHF 全覆盖
posts posts 2026-04-16T01:30:00+08:00dive-into-llms 是上海交通大学出品的 3 万+ Star 大模型教程,用 Jupyter Notebook 覆盖微调部署、提示学习、思维链、知识编辑、数学推理、文本水印、越狱攻击、隐写术、多模态、GUI Agent、RLHF 对齐等 11 个主题,并与华为昇腾联合推出国产化教程。技术笔记LLM, RLHF《动手学大模型》:不教你看懂论文,教你把模型跑通
《动手学大模型》的价值不在任何单章的深度,而在于把「让模型干活」和「约束模型」这两件事放进了同一个仓库,并且全部以可运行的 Notebook 交付。
前一条主线由微调、提示学习、知识编辑、数学推理构成,解决「怎么让模型完成任务」;后一条主线由水印、越狱、隐写、RLHF(基于人类反馈的强化学习,Reinforcement Learning from Human Feedback)对齐构成,解决「模型会被怎样操纵、又该如何约束」。多数大模型课程只覆盖其中一面,这套教程两面都做,这一点就把它和同类教程区分开了。
另一个区别落在交付上:它不教「看懂论文」,教「跑通代码」。每个主题配课件、中文教程文档和可运行脚本,读者在一台机器上就能把流程走一遍,从微调一个模型,一直走到给模型做安全对齐。
| 项目 | 信息 |
|---|---|
| GitHub | Lordog/dive-into-llms |
| Stars | 30,000+ |
| 类型 | 编程实践教程(Jupyter Notebook) |
| 来源 | 上海交通大学 |
| 教师 | 张倬胜 |
| 语言 | 中文 |
读完后,你能判断自己该从哪条学习线入手、每章要花多少算力、哪些技术点值得上手复现,而不是只能转述「这是个 3 万 Star 的教程」。要做到这一步,下面先给课程地图和三条学习线,再逐章拆开 11 个主题的机制、代价与运行配置,用一个跨章节任务把链路串起来,最后落到国产化路线和分人群的起点建议。
1. 项目概览
教程完全免费,属公益项目,重实践。课程源自交大《自然语言处理前沿技术》(NIS8021)和《人工智能安全技术》(NIS3353),授课教师张倬胜。仓库持续更新——2025 年 6 月新增数学推理、GUI Agent、大模型对齐、隐写术等主题,并与华为昇腾社区联合推出国产化《大模型开发全流程》公益教程(含 PPT、实验手册和视频)。
作者团队由张倬胜主导,袁童鑫(Lordog)、马欣贝、何志威、杜巍、赵皓东、吴宗儒、吴铮、董凌众、张玉龙、费豪(新加坡国立大学)等贡献者参与。
2. 教程内容详解
完整课程地图
11 个主题各有一个入口 Notebook,脚本名即内容定位:
| # | 主题 | 简介 | 脚本 |
|---|---|---|---|
| 1 | 微调与部署 | 预训练模型微调与部署 | dive-tuning.ipynb |
| 2 | 提示学习与思维链 | API 调用与推理 | dive-prompting.ipynb |
| 3 | 知识编辑 | 操控模型对特定知识的记忆 | dive_edit.ipynb |
| 4 | 数学推理 | 蒸馏迷你 R1 模型 | sft_math.ipynb |
| 5 | 模型水印 | 文本水印嵌入与检测 | watermark.ipynb |
| 6 | 越狱攻击 | 理解并防范越狱攻击 | dive-jailbreak.ipynb |
| 7 | 大模型隐写 | 隐写术:隐藏信息传输 | llm_stega.ipynb |
| 8 | 多模态模型 | MLLM 与 AGI 探索 | mllms.ipynb |
| 9 | GUI 智能体 | AI Agent 操作界面 | GUIagent.ipynb |
| 10 | 智能体安全 | 开放场景中的安全威胁 | agent.ipynb |
| 11 | RLHF 安全对齐 | PPO 训练与对齐实验 | RLHF.ipynb |
三条学习线
11 个主题不是必须按顺序啃完的线性教材,可以切成三条线,按目标选线:
- 核心实践线(Ch1–Ch4):微调、提示、知识编辑、数学推理,把「让模型干活」的基础能力走通。
- 安全与对齐线(Ch5–Ch7、Ch11):水印、越狱、隐写、RLHF,理解模型容易被怎样操纵、又该如何约束。
- 多模态与 Agent 线(Ch8–Ch10):MLLM、GUI Agent、智能体安全,看大模型如何感知真实世界并采取行动。
3. 主题一:微调与部署
微调(Fine-tuning)在预训练模型基础上,用特定任务数据进一步训练。为什么主流做法是微调而不是从头训练?因为预训练的成本集中在通用能力的底座上,而大部分业务只需要模型在某个具体任务上表现更好——在已有底座上做增量训练,比重新训练一遍便宜得多,也快得多。
教程用 Transformers 工具包,以「虚假新闻检测」(Kaggle 虚假推文数据集)为完整场景:用 run_classification.py 加载数据、微调 bert-base-uncased,在开发集上验证、测试集上预测,最后用 Gradio Spaces 把模型部署成在线 Demo。
训练脚本的关键参数如下:
python run_classification.py \
--model_name_or_path bert-base-uncased \
--train_file data/train.csv \
--validation_file data/val.csv \
--test_file data/test.csv \
--metric_name accuracy \
--text_column_name "text" \
--label_column_name "target" \
--do_train --do_eval --do_predict \
--max_seq_length 512 \
--per_device_train_batch_size 32 \
--learning_rate 2e-5 \
--num_train_epochs 1 \
--output_dir experiments/教程给了两套工程:解耦可定制版本(main.py、utils_data.py、modeling_bert.py 三文件,方便理解数据加载、模型结构、训练验证三个关键模块)和默认集成版本(直接改超参数调用)。部署环节是 Gradio Spaces:写好 app.py、配好 requirements.txt,上传到 Hugging Face 即可得到一个可分享的 Demo,作者提供了已部署的 text-classification 案例供参考。
轻量化微调(LoRA,低秩适配,Low-Rank Adaptation)在本章是作为延伸学习入口出现的——第 6 节给出对 Llama2 做 LoRA 微调的外部教程链接,属于进阶阅读,不是本章主实验。
4. 主题二:提示学习与思维链
提示(Prompting)是让模型按预期方式输出的最直接手段,也是成本最低的干预方式——不动模型参数,只改输入。教程覆盖零样本、少样本(Few-shot)、思维链(Chain of Thought)、程序思维(PoT)和自洽性采样,并引入 ReAct 这类「推理 + 行动」循环。
思维链的核心是让模型把中间步骤写出来,而不是直接蹦答案。它有效的原因在于:把推理过程显式化之后,模型的中间计算错误更容易被暴露和修正。对比两个提示:
标准提示
问:小明有 5 个苹果,丢了 2 个,又买了 3 个,现在有几个?
答:3 个 # 直接答,容易算错
思维链提示
问:小明有 5 个苹果,丢了 2 个,又买了 3 个,现在有几个?
请逐步推理后再给出答案。
答:5 - 2 = 3,3 + 3 = 6,所以是 6 个。进阶部分把思维链继续延伸:Auto-CoT 自动生成推理链、Sum-CoT 摘要式思维链、CRITIC 让模型结合外部工具校正结果、ReAct 把「推理 + 行动」串成循环。少样本提示则是给出几个输入输出对作为范例,让模型模仿格式。
5. 主题三:知识编辑
知识编辑(Knowledge Editing)的目标是只修改与目标知识相关的参数,不影响模型其他能力,比重训成本低得多。它解决的是「模型里的知识会过时」这个现实问题:与其为一条新事实重新训练,不如定点改参数。教程基于 EasyEdit 统一框架,覆盖四种方法路线:
| 方法类别 | 代表 | 思路 |
|---|---|---|
| 元学习 | MEND | 学习一个「编辑器」,为原权重输出更新量 |
| 定位 + 修改 | ROME / MEMIT | 定位知识存储位置,改写对应参数 |
| 记忆式 | SERAC / T-Patcher | 把新知识存在外部模块,不触碰原参数 |
| 批量编辑 | MEMIT | 一次编辑多条知识(教程的 Batch edit 案例) |
ROME 的调用方式体现了 EasyEdit 框架的统一接口——指定编辑数据,剩下的交给库。教程里的具体目标是:把梅西(Lionel Messi)的职业从足球改成篮球。
from easyeditor import BaseEditor, ROMEHyperParams
hparams = ROMEHyperParams.from_hparams("./hparams/ROME/gpt2-xl.yaml")
editor = BaseEditor.from_hparams(hparams)
prompts = ["Question: What sport does Lionel Messi play? Answer:"]
ground_truth = ["football"]
target_new = ["basketball"]
subject = ["Lionel Messi"]
metrics, edited_model, _ = editor.edit(
prompts=prompts,
ground_truth=ground_truth,
target_new=target_new,
subject=subject,
keep_original_weight=False,
)编辑效果按四个维度评估:可靠性(编辑后的答案是否正确)、通用性(相关改写是否也能触发新知识)、局部性(无关知识是否被误伤)、可移植性(编辑是否影响同一知识在其他上下文中的表达)。这四个维度本身就是知识编辑方法的核心权衡——每次改动都在「改得准」和「不误伤」之间取平衡。
6. 主题四:数学推理
教程提供「蒸馏」思路——从 DeepSeek-R1 这类推理模型收集高质量「问题 + 推理过程 + 答案」数据,用有监督微调(SFT,Supervised Fine-Tuning)把推理能力迁移到小模型。数据用 DeepMath-103K,目标模型是 Qwen2.5-Math-1.5B。
需要澄清的是:这一步用的是 SFT,不是 PPO。RLHF 的 PPO 强化学习是第 11 章的内容,两者解决的问题不同——SFT 让模型学会「照着推理格式输出」,PPO 再用奖励信号进一步调优。先有前者把格式和路径学会,后者才有意义。
from trl import SFTTrainer
from transformers import TrainingArguments
trainer = SFTTrainer(
model="Qwen/Qwen2.5-Math-1.5B",
train_dataset=dataset, # DeepMath-103K 蒸馏数据
dataset_text_field="text",
args=TrainingArguments(output_dir="./mini-r1"),
)
trainer.train()数据格式是「问题 - 推理过程 - 答案」三元组,推理过程是可选的——是否保留取决于下游是否只需要最终答案。蒸馏的价值在这里体现得很清楚:把大模型推理时产出的中间过程当作训练数据,等于把「会推理」的能力压缩进小模型。
7. 主题五:模型水印
文本水印(Text Watermark)在模型生成的内容里嵌入不可见的统计特征,用于证明文本来源——当一段文字需要追溯「是不是某模型生成的」时,水印提供了可验证的证据。
教程实现的是 KGW(Kirchenbauer 等人)统计水印:用密钥把词汇表分成「绿色列表」和「红色列表」,生成时偏向绿色词;检测时统计生成文本中绿色词占比,若相对随机水平显著偏离(z-score 超过阈值),就判定为带水印的模型生成文本。
检测效果在评测集上接近完美(AUC 接近 100%)。需要先说明这个数字在测什么:AUC(ROC 曲线下面积,Area Under the ROC Curve)衡量的是区分度——把「带水印文本」和「不带水印文本」分开的能力,接近 1 表示区分得几乎完全正确。这个高分数反映的是「在已知密钥、未做对抗处理的评测集上」的检测能力,不能推出水印在实际场景中不可破解。水印有明确的鲁棒性边界——改写(paraphrase)和翻译会破坏水印信号,这是水印落地的现实约束。
8. 主题六:越狱攻击
越狱攻击(Jailbreak)绕过大模型的安全机制。正常请求「我如何制作炸弹」会被拒绝,但通过角色扮演、编码绕过、渐进式引导(从无害问题逐步引向敏感话题)、对抗性后缀(添加特殊 token 序列)等手段,可能让模型吐出本应拒绝的内容。
教程基于 EasyJailbreak 框架,覆盖 11 种越狱方法。EasyJailbreak 把越狱过程抽象成四步循环:Selector(选攻击模板)→ Mutator(改写变异)→ Constraint(约束条件)→ Evaluator(评估是否成功)。这个抽象的意义在于:把「攻击」从玄学变成可枚举、可复测的流程,防御方才有可能逐环节设防。需要先说明这套框架能测什么、不能测什么——评估结果反映的是「在给定模板和约束下的攻击成功率」,不直接等于真实网络攻击的成功率,更不说明模型已经防住了未知的越狱手段。理解攻击是做好防御的前提,防御侧同样靠识别对抗性模式、内容过滤和安全对齐来实现。
9. 主题七:大模型隐写
隐写(Steganography)让模型在流畅回答中携带只有指定方才能读取的信息。教程用「霍夫曼编码 + GPT-2 采样」的组合:先把秘密信息编码成比特流,再让模型在 token 采样时按比特流约束挑选,把信息藏进看似正常的文本。解码方用同一套密钥和编码表,就能从文本中完整提取隐藏信息,且表面文本几乎不可感知。
这和主题五的水印是两种思路:水印重在「溯源」,隐写重在「隐蔽传输」。两者的共同点是都在「如何控制模型输出分布」上做文章——一个把信号嵌进统计偏好,一个把信息编进采样路径。
10. 主题八:多模态模型
多模态大语言模型(MLLM,Multimodal Large Language Model)让模型同时理解文本、图像、音频、视频等多种模态。教程以 NExT-GPT 为案例,它用 ImageBind 统一多模态嵌入,接 Vicuna 语言模型做理解,再用扩散模型解码器生成图像、音频、视频,实现「任意模态到任意模态」的转换,训练分三个阶段完成。
教程借此讨论一个判断:多模态是否通向 AGI?答案不是简单的「是」。多模态扩大了感知范围,但「理解」和「生成」之间的语义鸿沟仍然存在,跨模态对齐是当前的主要难点——模型能「看懂」一幅图,不代表它理解图里对象之间的关系,更不代表它能准确生成对应的文字描述。
11. 主题九:GUI 智能体
GUI Agent 让 AI 代替用户操作电脑或手机——用户说「帮我点外卖」,Agent 打开应用、选店、下单,最后返回结果。教程用 Qwen2-VL-7B 视觉语言模型 + OS-Kairos 数据集,构建「看懂截图 + 预测点击位置」的 Agent,通过全量 SFT 训练。
这类模型要同时做视觉理解(界面里有什么)和动作预测(该点哪里),对显存要求高,教程标注的运行配置是 3×80GB A100。这是这套教程里算力门槛最高的一章——没有多卡环境时可以先读懂原理,再决定是否投入资源复现。
12. 主题十:智能体安全
智能体一旦接入工具和外部环境,就多了被操纵的入口——邮件 Agent 被提示注入后可能发出钓鱼邮件。教程引入 R-Judge 评测框架:覆盖 7 大领域、27 种场景,评估 Agent 在开放环境中的风险识别与安全判断能力。
攻击向量包括提示注入、工具劫持、环境投毒、权限滥用。防御侧需要多层安全检查:先做权限校验(这个动作允许吗),再做风险评估(副作用有多大),对破坏性操作留人工确认。安全不是单点防护,而是贯穿工具设计、上下文组织和执行策略的一组约束。
13. 主题十一:RLHF 安全对齐
RLHF(Reinforcement Learning from Human Feedback)用人类反馈训练模型偏好。教程演示基于 PPO(近端策略优化,Proximal Policy Optimization)的完整流程,循环为三步:
| 步骤 | 英文名 | 做什么 |
|---|---|---|
| 1 | Rollout | 用当前策略生成回复 |
| 2 | Evaluation | 奖励模型(教程用 BERT 情感分类器替代人工)打分 |
| 3 | Optimization | 按分数更新策略,KL 正则化约束不偏离原模型太远 |
用 BERT 情感分类器替代人工反馈,是为了让实验可复现——人工标注无法在教程环境里批量复现,用一个可重复打分的代理模型替代,流程就能跑通。加 KL 正则化,是防止对齐过程把模型「训坏」——更新策略时不许走太远,避免模型为了讨好奖励模型而丢掉原有的语言能力和知识。
除了 RLHF,教程还介绍了 DPO(直接偏好优化,不需要奖励模型和 PPO)、RLAIF(用 AI 反馈替代人类反馈)、Constitutional AI(基于准则的对齐)等对齐技术,让读者看到「对齐」不是只有一条路——奖励信号从哪来(人、AI、准则)、优化方式怎么选(RLHF、DPO),都有各自的成本与适用场景。
14. 一次任务如何穿过这套教程
用知识编辑章的真实任务把链路串起来:教程的案例是让模型「记住梅西的职业从足球改成了篮球」。
- 先用主题二学到的提示技巧构造测试数据——
prompts=["Question: What sport does Lionel Messi play? Answer:"]、ground_truth=["football"]、target_new=["basketball"]、subject=["Lionel Messi"]。 - 再用主题三的 EasyEdit + ROME 执行编辑:库自动定位存储该知识的 MLP 层,改写对应参数。
- 然后按四性评估:同一个提示是否答出篮球(可靠性)、换种问法是否仍答对(通用性)、「梅西的国籍是哪」这类无关知识是否不受影响(局部性)。
- 如果这套流程要跑通,需要先掌握主题一的微调环境搭建(transformers 加载模型、GPU 资源),也要会主题二的数据构造方式。
一个章节的任务,横跨了环境、提示、编辑、评估四块能力——这正是「跑通代码」和「看懂论文」的差别:论文讲清了 ROME 的原理,教程则逼着读者把环境、数据、评估串成一条能执行的链路。
15. 国产化:华为昇腾《大模型开发全流程》
教程联合华为昇腾推出《大模型开发全流程》系列课程,覆盖昇腾 910/310 芯片,软件栈为 CANN + MindSpore。课程分三级:
| 级别 | 面向人群 | 内容 |
|---|---|---|
| 初级 | 初学者 | 环境搭建 → 基础模型使用 |
| 中级 | 进阶用户 | 模型训练 → 微调优化 |
| 高级 | 专业开发者 | 分布式训练 → 性能调优 |
学习路径:昇腾社区 → 大模型开发学习专区 → 选择级别 → 学习路径。对想脱离 CUDA 生态、在国产算力上跑通全流程的团队,这条线是现成的参考——它与主干教程互补,主干教程基于主流开源框架,这条线验证同一套流程能否在国产软硬件栈上复现。
16. 谁该用、怎么用、从哪开始
这套教程的定位是「能跑的实验集合」,不是生产级代码。适合三类人:刚入门想动手的学生、需要快速验证某个 LLM 技术点的研究者、想给团队做内部培训的工程师。
- 刚入门:从 Ch1 微调与部署开始,先把环境跑通、把一个模型微调出来,再按三条学习线往下走。
- 做安全对齐方向:直接切到安全与对齐线(Ch5–Ch7、Ch11),水印、越狱、RLHF 三块一次拿齐。
- 做多模态或 Agent 方向:切到多模态与 Agent 线(Ch8–Ch10),注意 Ch9 的 GUI Agent 训练需要多卡大显存,先确认算力再上手。
不建议照着跑的场景:需要生产级性能调优、需要把代码直接搬进业务系统——教程的 notebook 是教学实验,跑通为主,不是发布标准。
17. 常见问题
没有多卡 GPU 能不能学? 大部分主题单卡可以跑通。微调章用的 bert-base-uncased 是轻量模型,单张消费级显卡即可。唯一的硬门槛是 Ch9 的 GUI Agent,标注需要 3×80GB A100,算力不够就先读原理、跳过复现。
这套教程和《动手学深度学习》(D2L)是什么关系? 侧重点不同。D2L 覆盖深度学习的基础方法(神经网络、CNN、RNN 等),这套教程聚焦大模型生命周期的两端——怎么让模型干活、怎么约束模型,二者可以衔接:D2L 打底,这本接大模型专题。
教程代码能直接用于生产吗? 不建议。它是教学实验,参数、数据规模都按「跑得通」设计,不是按「扛得住线上流量」设计。适合用它验证技术点、理解机制,生产方案要另做工程化。
学完能到什么程度? 按目标选线的话,每条线都能跑通至少一个完整实验,并理解该线内概念间的关联。它的目标是建立「能动手」的起点,而不是替代生产工程实践。
怎么判断自己真学会了而不是看懂了? 一个可复现的检验:关掉教程,只凭记忆重写该主题的脚本主体。比如知识编辑章,若能不查笔记写出 ROMEHyperParams 并解释清四个评估维度各自防什么,才算吃透;重写时卡在哪一步,就在哪一步补练。
相关资源
| 资源 | 链接 |
|---|---|
| GitHub | https://github.com/Lordog/dive-into-llms |
| EasyEdit(知识编辑框架) | https://github.com/zjunlp/EasyEdit |
| 昇腾社区 | https://www.hiascend.com/edu/growth/lm-development |
| 课程教师 | 张倬胜 (bcmi.sjtu.edu.cn) |
| 主要贡献者 | 袁童鑫 Lordog |
参与讨论
使用 GitHub 登录。欢迎补充事实、异议与实践。
讨论暂时无法加载。