简介:这份PPT面向希望系统理解大模型的高校师生、通识课学习者和AI入门读者,围绕“大模型概念、技术与应用实践”梳理人工智能发展简史、人工智能思维、大模型原理与分类、产品生态、行业应用、本地部署及基于大模型的智能体等主题,可用来辅助课程教学、专题科普和个人入门。压缩包内为1个pptx文件,约61.03MB,单文件即较完整地覆盖从概念到AIGC应用实践的讲解脉络,便于按章节查阅和直接用于课堂展示。已有152人学习。内容由厦门大学大数据教学团队整理,结合教材与教学资源展开,既讲清大模型“参数大、数据大、算力需求高”的特点,也延伸到自动内容生成、智能推荐、机器翻译和语义理解等场景,适合读者建立整体认知并据此选择后续实践方向。
1. 大模型为什么会“突然会说话”:从续写下一个词到涌现能力
很多人第一次被大模型震住,是它能把一段没写完的代码补全,还顺手解释每行在干什么。反直觉的地方在于:训练时没人教它“解释代码”,它只被要求做一件事——根据前文预测下一个词。参数规模从亿级推到千亿级之后,这个极简目标开始外溢出翻译、推理、写代码这些没被显式训练的能力,业内把这种现象叫“涌现”。AIGC 之所以能成立,底层不是规则库,而是海量文本被压进权重后形成的概率分布。搞懂这条链路,才能判断一个模型什么时候可靠、什么时候在编。这份来自某高校大数据教学团队的通识资料,正好把概念、技术、应用三段落在了同一条线上。
2. “大”的三重账本:参数、数据与算力如何互相卡脖子
2.1 参数不是越多越聪明:从矩阵形状反推参数量
参数不是抽象名词,它就是模型里那些矩阵的每个格子。一层 Transformer 的主要参数集中在四块:注意力的查询、键、值、输出四个投影矩阵,前馈网络的两层升维与降维矩阵,以及两层归一化的缩放偏置。把这些形状写出来,参数量就能手算,不需要背厂商公布的数字。常见的实现思路是按“层数 × 每层参数量 + 词表嵌入”来估,词表嵌入有时与输出投影共享权重,能省掉一份。
def estimate_params(layers, d_model, d_ff, vocab_size, tied_embedding=True): # 注意力四个投影:Wq、Wk、Wv、Wo,形状都是 d_model × d_model attn = 4 * d_model * d_model # 前馈网络:先升到 d_ff 再降回 d_model ffn = 2 * d_model * d_ff # 两层归一化的缩放与偏置,简化按 4 × d_model 计 norm = 4 * d_model per_layer = attn + ffn + norm # 词表嵌入;若与输出投影共享,只算一份 embed = vocab_size * d_model total = layers * per_layer + (embed if tied_embedding else 2 * embed) return total # 以层数 96、隐藏维 12288、前馈维 49152、词表 10 万估算 params = estimate_params(96, 12288, 49152, 100000) print(f"参数量约 {params / 1e9:.1f} B") # 输出约 176 B,与千亿级模型量级吻合这段代码的价值不在精确到个位,而在于让你看清参数从哪来:隐藏维翻倍,注意力部分按平方增长,前馈部分按线性增长。所以“堆参数”最先撞上的不是算法,而是显存和通信。2020 年前后公开的千亿级模型把参数推到 1750 亿,之后有厂商把数字抬到万亿级,但参数量与能力不是线性关系。缩放定律描述的是损失随参数、数据、算力按幂律下降,边际收益递减得很明显。一个 70 亿参数模型在通用对话上可能不如 700 亿,但在某个垂直分类任务上,经过高质量微调反而更稳,这就是“大”的第一层取舍:参数买的是泛化面,不是每个具体任务的上限。
更隐蔽的一点是参数的有效利用率。混合专家结构把总参数做得很大,但每个 token 只激活其中一部分,账面上是万亿,实际计算量接近千亿。这种设计把“知识容量”和“推理成本”解耦,代价是路由网络容易训练不稳定,负载不均衡时部分专家被闲置。看到参数规模先别激动,要问一句:这是总参数还是激活参数,词表 embedding 有没有算进去,位置编码和归一化是不是被省略了。厂商口径不统一,血泪经验是只信自己按结构复算出来的量级。
2.2 数据配比:被低估的“教科书质量”问题
参数决定容量上限,数据决定这个容量被填成什么样。行业里常提的一个经验比例是每个参数配 20 个 token 左右,但这个数字只在“数据质量足够高”时成立。早期模型用网页抓取语料,去重、过滤、脱敏做不干净,模型会学会一堆模板句和垃圾站点的重复段落,损失曲线看着漂亮,实际生成一塌糊涂。后来大家开始给数据分级:代码、数学、百科、书籍算高价值,论坛和低质网页降权,再用小模型给样本打分做质量筛选。
数据配比是另一层玄学。代码数据能提升结构化推理,但放多了会让自然语言变得生硬;中文数据不足会导致中文事实和语感偏弱,即使词表里全是汉字。常见做法是分阶段训练,前期用大规模混合语料打底,后期用高质量、领域集中的语料做退火,相当于让模型在最后阶段“收心”。这里最容易翻车的是重复训练:同一批高质量数据在后期反复喂,模型会过拟合到这些样本的措辞上,评测分数上去,实际泛化下来。
去重听起来是工程细节,实际直接影响能力。近邻去重做不彻底,模型会把整段原文背下来,遇到相似开头就整段复读,这就是很多“复读机”现象的来源。另一个坑是基准测试题混进训练集,模型不是学会了推理,而是记住了答案,分数虚高,上线就露馅。做数据的人一般会留一份私有评测集,从不出现在训练管线里,哪怕样本少,也能当照妖镜用。
2.3 算力墙与并行切分:通信为什么比计算更贵
训练一个大模型要多少算力,有个粗略公式:总浮点运算量约等于 6 × 参数量 × 训练 token 数。系数 6 来自前向两次乘加和反向四次乘加。按这个公式,千亿参数、万亿 token 的训练量在 10^23 到 10^24 量级,单卡根本跑不完,必须切分到几千张卡上。切分方式决定了瓶颈在哪:数据并行每张卡放一份完整模型、吃不同数据,梯度要全局同步;张量并行把单个矩阵按行或列切开,每层都要通信;流水并行把不同层放到不同卡上,靠微批次填满空泡。
真正拖慢训练的是通信,不是计算。数据并行的全归约操作在千卡规模下会吃掉大量带宽,梯度压缩、异步更新都是为缓解这个瓶颈。张量并行的通信更频繁,通常只在单机内做,跨机做会把互联带宽打满。流水并行的难点是流水线气泡,批次切得不够细,卡就在等。工程上一般三种并行混用,再配合重计算、混合精度、ZeRO 分片来省显存。
def training_memory_tb(params_b, bytes_per_param=16): # Adam + 混合精度训练的粗略占用: # fp16 权重 2B + fp16 梯度 2B + fp32 主权重 4B + 一阶动量 4B + 二阶动量 4B return params_b * bytes_per_param / 1024 print(training_memory_tb(175)) # 约 2.7 TB,尚未计入激活值和通信缓冲这段估算说明一件事:1750 亿参数的模型,光优化器状态和权重就要接近 3 TB 显存,还没算前向激活。激活值可以通过重计算换显存,代价是训练时间增加三成左右。很多团队卡在这里:卡买得起,电费和互联扛不住。于是行业里出现两条路,一条继续堆集群做预训练,另一条在开源权重上做微调、量化、蒸馏,把成本压到业务能承受的范围。后者才是大多数开发者真正会碰到的场景。
算力还决定了一个隐性门槛:实验迭代速度。预训练一次要几周,调参基本靠小规模消融实验外推,经验成分很重。小团队做不了预训练,但可以做数据清洗、领域继续预训练、指令微调,这些环节对算力要求低一个量级,效果却常常比换更大的基座更明显。理解三重账本的互相制约,就不会被“参数越大越好”带偏。
3. 自注意力:一句话里的每个词如何互相“看见”
3.1 Q、K、V 的物理含义:匹配、打分、加权求和
注意力机制常被讲成三个矩阵乘法,但它的直觉很像查字典。每个 token 生成三个向量:查询(Query)代表“我想找什么”,键(Key)代表“我能提供什么特征”,值(Value)代表“我实际携带的信息”。用查询去和所有键做点积,得到一组匹配分数,分数高的位置权重大,最后按权重把各个位置的值加起来。这样“苹果”这个词在“苹果发布了新手机”和“我吃了一个苹果”里,会 attend 到不同的上下文,表征自然分叉。
点积之后要除以维度的平方根,作用是防止维度高时点积数值过大,softmax 之后变成近似 one-hot,梯度几乎消失。因果掩码是另一个关键:训练时模型一次性看到整句,但预测第 i 个词时不能偷看第 i+1 个词,所以要把未来位置的分数置为负无穷。这个掩码保证了训练目标和推理时的自回归行为一致,否则模型会学会抄答案,上线生成时立刻崩。
import numpy as np def attention(Q, K, V, causal_mask=True): d_k = Q.shape[-1] # 查询与所有键做点积,得到匹配分数 scores = Q @ K.swapaxes(-1, -2) / np.sqrt(d_k) if causal_mask: n = scores.shape[-1] # 上三角为未来位置,置为极小值,softmax 后权重归零 mask = np.tril(np.ones((n, n), dtype=bool)) scores = np.where(mask, scores, -1e9) # 减去最大值再做指数,避免数值溢出 weights = np.exp(scores - scores.max(-1, keepdims=True)) weights = weights / weights.sum(-1, keepdims=True) return weights @ V, weights代码里的weights就是可解释性研究的入口:可视化某一层某个头的注意力分布,能看到模型在指代消解、句法依赖上的行为。参数说明上,d_k是每个头的维度,不是模型总维度;causal_mask在训练和增量推理时都要开,只有在做双向编码任务时才关掉。实际框架里还会加 dropout、偏置、输出投影,但核心就是这三步:打分、归一化、加权求和。
3.2 多头与位置编码:让模型同时看语法和语序
单个注意力头只能学一种匹配模式,多头让模型在多个子空间里并行看不同关系。有的头盯着相邻词,有的头跨越长距离找主语,有的头专门处理标点或数字。头数增加会提升表达力,但每个头的维度要相应缩小,否则计算量按头数线性膨胀。常见配置是隐藏维 4096、32 个头、每头 128 维,总计算量和单头全维差不多,表达力却更丰富。
注意力本身对顺序不敏感,打乱词序、只要键值对得上,输出可能差不多。所以必须注入位置信息。早期用正弦位置编码,把位置写成不同频率的三角函数,模型通过线性变换能学到相对位移。后来主流换成旋转位置编码,把查询和键按位置做旋转,点积结果只依赖相对距离,外推到更长上下文时更平滑。这也是长上下文扩展的技术基础:调整旋转底数或做位置插值,就能把训练时的 4K 窗口拉到 32K 甚至更长。
位置编码的坑在于外推不等于理解。窗口拉长后,模型对中间段落的注意力会衰减,开头和结尾的信息更容易被记住,这就是后文要讲的“中间遗失”。另一个细节是词表与位置的交互:中文一个词可能被切成多个 token,位置是 token 级的,不是词级的,所以同样的句子换一种分词方式,注意力分布会变。理解这一点,就不会把 token 数当成字数来估算成本。
3.3 自回归解码:KV Cache、温度与 Top-p 采样
生成阶段是一个 token 一个 token 往外吐。每生成一个新 token,都要拿它当查询,和前面所有 token 的键值做注意力。如果每次都重算前面所有位置的键值,计算量随长度平方增长,所以工程上会把历史键值缓存起来,这就是 KV Cache。缓存让每步只算新 token 的查询和键值,时间复杂度降到线性,代价是显存随上下文长度和批次线性上涨。
def sample_next_token(logits, temperature=0.7, top_p=0.9): # 温度低于 1 会锐化分布,高于 1 会平滑分布 logits = logits / max(temperature, 1e-6) probs = np.exp(logits - logits.max()) probs = probs / probs.sum() # 按概率降序保留累计概率不超过 top_p 的候选,截断长尾 order = np.argsort(-probs) sorted_probs = probs[order] cutoff = np.cumsum(sorted_probs) > top_p sorted_probs[cutoff] = 0.0 sorted_probs = sorted_probs / sorted_probs.sum() return int(np.random.choice(order, p=sorted_probs))温度控制的是分布的陡峭程度,温度趋近 0 等价于贪心解码,输出稳定但容易重复;温度调高会增加多样性,也更容易跑偏。Top-p 是动态截断,按累计概率保留候选集,比固定 Top-k 更适应不同上下文。实际业务里,事实问答用低温加低 Top-p,创意写作用高温,代码生成居中。要注意采样参数不能修复知识错误,模型不知道答案时,降低温度只会让它更自信地编同一个错答案。
KV Cache 的显存账要会算:字节数约等于 2 × 层数 × 头数 × 每头维度 × 序列长度 × 批次 × 数据类型字节数。以 32 层、32 头、每头 128 维、4K 上下文、fp16、批次 1 计算,光缓存就超过 2 GB,批次和长度翻倍会直接把显存吃满。这也解释了为什么长上下文服务贵:贵的不只是计算,还有缓存占用。分组查询注意力让多个查询头共享一组键值头,就是在缓存上做减法,用少量表达力换显存和吞吐。
4. 从预训练到对齐:模型怎么从“接话机器”变成“听话助手”
4.1 下一个 token 预测为什么能压出世界知识
预训练的目标函数简单到令人怀疑:给定前文,最大化下一个正确 token 的对数概率。直觉上这只是学词频,怎么会学出地理、代码、逻辑?一个被广泛接受的解释是“压缩即理解”:要把海量文本的下一词预测做到足够准,模型必须找到文本背后的规律——语法结构、事实关联、因果链条,都是降低预测误差的有效手段。模型没有显式存储知识库,而是把知识分布式地编码在权重里,表现为某种条件概率。
这个目标也埋下了幻觉的根。模型优化的是“像不像人写的下一个词”,不是“真不真”。当训练语料里某个错误说法反复出现,或者问题超出训练分布,模型仍会生成一个概率上通顺的答案,而不是承认不知道。预训练阶段没有任何机制奖励“不确定时闭嘴”,所以对齐阶段才要单独教它拒答、追问、给出来源。
损失函数是交叉熵,训练时对每个位置都算损失,但通常只对回答部分回传梯度,问题部分做掩码。这个细节在微调时尤其重要,否则模型会把提问的风格也学进去。学习率一般用 warmup 加余弦衰减,批次尽量大,梯度裁剪防爆炸。预训练最怕的是损失尖峰,通常靠回滚检查点、降低学习率、清洗异常数据来压住。这些工程细节在通识资料里往往只给结论,真正调过的人才知道一个坏批次能让几天训练白跑。
4.2 SFT、RLHF 与 DPO:三代对齐目标的取舍
预训练出来的是“接话机器”,你给它一句问题,它可能续写更多问题,而不是回答。监督微调(SFT)用人工写的“问题—答案”对,教它对话格式和任务范式。数据量不用很大,几万到几十万条高质量样本就能显著改变行为,但质量比数量关键:标注者不一致、答案啰嗦、格式混乱,模型会全部学过去。SFT 的损失只在答案 token 上计算,问题和padding 要掩掉,这是最常见的实现细节。
SFT 之后是偏好对齐。RLHF 的做法是先训一个奖励模型,让它学会判断哪个回答更好,再用强化学习让策略模型去最大化奖励,同时用 KL 惩罚防止它偏离原模型太远。这套流程效果好,但工程复杂:奖励模型会有偏差,强化学习不稳定,超参敏感。DPO 把这一步化简成直接的偏好损失,不需要显式奖励模型和在线采样,用成对的“ chosen / rejected ”数据就能优化,训练稳定很多,代价是对数据质量更敏感。
import numpy as np def dpo_loss(policy_chosen_logp, policy_rejected_logp, ref_chosen_logp, ref_rejected_logp, beta=0.1): # 策略模型与参考模型的对数概率差,等价于隐式奖励 chosen_reward = beta * (policy_chosen_logp - ref_chosen_logp) rejected_reward = beta * (policy_rejected_logp - ref_rejected_logp) # 让 chosen 的隐式奖励高于 rejected,取负对数似然 gap = chosen_reward - rejected_reward return float(-np.log(1.0 / (1.0 + np.exp(-gap)))) # beta 越大,越强调偏好差距,也越容易过拟合偏好数据 print(dpo_loss(-12.0, -18.0, -12.5, -17.8, beta=0.1))beta控制对参考模型的约束强度,设得太大,模型会为了拉开 chosen 和 rejected 的差距而牺牲语言质量;设得太小,偏好学习几乎不起作用。参考模型一般是 SFT 后的模型,冻结不训练,用来算基准概率。DPO 的局限在于它是离线方法,偏好数据覆盖不到的策略空间学不到,所以很多团队会 SFT、DPO、在线采样交替做。对齐不是一锤子买卖,而是一个反复修正的流程。
4.3 长上下文与 RAG:把外部知识接进推理链路
上下文窗口从 4K 拉到 128K,看起来是纯工程问题,实际牵扯位置编码外推、注意力稀疏化、训练数据长度分布。直接把窗口拉长,模型在长文中间段的表现会明显下降,因为训练时绝大多数样本没这么长,位置编码也没见过这么远的距离。常见做法是先在小窗口训练,再用长文本继续预训练做位置插值,最后用长上下文指令数据微调。
但窗口再长也不等于该把所有资料塞进去。检索增强生成(RAG)的思路是先把文档切块、向量化,查询时召回最相关的几块,拼进提示词。它的优势是知识可更新、可溯源、成本低;劣势是召回不准会直接导致答非所问,切块策略、嵌入模型、重排模型每一环都能翻车。长上下文和 RAG 不是替代关系:窗口负责装下推理所需的上下文,RAG 负责从海量知识里筛出该装的部分。
一个常被忽略的细节是“ lost in the middle ”:把关键信息放在长上下文中间,模型召回率明显低于放在开头或结尾。所以拼提示词时,最相关的证据要放前面,问题重复放后面,中间放次要材料。另一个坑是检索回来的块互相矛盾,模型会挑一个顺眼的信,而不是指出冲突。工程上要么加重排去冲突,要么在提示词里明确要求列出不一致之处。理解这些机制,才知道 RAG 不是“接个向量库就完事”。
5. 排查与避坑:大模型落地最容易翻车的五件事
5.1 幻觉:模型一本正经编造引用的机制根源
现象很典型:问一个冷门事实,模型给出完整答案,还附上作者、年份、期刊,查下去全是编的。原因不在“模型坏”,而在预训练目标只奖励通顺的下一个词,不奖励事实核验;对齐阶段如果没有专门训练拒答,模型遇到知识空白时会用最像答案的模式填坑。检索增强能缓解,但不能根治,因为召回不到或者召回了矛盾材料时,模型仍会自行补全。
解决思路分三层。输入层加约束,要求“只根据给定材料回答,材料没有就说没有”,并把材料放在显眼位置;解码层降低温度、限制生成长度,减少自由发挥;输出层做校验,关键实体回查知识库,或者用第二个模型做一致性检查。对高风险场景,宁可让模型反问问清条件,也不要让它猜。评测时要专门构造“知识盲区”样本,看它会不会承认不知道,这比看它答对多少题更能反映可靠性。
5.2 上下文塞满反而变笨:Lost in the Middle
现象是把整份文档丢进长上下文,模型回答质量反而下降,关键条款被忽略,中间段落像没读到。原因是注意力在长序列上被稀释,位置编码对远距离的区分度下降,训练数据里长文中间段的有效监督也少。批次里多个长样本还会互相挤占缓存,导致实际可用上下文缩水。
解决办法不是继续加大窗口,而是做信息重排:把最相关的段落放到提示词开头,问题在结尾重复一次,中间放支撑材料;长文档先分段摘要,再对摘要做二次问答;必要时用重排模型把召回块按相关性排序,截断到模型真正擅长的长度。验证方法是做消融,把关键句从中间移到开头,看回答是否变化,如果变化明显,说明模型确实没读到中间。
5.3 本地部署的显存陷阱:只算权重不算 KV Cache
现象是 70 亿参数模型量化到 4 比特,权重看起来只占 3.5 GB,结果在 8 GB 显存的卡上仍然爆显存。原因是显存不只装权重,还要装 KV Cache、激活值、框架开销。上下文拉到 8K、批次开到 4,缓存占用可能比权重还大。量化通常只压权重,不压缓存,缓存还是 fp16。
解决时先按公式估算:2 × 层数 × 键值头数 × 每头维度 × 序列长度 × 批次 × 2 字节。键值头数在分组查询注意力下小于查询头数,这是省显存的关键。然后限制上下文和批次,开启分页注意力或卸载部分层到内存,再考虑更激进的量化。部署前用压力测试跑满上下文,别用短提示词测通了就上线,血泪经验是线上第一条长文档请求就会把你打回原形。
5.4 评测集污染:分数虚高背后的数据泄漏
现象是模型在公开基准上分数接近饱和,实际业务一用就错。原因是训练语料从网页抓取,基准题目和答案早就在里面,模型不是学会推理,而是记住答案。改写题目措辞、换数字,分数立刻掉一大截。另一类污染来自微调数据,标注者不小心把测试题抄进了训练集。
排查方法是留一份私有评测集,从不出现在训练管线里,定期用新构造的样本做盲测;对公开基准做改写增强,比如换变量名、换场景、加干扰条件;看错误样本的分布,如果错得离谱而不是接近正确,说明模型根本没掌握任务。评测报告里要写清楚数据来源和去重策略,否则分数没有可比性。
5.5 智能体工具调用死循环:缺少终止状态机
现象是智能体反复调用同一个搜索工具,或者两个工具之间来回横跳,步数烧完也没给出答案。原因是提示词只说了“你可以用工具”,没说“什么时候必须停”;工具返回的是大段非结构化文本,模型无法判断是否已经拿到足够信息;缺少对失败调用的处理策略,报错后模型倾向于重试同一个动作。
解决要把工具调用做成状态机:定义最大步数、每个工具的输入输出 schema、成功与失败的判定条件;工具返回结构化结果,附带“是否命中”“置信度”字段;在循环里加一个反思节点,每几步总结已获得的信息和缺口,缺口为零就强制收束。调试时把完整轨迹打出来,看模型在第几步开始重复,通常问题出在观测信息太长或太模糊,模型抓不住关键字段。
6. 设计取舍:为什么通识教育要先讲边界再讲能力
大模型的能力演示很容易让人兴奋,但真正决定它能不能用的,是对边界的判断。参数规模买的是泛化面,数据质量决定知识密度,算力决定迭代速度,三者互相卡脖子;注意力机制让模型能利用上下文,也让它对位置和长度敏感;预训练目标压出了世界知识,也埋下了幻觉的根;对齐让模型听话,却可能让它过度迎合。这些取舍不是缺陷清单,而是设计约束,理解约束才知道什么场景该用大模型、什么场景该用规则或检索。
放到部署层面,取舍更具体。通用 API 上手快、免运维,但数据出域、成本随调用量线性上涨、版本不可控;本地部署可控、可微调,但要自己扛显存、并发和量化损失。领域微调能提升术语和格式遵守度,却可能牺牲通用能力,数据少时尤其容易过拟合。智能体看起来能自动完成多步任务,实际最考验的是工具设计和终止条件,而不是模型本身有多聪明。
| 维度 | 通用 API | 本地部署 | 领域微调 |
|---|---|---|---|
| 上手成本 | 低 | 高 | 中 |
| 数据可控性 | 弱 | 强 | 强 |
| 单位成本 | 随量上涨 | 前期投入高、边际低 | 训练成本另计 |
| 能力上限 | 取决于厂商 | 取决于基座与硬件 | 垂直任务可能更高 |
| 主要风险 | 版本漂移、数据出域 | 显存与并发、运维 | 过拟合、通用能力回退 |
这份通识资料的价值,不在于把每个公式推到底,而在于把发展脉络、概念体系、技术原理和应用场景放在同一张图上,让刚接触的人先建立坐标系。原始文件是可按页讲解的讲义格式,配有案例和课程视频,适合顺着章节往下读,也适合挑某一节深挖。我在带新人时踩过的坑是:一上来就讲提示词技巧,结果对方不知道模型为什么会编、为什么会忘,出了问题只能靠试。从那以后我每次开讲都先画这条链路——参数、数据、注意力、对齐、评测——再谈怎么用。希望帮到你。
本文还有配套的精品资源,点击获取