好文集ChatGPT Plus¥119

斯坦福大学 CS329Z「Engineering AI Agents」第二讲 LLMs for Builders:Agent 工程师必修的大模型底层原理

文章目录

部分视频或图片暂未收录,已在正文保留提示;需要时可查看原文。查看原文 ↗

斯坦福大学 CS329Z: Engineering AI Agents

斯坦福大学 2026 秋季新课 CS329Z CS 329Z: Engineering AI Agents** (Lecture 2 LLMs for Builders) **讲义已公开,再看一遍课程三位讲师的背景:

@Diyi_Yang(斯坦福 NLP 教授,人机交互与社会计算方向)

@michaelryan207(DSPy 核心贡献者,自动评估 AutoMetrics 作者)

@jyangballin(SWE-agent / SWE-bench / SWE-smith 作者,软件工程 Agent 领域最重要的研究者之一)

[未转换内容,参见原始 JSON]

我对这门课程的简要介绍可以参考:

嵌入推文(联网查看)

176 页 Lecture2 LLMs for Builders PDF 在这

https://cs329z.stanford.edu/static/slides/lecture02.pdf


Lecture2 LLMs for Builders 深度解读


这节课的定位:为什么 Agent 工程师要懂 LLM 内部机制

课程开篇用一张“LLM 技术栈”全景图(从底层的 GPU Kernel、分布式计算、Scaling Laws,到中层的架构与后训练,再到上层的 Agent 框架、多智能体、Agent 记忆与评测)说明:CS329Z 操作的是这个栈的最高层,但真正优秀的 Agent 工程师必须理解底层,因为模型的每一个架构特性和训练决策,都会向上传导为应用层必须面对的约束。本讲的学习目标写得很明确:

  1. 理解现代 LLM 在训练与推理中的核心设计决策;

  2. 综合理解这些决策如何演变成限制条件,进而影响应用层的使用方式。

这条“设计决策 → 局限 → 应用策略”的因果链,是贯穿整节课的叙事主线。全讲分五部分:语言模型是什么、架构、训练、推理、面向 Agent 的 LLM 使用。

语言模型是什么:从概率分解到解码策略

2.1 自回归概率分解

讲义从一个极简定义出发:语言模型建模的是token 序列出现的概率,而这个概率等于每个 token 在给定前文条件下出现概率的连乘——也就是说,整句话的可能性,是逐个位置“看到前文后猜下一个词”的可能性的乘积。

讲义用 "The class was about agents." 这个例子逐步演示:单独看 "The" 的概率是 0.0377;在 "The" 之后出现 "class" 的概率只有 0.0001;在 "The class" 之后出现 "was" 的概率是 0.0344……一路连乘到最后,得到 1.2e-17 这样一个极小的数。由此引出一个工程细节:实践中用“对数概率求和”代替“概率连乘”,避免浮点数下溢,这是数值稳定性的经典处理。

2.2 生成式与判别式的区别

一个课堂知识检查点带出概念区分:判别式模型学习区分类别(如逻辑回归、SVM),生成式模型学习数据本身的分布(如扩散模型)。语言模型建模的是完整的序列分布,因此属于生成式,这带来一个关键推论:我们可以从模型中采样。这个性质是后面所有解码策略、以及“同一模型用不同温度适配不同任务”的理论根基。

2.3 解码与采样策略

模型在每个位置输出整个词表上的概率分布,例如 "The class was about" 之后:"to" 的概率是 0.3171,"as" 是 0.0491,"the" 是 0.036……接下来的问题是:必须永远选概率最高的 token 吗? 答案是否定的,主要策略包括:

  • Greedy(贪心):永远取最高概率,确定但容易重复、单调;

  • Top-k:只在前 k 个候选中采样;

  • Nucleus / Top-p:把候选按概率从高到低累加,只在累积概率达到 p 的最小集合中采样,集合大小随分布形状自适应;

  • Temperature(温度):把各个候选的概率先除以温度 T 再重新归一化,T 小于 1 时分布更“尖锐”(更确定),大于 1 时更“平坦”(更多样);

  • Beam Search(束搜索):同时维护多条候选序列择优,代价是更高的时间和显存开销。

讲义强调的取舍逻辑很有工程味道:数学和代码任务本质上是可预测的,适合低温度;创意写作受益于高多样性;策略选择还受预算约束(束搜索的计算和显存成本更高)。

架构:从 RNN 到 Transformer 再到线性注意力

这是全讲篇幅最重的部分(60 页 PPT!),采用逐步动画式拆解,一层层“长出”完整的 decoder-only Transformer。

3.1 历史脉络与 Transformer 的核心优势

简史:N-gram(2010 年前)→ 首个神经语言模型(2003)→ RNN 语言模型(2010)→ LSTM(1997 年发明、2014 年在语言建模中流行)→ Transformer(2017 年《Attention Is All You Need》)。

讲义引用原论文的对比表指出 Transformer 胜出的两个根本原因:

  • 顺序操作数是常数级:RNN 必须逐 token 串行处理,而注意力可以全部并行,这对 GPU 上的并行训练是决定性的;

  • 每层计算量随序列长度呈平方增长:这是代价,长上下文变得昂贵。

这一对“并行性 vs. 平方复杂度”的矛盾,正是后面线性注意力部分要解决的张力。

3.2 Decoder-only 结构的逐步解剖

讲义用 "The class was about" 一路演示,讲解顺序是:

  1. 嵌入层:每个 token 转为向量(token embedding),再与位置信息(positional embedding)相加,讲义特意注明“这里如果跟不上,后面会很难”,是全讲要求精读的部分;

  2. 注意力层:输入经过三个投影矩阵(W_Q、W_K、W_V)分别得到查询 Q、键 K、值 V;计算 Q 与 K 的乘积衡量相关性;施加因果掩码(每个位置只能“看见”前文);按键的维度开方做缩放以稳定数值;经过 Softmax 变成权重;用这些权重对 V 加权求和;最后经输出投影矩阵 W_O 映射回模型维度;

  3. 残差连接与 LayerNorm:注意力的输出与输入相加(残差),再归一化,保证深层网络可训练;

  4. 多头注意力:同时维护多组独立的 Q/K/V 投影,各自做注意力后拼接,再经过一个更大的投影矩阵,讲义用三步总结:多组权重矩阵、拼接注意力输出、更大的投影矩阵;

  5. 一个完整的 Transformer Block = 多头因果自注意力 + 前馈层(FFN),整体堆叠 N 次,末端接 LayerNorm 和 LM Head,最终经 Softmax 得到整个词表上的概率分布。

3.3 线性注意力:把注意力变成 RNN 式的递归状态

这是本讲架构部分最有“当下感”的内容(素材来自 Songlin Yang 的 DeltaNet 系列讲解)。核心推导链非常清晰:

  1. 去掉 Softmax:Softmax 是注意力计算中非线性的来源;去掉后整个表达式变成纯线性代数;

  2. 改变运算的结合顺序:标准注意力是“先算 token 之间的注意力矩阵、再加权求和”,其中注意力矩阵的大小随序列长度平方增长;既然都是线性运算,可以改为先算 K 和 V 的乘积(一个固定大小的小矩阵)——计算量从随序列平方增长降为线性增长;

  3. 得到递归更新规则:K 与 V 的乘积是一个固定大小的状态矩阵,每个新 token 只需用当前状态做一次查询并更新状态(S₁ → S₂ → S₃……),还可以在更新时“清除不重要的记忆”(DeltaNet 的门控思想)。

这样一来,线性注意力 Transformer 本质上就是一个 RNN,这也是引文 "Transformers are RNNs" 的含义。讲义随后给出诚实的对比:

全 Softmax 注意力线性注意力
随序列长度的计算量平方级线性
依赖回溯所有 token 可直接回溯所有前文,利于长上下文新 token 只与压缩后的状态交互,长上下文更吃力
内存KV Cache 随上下文线性增长状态表示是常数内存

实证部分引了两条:线性注意力在速度和内存占用上大幅领先("Transformers are RNNs" 论文),但在 RULER 这类长上下文基准上表现更弱,压缩状态不可避免地丢信息。工程界的实际解法是混合架构:全局注意力层与线性注意力层交错堆叠,讲义举了 Kimi K3(多头潜在注意力 + 线性注意力混合)作为前沿实例。

另一个常被误解的点也被澄清:上下文长度并非注意力机制本身的硬约束,真正的限制来自位置编码,模型需要学会“使用”训练时见过的位置信息,因此实际上限是训练时采用的上下文长度。

3.4 对 Agent 工程师的意义

讲义在此处明确点了题:Agent 天然面对超长上下文(工具调用结果、历史消息不断累积);推理效率是 Agent 系统的设计变量;理解架构才能为自己的应用选对模型;围绕特定模型的优劣势去设计 harness 和 scaffolding,才能成为更好的 Agent 工程师。

训练:损失函数与三段式训练管线

4.1 交叉熵损失

同样用具体例子讲透:训练数据 "The class was about how agents work…",模型在 "about" 之后给 "how" 分配的概率是 0.0124,则该位置的损失就是 0.0124 的负对数,约等于 1.907。一般化地说:对词表中每个候选 token,真实数据的下一个 token 标记为 1、其余为 0,损失就是“真实 token 的对数概率取负”。训练目标就是让真实数据的下一个 token 获得更高概率。

4.2 Pretraining(预训练)

数据管线:原始网页 HTML → 文本抽取 → 去重 → 语言识别 → 规则过滤 → 质量过滤 → 最终训练数据。讲义展示了 DCLM 的真实数据样本(论坛闲聊、菜谱、Fortran 文档手册),直观呈现“网络数据质量参差”的现实;引用 DataComp-LM、Nemotron-CC-Math、The Pile 等工作说明数据质量与配比(data mixing)是预训练的核心变量。

4.3 Midtraining(中期训练)

这是较新的概念:在预训练后期把数据配比向目标域倾斜(数学、代码等),作为预训练与后训练之间的过渡。一个反直觉但重要的发现("The Finetuner's Fallacy"):把目标域数据直接混进预训练阶段,往往比留到微调阶段再喂效果更好。

4.4 Posttraining(后训练)

路线依次展开:

  • 指令微调(引用 Flan 系列):让基础模型学会遵循指令;

  • 人类偏好学习(InstructGPT / RLHF):用人类反馈对齐模型;

  • 人类反馈的问题:标注者不可靠、偏好因人而异、会诱导不良优化目标(谄媚性 sycophancy、过度自信的口吻)、数据来源可能存在伦理问题,这为 RLVR 埋下伏笔;

  • RLVR(可验证奖励的强化学习):把奖励变成可机械验证的信号,单元测试、Lean 证明、精确匹配、系统状态等。对数学和代码尤其有效(引用 DeepSeekMath),但讲义提醒验证器本身的设计需要谨慎(验证器有漏洞就会被模型钻空子);

  • Agent 专属训练:以 SWE-Smith 为例,通过大规模合成软件工程任务数据,专门训练模型做 Agent 任务,说明“为 Agent 而训练”已成为独立的后训练方向。

推理:Prefill/Decode、投机解码与推理时扩展

5.1 Prefill 与 Decode 两个阶段

这是理解 LLM 推理性能的基础二分:

  • Prefill(预填充):一次性并行处理整段 prompt,计算密集(compute-bound),GPU 利用率高,在 Roofline 模型中靠近算力屋顶;

  • Decode(解码):逐 token 生成,每步只处理一个 token,访存密集(memory-bound),受限于显存带宽,算力大量闲置。

讲义先用 GPU 硬件基础(CUDA 核心、SIMT)和 Roofline 性能模型铺垫“算力 vs. 带宽”两种瓶颈的区分,再回到 LLM 场景解释为什么两个阶段负载特性截然不同。这个区分直接解释了生产中的很多现象(如 prefill 与 decode 分离调度、首 token 延迟与逐 token 延迟两种指标)。

5.2 KV Cache

讲义动画演示:解码每一步只需计算新 token 的查询 Q,与缓存下来的历史 K、V 做注意力,这就是 KV Cache。代价是缓存随上下文长度线性增长,这也是后面“上下文工程”部分一条建议的伏笔。

5.3 投机解码(Speculative Decoding)

思路:用一个小型 draft model 快速草拟多个 token,再由目标模型一次性并行验证,接受正确的、拒绝错误的。讲义点出其适用边界:有些领域比其他领域更可预测,可预测性越高,草稿接受率越高,加速越明显。

5.4 推理时扩展(Inference-Time / Test-Time Scaling)

这部分把“用推理时算力换准确率”的家族方法串了起来:

  • Chain-of-Thought:让模型显式生成中间推理步骤;

  • 推理型 LLM:用夹克价格问题(先涨价 25% 再打 75 折)对比传统 LLM 的直觉式错误答案与推理 LLM 的自我纠错过程(先得出 80 美元的错误直觉,再自我质疑基数不同,最后修正为 75 美元);

  • 控制推理力度:这是非常前沿的工程话题,讲义给了三个实例,GPT-OSS 通过 system prompt 直接设定低/中/高的推理档位;Inkling(Thinking Machines)用一个 λ 参数控制思考预算,λ 越高努力越低;Kimi K3 把奖励设计为“答对 +1、答错 0、答错且超出预算 −1”,让模型学会在预算内解题,并配合多教师蒸馏(不同推理力度的老师教同一个学生);

  • 重复采样扩展(Large Language Monkeys):同一问题采样多次,有验证器时取通过者,覆盖率随采样数大幅上升;

  • Self-Consistency(自一致性):没有验证器时的替代方案,采样多条推理路径,对最终答案做多数投票。

这一节对 Agent 工程的隐含意义很直接:Agent 的每一步都在花推理算力,选择模型和推理力度是一个成本-质量权衡问题,而不是单纯追求最强模型。

LLM for Agents:结构化 I/O 与上下文工程

最后把前面所有原理收束到 Agent 开发的两个核心实践问题。

6.1 结构化 I/O(Structured I/O)

现代 AI 系统是复合系统(引用 BAIR 的 Compound AI Systems 博客):LLM 只是流水线中的一个组件,组件之间需要共享的通信契约。实现手段从强到弱:

  • 约束解码(Constrained Decoding):在解码层面强制输出符合特定结构。SGLang 用有限状态机控制解码轨迹,使输出必然符合语法——这是最强的保证;

  • DSPy Signatures:声明式地定义输入/输出字段(含类型约束,比如 intent 字段只能取 meeting、intro、follow-up 三值之一),框架据此自动生成结构化提示,讲义展示了一个完整的提示词内部构造样例;

  • 分类器头:不走生成路径,直接在嵌入向量上训练小型分类头映射到标签,快且便宜,适合固定决策;

  • System One Models:讲义将其描述为当下流行的一类“带可选项的分类器”,用于快速决策。

工具调用(tool calling)被作为典型应用带过(引用 Toolformer)。

6.2 上下文工程(Context Engineering)

引用 Anthropic 的上下文工程文章,问题定义:Agent 的上下文里放什么? 候选内容包括系统提示、消息历史、记忆、工具调用结果、附件文件。

为什么不全部放进去?Context Rot(上下文腐化):引用 OOLONG 的评测,上下文越长、越杂,模型的推理与聚合能力会退化。讲义随后给出五条非常实操的建议:

  1. 避免膨胀:有时几个工具就够了,Pi 只有 read、write、edit、bash 四个工具;用检索找回最相关的记忆和文件,而不是全量塞入(下节课讲 RAG);

  2. 顺序追加、避免使 KV Cache 失效:这是本讲架构知识直接变现的一条,如果在上下文中间插入内容,其后所有 token 的位置信息都变了,KV Cache 整体作废,必须重算整个 prefill,代价巨大。因此应只做追加式的上下文更新;

  3. 用评测实证上下文决策:搭建 benchmark/eval,用数据检验每次上下文改动(HW1 会实践);

  4. 压缩(Compaction):上下文过长时的两难,保留太多很快又要再压缩,删掉太多可能丢失完成任务所需的关键信息;

  5. 递归语言模型(RLMs):一种不同哲学的方案,不维护单一长上下文,而是让模型递归地总结、折叠上下文,类似人类只保留工作记忆中最重要的部分。

总体评价与核心收获

内容设计:这堂课的选题和裁剪体现了明确的受众意识。它不是又一门 Transformer 入门课,注意力机制的动画拆解只占必要篇幅,重心放在三处与 Agent 工程强相关的内容上:线性注意力等高效架构(因为 Agent 上下文极长)、推理时扩展与推理力度控制(因为 Agent 的算力成本敏感)、结构化 I/O 与上下文工程(因为这是 Agent harness 的直接组成)。讲义引用了大量 2024–2026 年的前沿工作(RLVR、SWE-Smith、Midtraining、Kimi K3、OOLONG、RLMs 等),保持了与业界最新实践同步。

最值得记住的因果链(也是全讲的思维骨架):

  • 自回归分解 + 生成式 → 解码策略是一门工程学问(温度/Top-p 按任务选);

  • 注意力可并行 → GPU 并行训练可行;平方复杂度 → 长上下文昂贵 → 线性注意力与混合架构 → 模型选型依据;

  • 训练数据管线与配比(预训练/中期训练/后训练/RLVR)→ 决定了模型“会什么”,以及谄媚性等行为缺陷的来源;

  • Prefill 受算力限制、Decode 受带宽限制,加上 KV Cache 的存在 → 解释了生产中一切延迟与吞吐现象,也解释了“为什么上下文只能追加、不能中间插入”;

  • Context Rot → 上下文不是越多越好 → 上下文工程(检索、压缩、递归)成为 Agent 的核心技能。

全文完
查看原文