<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>LLM 系统原理 on 我在栀南镇的日子</title>
    <link>https://blog.ifcalm.org/posts/llm/</link>
    <description>Recent content in LLM 系统原理 on 我在栀南镇的日子</description>
    <generator>Hugo -- 0.147.7</generator>
    <language>zh-cn</language>
    <lastBuildDate>Wed, 23 Sep 2026 00:00:00 +0000</lastBuildDate>
    <atom:link href="https://blog.ifcalm.org/posts/llm/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>第 1 讲：语言模型要解决的问题——从「猜下一个词」到「理解语言」</title>
      <link>https://blog.ifcalm.org/posts/llm/01-next-token-prediction/</link>
      <pubDate>Wed, 23 Sep 2026 00:00:00 +0000</pubDate>
      <guid>https://blog.ifcalm.org/posts/llm/01-next-token-prediction/</guid>
      <description>为什么「预测下一个词」这个听起来很朴素的任务，做到足够大规模之后会表现得像「理解语言」。从完形填空式的直觉出发，形式化语言模型的目标函数，说明语法、事实、语境消歧为什么会变成这个目标的副产品，以及这个目标函数从一开始就没有承诺什么——这条线索会一路埋到第 29 讲的幻觉。</description>
    </item>
    <item>
      <title>第 2 讲：为什么不是 RNN/LSTM——序列模型的瓶颈</title>
      <link>https://blog.ifcalm.org/posts/llm/02-rnn-limits/</link>
      <pubDate>Wed, 23 Sep 2026 00:00:00 +0000</pubDate>
      <guid>https://blog.ifcalm.org/posts/llm/02-rnn-limits/</guid>
      <description>「猜下一个词」这个任务，第一版靠谱的神经网络实现是循环神经网络（RNN）——把历史压缩进一个不断滚动更新的隐藏状态里。这一讲拆解这个设计的三个结构性瓶颈：固定大小的信息瓶颈、梯度消失导致的长程遗忘、以及顺序依赖导致的无法并行——最后一条才是它真正被淘汰的原因，也是 Transformer 存在的理由。</description>
    </item>
    <item>
      <title>第 3 讲：向量、矩阵与「表示」是什么</title>
      <link>https://blog.ifcalm.org/posts/llm/03-vectors-and-representations/</link>
      <pubDate>Wed, 23 Sep 2026 00:00:00 +0000</pubDate>
      <guid>https://blog.ifcalm.org/posts/llm/03-vectors-and-representations/</guid>
      <description>从「机器只认识数字，怎么处理文字」这个最基本的矛盾出发，讲清楚向量是什么、为什么「意思相近」在数学上等价于「空间中距离近」、点积和余弦相似度怎么算，以及矩阵乘法在这门课里唯一需要记住的直觉：对一整批向量同时做同一种变换。这一讲把第 2 讲被一带而过的「隐藏状态」，第一次钉死成一个具体的数学对象。</description>
    </item>
    <item>
      <title>第 4 讲：概率语言模型——下一个词的分布</title>
      <link>https://blog.ifcalm.org/posts/llm/04-probabilistic-language-models/</link>
      <pubDate>Wed, 23 Sep 2026 00:00:00 +0000</pubDate>
      <guid>https://blog.ifcalm.org/posts/llm/04-probabilistic-language-models/</guid>
      <description>把「语言模型输出一个概率分布」这句话第一次讲透：概率分布是什么、n-gram 怎么靠纯计数估计它、链式法则怎么把「猜一个词」严格地推广成「给整句话的合理程度打分」，以及怎么用困惑度这个指标衡量一个语言模型猜得准不准。最后指出 n-gram 计数表的致命缺陷——数据稀疏——这正是第 5 讲要引入神经网络的理由。</description>
    </item>
    <item>
      <title>第 5 讲：神经网络最小实现——一层、非线性为什么必要</title>
      <link>https://blog.ifcalm.org/posts/llm/05-neural-network-basics/</link>
      <pubDate>Wed, 23 Sep 2026 00:00:00 +0000</pubDate>
      <guid>https://blog.ifcalm.org/posts/llm/05-neural-network-basics/</guid>
      <description>第 4 讲留下一个缺口：用一个函数代替计数表来估计概率，这个函数具体长什么样。这一讲从「一层」的定义讲起——矩阵乘法加一个偏置——用一个可以严格证明的小定理说明：不管叠多少层纯线性变换，能力都不会超过一层；再用 XOR 这个可以手算的反例，展示加一个非线性函数之后，同样的结构第一次能做到线性做不到的事。最后用 softmax 把网络的原始输出，接回第 4 讲要求的「概率分布」。</description>
    </item>
    <item>
      <title>第 6 讲：梯度下降与反向传播——模型怎么「学会」</title>
      <link>https://blog.ifcalm.org/posts/llm/06-gradient-descent-backprop/</link>
      <pubDate>Wed, 23 Sep 2026 00:00:00 +0000</pubDate>
      <guid>https://blog.ifcalm.org/posts/llm/06-gradient-descent-backprop/</guid>
      <description>第 5 讲留下一个悬念：网络的参数目前是随机的、毫无意义。这一讲讲清楚参数怎么被自动调整成正确的值——用损失函数衡量「错得有多离谱」，用梯度下降沿着损失下降最快的方向一步步挪动参数，用反向传播（微积分链式法则，注意不是第 4 讲的概率链式法则）高效算出每一个参数该往哪个方向挪。全程手算一个真实的小网络例子，从前向传播到反向传播，每一步都给出具体数字。</description>
    </item>
    <item>
      <title>第 7 讲：分词——BPE 为什么不按字/词切</title>
      <link>https://blog.ifcalm.org/posts/llm/07-tokenization-bpe/</link>
      <pubDate>Wed, 23 Sep 2026 00:00:00 +0000</pubDate>
      <guid>https://blog.ifcalm.org/posts/llm/07-tokenization-bpe/</guid>
      <description>第 1 讲说「一个 token 约等于一个词」，这一讲要把这句简化拆开。按词切会有词表爆炸和「没见过的词」两个死穴，按字符切会让序列长得离谱、还把组词的负担甩给模型。BPE 是两者之间一个纯数据驱动的折中方案：从最细粒度出发，反复合并语料里最高频的相邻组合，直到词表长到预设大小。全程手算一个从零开始的合并过程，验证这套算法具体在做什么。</description>
    </item>
    <item>
      <title>第 8 讲：词嵌入与位置编码</title>
      <link>https://blog.ifcalm.org/posts/llm/08-embeddings-positional-encoding/</link>
      <pubDate>Wed, 23 Sep 2026 00:00:00 +0000</pubDate>
      <guid>https://blog.ifcalm.org/posts/llm/08-embeddings-positional-encoding/</guid>
      <description>第 7 讲把文字切成了离散的 token 编号，但编号的大小本身毫无意义——第 3 讲说过，模型需要的是向量。这一讲讲清楚 token 编号怎么变成向量（一张可训练的查表矩阵，本质是第 6 讲会训练的参数），以及一个更容易被忽略的问题：自注意力天生分不清顺序，「狗咬人」和「人咬狗」用的是同一组词，必须额外把「位置」编码进向量里，模型才分得清谁在前谁在后。</description>
    </item>
    <item>
      <title>第 9 讲：自注意力——Q/K/V 到底在算什么</title>
      <link>https://blog.ifcalm.org/posts/llm/09-self-attention/</link>
      <pubDate>Wed, 23 Sep 2026 00:00:00 +0000</pubDate>
      <guid>https://blog.ifcalm.org/posts/llm/09-self-attention/</guid>
      <description>这一讲要兑现三笔欠账：第 2 讲说 Transformer 针对性解决了 RNN 的三个瓶颈，第 3 讲说静态向量装不下一词多义，第 8 讲说自注意力天生分不清顺序——三笔账全部在这一讲交割。用图书馆检索的类比讲清楚 Query/Key/Value 三个投影各自在问什么问题，用一个完整可手算的小例子走一遍打分、缩放、softmax、加权求和的全过程，最后正式证明「不加位置编码，自注意力就是在处理一个无序集合」这句话。</description>
    </item>
    <item>
      <title>第 10 讲：多头注意力、前馈层、残差连接与 LayerNorm</title>
      <link>https://blog.ifcalm.org/posts/llm/10-multihead-ffn-layernorm/</link>
      <pubDate>Wed, 23 Sep 2026 00:00:00 +0000</pubDate>
      <guid>https://blog.ifcalm.org/posts/llm/10-multihead-ffn-layernorm/</guid>
      <description>第 9 讲拼出了单组 Q/K/V 的自注意力，但留了三个没解决的问题：一次只有一种「检索视角」；加权平均本质是线性组合，第 5 讲证明过的非线性表达力还没接回来；真把很多层这样的计算堆起来，会不会重新撞上第 6 讲的深度训练难题。这一讲依次补上多头注意力、前馈层、残差连接、LayerNorm，把这些积木拼装成一个完整的「Transformer 模块」——后面所有讲义里反复出现的那个基本单元，到这一讲第一次被完整组装出来。</description>
    </item>
    <item>
      <title>第 11 讲：Decoder-only vs Encoder-Decoder</title>
      <link>https://blog.ifcalm.org/posts/llm/11-decoder-vs-encoder-decoder/</link>
      <pubDate>Wed, 23 Sep 2026 00:00:00 +0000</pubDate>
      <guid>https://blog.ifcalm.org/posts/llm/11-decoder-vs-encoder-decoder/</guid>
      <description>第 9 讲的自注意力默认允许任意位置互相看，但第 1 讲的任务是「预测下一个词」——如果预测第 t+1 个词时能直接看到第 t+1 个词本身，训练时就是在抄答案，推理时更是不可能。这一讲用因果掩码堵上这个漏洞，梳理 Encoder（双向理解）、Decoder-only（自回归生成）、Encoder-Decoder（两者都要）三种宏观架构，并说明为什么今天几乎所有生成式大模型都收敛到了 Decoder-only 这一种。</description>
    </item>
    <item>
      <title>第 12 讲：MoE——参数量和计算量的解耦</title>
      <link>https://blog.ifcalm.org/posts/llm/12-mixture-of-experts/</link>
      <pubDate>Wed, 23 Sep 2026 00:00:00 +0000</pubDate>
      <guid>https://blog.ifcalm.org/posts/llm/12-mixture-of-experts/</guid>
      <description>第 10 讲的前馈层，每次处理一个 token 都要激活它全部的参数——想让模型「知道更多」，就必须让每个 token 的计算成本跟着等比例上涨，两者被死死绑在一起。MoE 把一个前馈层换成一组并行的「专家」，用一个小小的路由器给每个 token 挑出最相关的少数几个专家参与计算，其余专家的参数完全按兵不动。模型的总参数量可以很大，但每个 token 实际付出的计算量只取决于被选中的那几个专家——这一讲用一个可以手算的路由过程，验证这句话具体是怎么做到的。</description>
    </item>
    <item>
      <title>第 13 讲：预训练目标与自监督学习</title>
      <link>https://blog.ifcalm.org/posts/llm/13-pretraining-objective/</link>
      <pubDate>Wed, 23 Sep 2026 00:00:00 +0000</pubDate>
      <guid>https://blog.ifcalm.org/posts/llm/13-pretraining-objective/</guid>
      <description>把第 9–12 讲拼好的 Decoder-only Transformer，和第 6 讲的训练循环放在一起，在海量文本上反复运行——这就是预训练。这一讲正式定义自监督学习和自回归建模这两个从第 1、4 讲起就被预告的术语，并讲清楚一个经常被忽略、却是理解后面推理阶段代价的关键细节：靠着因果掩码和「教师强制」，训练时的前向传播是完全并行的，尽管这个模型骨子里是「自回归」的——为什么生成时却必须一步步来，这个不对称性会在第 21–24 讲反复出现。</description>
    </item>
    <item>
      <title>第 14 讲：数据——规模、质量、去重、合成数据与多阶段训练</title>
      <link>https://blog.ifcalm.org/posts/llm/14-pretraining-data/</link>
      <pubDate>Wed, 23 Sep 2026 00:00:00 +0000</pubDate>
      <guid>https://blog.ifcalm.org/posts/llm/14-pretraining-data/</guid>
      <description>第 13 讲说预训练是在海量文本上跑训练循环，但没说这些文本从哪来、长什么样——这一讲打开这个黑箱。互联网文本质量参差不齐，需要过滤；同一段内容会被大量重复，需要去重；纯天然数据在某些稀缺能力上供给不足，催生了用模型生成训练数据的合成数据；训练不是一次性把所有数据混在一起，而是分阶段、有策略地安排数据配比。核心结论只有一句话：模型的全部知识和倾向，都来自训练数据，没有任何独立于数据之外的信息来源。</description>
    </item>
    <item>
      <title>第 15 讲：Scaling Laws</title>
      <link>https://blog.ifcalm.org/posts/llm/15-scaling-laws/</link>
      <pubDate>Wed, 23 Sep 2026 00:00:00 +0000</pubDate>
      <guid>https://blog.ifcalm.org/posts/llm/15-scaling-laws/</guid>
      <description>第 1 讲留了一个赌注：把「猜下一个词」这件事，用更大的模型、更多的数据、更多的算力去做，会发生什么。这一讲给出定量的回答——损失随参数量、数据量、计算量的增长，遵循一种平滑、可预测的幂律关系，但收益是递减的：每多买一个数量级的资源，买到的是恒定的相对改善，不是恒定的绝对改善。这条规律最大的实际价值，是让研究者能用一系列便宜的小模型实验，提前预测一次昂贵的大规模训练会得到什么效果。</description>
    </item>
    <item>
      <title>第 16 讲：SFT——指令微调</title>
      <link>https://blog.ifcalm.org/posts/llm/16-supervised-finetuning/</link>
      <pubDate>Wed, 23 Sep 2026 00:00:00 +0000</pubDate>
      <guid>https://blog.ifcalm.org/posts/llm/16-supervised-finetuning/</guid>
      <description>预训练只教会模型「续写统计上合理的文本」，没有教会它「像一个助手一样回答问题」——一个刚训练完的基础模型，收到一个问题时，最可能的续写往往不是一个直接的回答。SFT 用人工准备的指令-回答范例，在预训练模型的基础上继续训练——机制和第 13 讲的训练循环完全相同，唯一的区别是数据换成了人工示范，损失只在「助手该说的部分」计算。这一讲把第 11 讲预告的「拼接输入输出、只在输出部分算损失」这套思路，变成具体可操作的做法。</description>
    </item>
    <item>
      <title>第 17 讲：RLHF——原理与代价</title>
      <link>https://blog.ifcalm.org/posts/llm/17-rlhf/</link>
      <pubDate>Wed, 23 Sep 2026 00:00:00 +0000</pubDate>
      <guid>https://blog.ifcalm.org/posts/llm/17-rlhf/</guid>
      <description>第 16 讲的 SFT 只能模仿单一示范，没法表达「这个回答比那个更好」。RLHF 利用一个关键事实：人类写不出满分答案，却能相当稳定地判断两个答案哪个更好。这一讲拆开 RLHF 的三步——收集成对偏好、训练一个给回答打分的奖励模型、用强化学习把模型往高分方向推——手算奖励模型的损失和策略梯度的加权方式，兑现第 6 讲关于「奖励怎么变成梯度」的承诺，最后讲清楚它最大的隐患：模型优化的是奖励模型的打分，不是人类真正想要的东西。</description>
    </item>
    <item>
      <title>第 18 讲：DPO 等更新对齐方法</title>
      <link>https://blog.ifcalm.org/posts/llm/18-dpo/</link>
      <pubDate>Wed, 23 Sep 2026 00:00:00 +0000</pubDate>
      <guid>https://blog.ifcalm.org/posts/llm/18-dpo/</guid>
      <description>第 17 讲的 RLHF 要先训练一个奖励模型，再用强化学习追着它的分数跑，内存里同时塞着好几个大模型，又贵又不稳定。DPO 发现了一个数学上的捷径：RLHF 那个带 KL 绳子的目标，最优解可以直接写出来，把它倒过来代进偏好概率里，奖励模型会被整个消掉——剩下的，是一个只需要当前模型和参考模型、形式上和普通分类损失差不多的式子。这一讲一步步推出这个式子，手算它的损失，然后讲清楚省掉的那两步到底丢掉了什么。</description>
    </item>
    <item>
      <title>第 19 讲：推理模型与 RLVR——测试时计算</title>
      <link>https://blog.ifcalm.org/posts/llm/19-reasoning-models-rlvr/</link>
      <pubDate>Wed, 23 Sep 2026 00:00:00 +0000</pubDate>
      <guid>https://blog.ifcalm.org/posts/llm/19-reasoning-models-rlvr/</guid>
      <description>模型每生成一个 token，做的计算量是固定的——层数就那么多。如果答案必须脱口而出，模型只有一次前向传播的时间来想。推理模型的核心发现是：让模型先写下一长串中间步骤再给答案，等于把「想」的时间拉长，而写下的每一步都会被后面的步骤通过注意力读到，变成一张草稿纸。怎么教会模型写好这张草稿纸？RLVR 回到第 17 讲的强化学习，但把奖励换成可以被程序客观验证的对错。这一讲手算这种训练在一道题上具体怎么分配奖励，并讲清楚一个被称为「测试时计算」的新扩展方向。</description>
    </item>
    <item>
      <title>第 20 讲：对齐解决了什么问题、留下什么隐患</title>
      <link>https://blog.ifcalm.org/posts/llm/20-alignment-tradeoffs/</link>
      <pubDate>Wed, 23 Sep 2026 00:00:00 +0000</pubDate>
      <guid>https://blog.ifcalm.org/posts/llm/20-alignment-tradeoffs/</guid>
      <description>把 SFT、RLHF、DPO、RLVR 四种方法放在一起看，它们有一个共同的数学本质：在预训练模型已有的概率分布上重新分配概率，而不是凭空创造新东西。第 18 讲推出的最优解公式把这件事写得清清楚楚——参考模型给了零概率的回答，乘上多大的奖励都还是零；被压低的回答，概率变小了但没有归零。这一讲用一个四选一的手算例子把这两条后果算出来，再从它们出发，逐条梳理对齐留下的隐患：被压下去的行为可以被重新唤起、输出多样性和校准的损失、迎合，以及「对齐到什么」这个问题本身没有答案。</description>
    </item>
    <item>
      <title>第 21 讲：采样策略——temperature/top-p/top-k</title>
      <link>https://blog.ifcalm.org/posts/llm/21-sampling-strategies/</link>
      <pubDate>Wed, 23 Sep 2026 00:00:00 +0000</pubDate>
      <guid>https://blog.ifcalm.org/posts/llm/21-sampling-strategies/</guid>
      <description>模型每一步输出的是一个概率分布，不是一个词。从分布里挑出一个词，这一步不属于模型，是模型外面一段独立的、不需要训练的小算法——同一个模型，换一种挑法，行为可以判若两人。这一讲从最朴素的「永远挑最大的」讲起，手算它为什么会错过整体概率更高的句子；再看「完全按概率随机抽」为什么几乎一定会抽到奇怪的词；然后讲温度、top-k、top-p 三个旋钮各自在修什么问题。前几讲反复预告的「同一个模型为什么能给出不同回答」，答案就在这一步。</description>
    </item>
    <item>
      <title>第 22 讲：KV Cache、量化、批处理</title>
      <link>https://blog.ifcalm.org/posts/llm/22-kv-cache-quantization/</link>
      <pubDate>Wed, 23 Sep 2026 00:00:00 +0000</pubDate>
      <guid>https://blog.ifcalm.org/posts/llm/22-kv-cache-quantization/</guid>
      <description>生成一段 500 个 token 的回答，要把模型完整跑 500 遍。这一讲讲三件让它变便宜的事：KV Cache 利用因果掩码的一个性质——旧位置永远看不到新来的词，所以它们的 K、V 算一次就可以一直复用；然后揭示逐词生成阶段真正的瓶颈不是算得慢，而是每生成一个词都要把全部权重从显存里读一遍；量化和批处理正是针对这个瓶颈的两种办法，一个让要读的东西变少，一个让读一次服务更多人。全程手算，包括一次 4 位量化，以及一个离群值怎么把它毁掉。</description>
    </item>
    <item>
      <title>第 23 讲：上下文长度——工程瓶颈</title>
      <link>https://blog.ifcalm.org/posts/llm/23-context-length/</link>
      <pubDate>Wed, 23 Sep 2026 00:00:00 +0000</pubDate>
      <guid>https://blog.ifcalm.org/posts/llm/23-context-length/</guid>
      <description>上下文窗口是一个人人都看得到的数字，把它调大看起来只是改个参数。这一讲把前面八讲埋下的伏笔收拢成一个完整的论证：长上下文同时撞上四堵墙——预填充时注意力的平方级计算、解码时随长度线性膨胀并且每一步都要读一遍的 KV Cache、训练时没见过的位置、以及放得进去却用不好。其中前三堵可以靠工程手段推远，最后一堵有一个可以手算的数学原因：softmax 的权重总和固定为 1，候选越多，关键信息分到的越少。最后回到第 2 讲留下的旧账：为了绕开这些墙，固定大小的状态又被请了回来。</description>
    </item>
    <item>
      <title>第 24 讲：测试时计算的代价——延迟与成本</title>
      <link>https://blog.ifcalm.org/posts/llm/24-inference-time-compute-cost/</link>
      <pubDate>Wed, 23 Sep 2026 00:00:00 +0000</pubDate>
      <guid>https://blog.ifcalm.org/posts/llm/24-inference-time-compute-cost/</guid>
      <description>第 19 讲说，回答前多想一会儿能换来更好的结果。这一讲给它开账单：沿用第 22 讲的示意参数，对同一个问题手算三种回答方式——直接回答、先写几千个 token 的推理再回答、并行生成 8 个答案再投票——各自要等多久、花多少、占多少显存。结论有一个反直觉的地方：推理模式的 token 数是直接回答的 21 倍，占用服务器容量却是 250 倍。然后讨论这笔钱什么时候值得花，以及第 15 讲留下的那笔账：训练时最省的模型，为什么往往不是部署时最省的模型。</description>
    </item>
    <item>
      <title>第 25 讲：RAG 原理——模型知道的为什么不够</title>
      <link>https://blog.ifcalm.org/posts/llm/25-rag-principles/</link>
      <pubDate>Wed, 23 Sep 2026 00:00:00 +0000</pubDate>
      <guid>https://blog.ifcalm.org/posts/llm/25-rag-principles/</guid>
      <description>模型的知识存在参数里，而参数里的知识有四个硬伤：会过期、覆盖不到私有资料、对见得少的事实记得模糊、说不出出处。RAG 换了一个存放知识的地方——不指望模型记住，而是在回答之前，先从外部资料里把相关的几段找出来，放进上下文让模型读。这一讲讲清楚为什么「读」比「回忆」可靠得多，用一个四段公司制度的小知识库手算整个检索和拼接过程，再演示检索出错时会发生什么：模型会给出一个有出处、却是错的答案。</description>
    </item>
    <item>
      <title>第 26 讲：Embedding 与向量检索</title>
      <link>https://blog.ifcalm.org/posts/llm/26-embeddings-vector-search/</link>
      <pubDate>Wed, 23 Sep 2026 00:00:00 +0000</pubDate>
      <guid>https://blog.ifcalm.org/posts/llm/26-embeddings-vector-search/</guid>
      <description>第 25 讲的关键词检索比的是字形，「带薪假」和「年假」字面不同就找不到，「年假」和「病假」共享一个「假」字反而被当成相关。这一讲把第 3 讲的「意思相近就是向量接近」从一个词推广到一整段文字：用一个模型把每段文字变成一个向量，检索就变成在空间里找离问题最近的点。讲清楚这种模型是怎么被训练出「意思」的，复用第 25 讲的四段知识库手算检索结果，再算一笔大规模检索的账：一千万段文字，怎么在不逐一比较的前提下找到最近的几个，以及怎么把 30 GB 的向量压到 1 GB。</description>
    </item>
    <item>
      <title>第 27 讲：Function calling——工具调用机制</title>
      <link>https://blog.ifcalm.org/posts/llm/27-function-calling/</link>
      <pubDate>Wed, 23 Sep 2026 00:00:00 +0000</pubDate>
      <guid>https://blog.ifcalm.org/posts/llm/27-function-calling/</guid>
      <description>模型只能生成文字，它从来不会真的调用任何东西。所谓工具调用，是模型生成一段约定格式的文字，由模型外面的程序截获、执行、再把结果写回上下文。这一讲拆开这个循环的四步，复用第 25 讲的制度知识库演示一次完整的调用；讲清楚模型怎么被训练出这种能力——以及为什么训练时绝不能让模型学着写「工具结果」；再用第 11 讲的掩码技巧手算怎么保证生成的调用格式一定合法，最后讲清楚一条原则：能做什么，应该由门外的程序决定，而不是靠模型自觉。</description>
    </item>
    <item>
      <title>第 28 讲：多步推理与规划——ReAct 等范式</title>
      <link>https://blog.ifcalm.org/posts/llm/28-agent-planning-react/</link>
      <pubDate>Wed, 23 Sep 2026 00:00:00 +0000</pubDate>
      <guid>https://blog.ifcalm.org/posts/llm/28-agent-planning-react/</guid>
      <description>第 27 讲讲了一次工具调用。真实的任务常常要连续调用好几次，而且下一步查什么，取决于上一步查到了什么——事先没法把整条路线写好。这一讲把一次调用扩展成一个循环：想一步、做一步、看结果、再想下一步，这种写法叫 ReAct。用第 25 讲那个「先查上级、再查部门、再查标准」的问题手算一条完整的执行轨迹，然后算三笔账：每一步都可能出错，成功率会连乘下降，能否察觉并重试决定了长任务的成败；每一步的结果都堆进上下文，撞上第 23 讲的墙；以及循环什么时候该停，由谁来决定。</description>
    </item>
    <item>
      <title>第 29 讲：幻觉的机制性成因</title>
      <link>https://blog.ifcalm.org/posts/llm/29-hallucination/</link>
      <pubDate>Wed, 23 Sep 2026 00:00:00 +0000</pubDate>
      <guid>https://blog.ifcalm.org/posts/llm/29-hallucination/</guid>
      <description>第 1 讲许下过一个承诺：证明幻觉不是模型坏了，而是目标函数从一开始就只承诺了「看起来合理」。这一讲兑现它。幻觉不是一个原因造成的，这一讲把它拆成五个来源——不知道却必须说、被训练成了爱猜、说出口就收不回、被错误的前提带偏、读到了错的资料——每一个都能追溯到前面某几讲的机制，并尽量手算：一句只赌对了一个关键数字的话，困惑度依然低得像正确答案；在答错不扣分的打分规则下，猜永远比说「不知道」划算。最后讲清楚现有的缓解手段各自能做到哪一步，以及为什么没有一种能根除它。</description>
    </item>
    <item>
      <title>第 30 讲：Prompt injection、越狱</title>
      <link>https://blog.ifcalm.org/posts/llm/30-prompt-injection-jailbreak/</link>
      <pubDate>Wed, 23 Sep 2026 00:00:00 +0000</pubDate>
      <guid>https://blog.ifcalm.org/posts/llm/30-prompt-injection-jailbreak/</guid>
      <description>两类攻击，一个根源。越狱是用户自己想让模型说出对齐压下去的内容；提示注入是第三方把指令藏进模型会读到的网页、邮件、检索文档和工具结果里，受害的是毫不知情的用户。它们共同的根源是：对模型来说，指令和数据走的是同一条通道——一串 token。这一讲用第 20 讲的公式手算，换一个上下文能把一个被压到 0.37% 的回答重新抬到 26%；再用第 24 讲的「至少成功一次」反过来算，一个单次只有 1% 成功率的攻击，换 100 种说法就有 63% 的机会得手。结论是：概率性的防御挡不住反复尝试，真正的保证只能来自门外的程序。</description>
    </item>
    <item>
      <title>第 31 讲：可解释性的现状边界</title>
      <link>https://blog.ifcalm.org/posts/llm/31-interpretability-limits/</link>
      <pubDate>Wed, 23 Sep 2026 00:00:00 +0000</pubDate>
      <guid>https://blog.ifcalm.org/posts/llm/31-interpretability-limits/</guid>
      <description>前面有九讲把同一类问题留给了这一讲：注意力权重算不算模型的推理过程、写下的思考是否忠实、模型内部有没有「我不确定」的痕迹、行为对齐之后我们能不能知道它为什么这样做。这一讲先说清楚为什么难——我们能读到模型内部每一个数字，却看不懂它们；再逐一介绍现在的几类方法：注意力权重为什么会误导（手算两层之后「位置 1」里只剩 56% 来自第 1 个词）、探针怎么在内部找一个方向、为什么必须动手改它才算证据、怎么把叠在一起的概念拆开。最后把九个问题逐条对照现状，并给全课收尾。</description>
    </item>
    <item>
      <title>实验 1：手写反向传播（标量/小型 MLP）</title>
      <link>https://blog.ifcalm.org/posts/llm/70-lab1-backprop/</link>
      <pubDate>Wed, 23 Sep 2026 00:00:00 +0000</pubDate>
      <guid>https://blog.ifcalm.org/posts/llm/70-lab1-backprop/</guid>
      <description>占位中，内容正在编写。</description>
    </item>
    <item>
      <title>实验 2：手写 BPE tokenizer</title>
      <link>https://blog.ifcalm.org/posts/llm/71-lab2-bpe-tokenizer/</link>
      <pubDate>Wed, 23 Sep 2026 00:00:00 +0000</pubDate>
      <guid>https://blog.ifcalm.org/posts/llm/71-lab2-bpe-tokenizer/</guid>
      <description>占位中，内容正在编写。</description>
    </item>
    <item>
      <title>实验 3：手写自注意力机制</title>
      <link>https://blog.ifcalm.org/posts/llm/72-lab3-self-attention/</link>
      <pubDate>Wed, 23 Sep 2026 00:00:00 +0000</pubDate>
      <guid>https://blog.ifcalm.org/posts/llm/72-lab3-self-attention/</guid>
      <description>占位中，内容正在编写。</description>
    </item>
    <item>
      <title>实验 4：mini-Transformer 完整前向传播</title>
      <link>https://blog.ifcalm.org/posts/llm/73-lab4-mini-transformer/</link>
      <pubDate>Wed, 23 Sep 2026 00:00:00 +0000</pubDate>
      <guid>https://blog.ifcalm.org/posts/llm/73-lab4-mini-transformer/</guid>
      <description>占位中，内容正在编写。</description>
    </item>
    <item>
      <title>实验 5：采样策略 &#43; KV cache 模拟</title>
      <link>https://blog.ifcalm.org/posts/llm/74-lab5-sampling-kvcache/</link>
      <pubDate>Wed, 23 Sep 2026 00:00:00 +0000</pubDate>
      <guid>https://blog.ifcalm.org/posts/llm/74-lab5-sampling-kvcache/</guid>
      <description>占位中，内容正在编写。</description>
    </item>
    <item>
      <title>实验 6：mini-RAG（embedding &#43; 余弦检索）</title>
      <link>https://blog.ifcalm.org/posts/llm/75-lab6-mini-rag/</link>
      <pubDate>Wed, 23 Sep 2026 00:00:00 +0000</pubDate>
      <guid>https://blog.ifcalm.org/posts/llm/75-lab6-mini-rag/</guid>
      <description>占位中，内容正在编写。</description>
    </item>
    <item>
      <title>习题集 1：数学、神经网络与 Transformer 架构（第 1–12 讲）</title>
      <link>https://blog.ifcalm.org/posts/llm/80-problem-set-1/</link>
      <pubDate>Wed, 23 Sep 2026 00:00:00 +0000</pubDate>
      <guid>https://blog.ifcalm.org/posts/llm/80-problem-set-1/</guid>
      <description>占位中，内容正在编写。</description>
    </item>
    <item>
      <title>习题集 2：预训练与对齐（第 13–20 讲）</title>
      <link>https://blog.ifcalm.org/posts/llm/81-problem-set-2/</link>
      <pubDate>Wed, 23 Sep 2026 00:00:00 +0000</pubDate>
      <guid>https://blog.ifcalm.org/posts/llm/81-problem-set-2/</guid>
      <description>占位中，内容正在编写。</description>
    </item>
    <item>
      <title>习题集 3：推理与部署（第 21–24 讲）</title>
      <link>https://blog.ifcalm.org/posts/llm/82-problem-set-3/</link>
      <pubDate>Wed, 23 Sep 2026 00:00:00 +0000</pubDate>
      <guid>https://blog.ifcalm.org/posts/llm/82-problem-set-3/</guid>
      <description>占位中，内容正在编写。</description>
    </item>
    <item>
      <title>习题集 4：检索、Agent 与安全（第 25–31 讲）</title>
      <link>https://blog.ifcalm.org/posts/llm/83-problem-set-4/</link>
      <pubDate>Wed, 23 Sep 2026 00:00:00 +0000</pubDate>
      <guid>https://blog.ifcalm.org/posts/llm/83-problem-set-4/</guid>
      <description>占位中，内容正在编写。</description>
    </item>
    <item>
      <title>复习指南</title>
      <link>https://blog.ifcalm.org/posts/llm/90-exam-guide/</link>
      <pubDate>Wed, 23 Sep 2026 00:00:00 +0000</pubDate>
      <guid>https://blog.ifcalm.org/posts/llm/90-exam-guide/</guid>
      <description>占位中，内容正在编写。</description>
    </item>
    <item>
      <title>术语与符号表</title>
      <link>https://blog.ifcalm.org/posts/llm/95-glossary/</link>
      <pubDate>Wed, 23 Sep 2026 00:00:00 +0000</pubDate>
      <guid>https://blog.ifcalm.org/posts/llm/95-glossary/</guid>
      <description>占位中，内容正在编写。</description>
    </item>
    <item>
      <title>参考资料与延伸阅读</title>
      <link>https://blog.ifcalm.org/posts/llm/96-resources/</link>
      <pubDate>Wed, 23 Sep 2026 00:00:00 +0000</pubDate>
      <guid>https://blog.ifcalm.org/posts/llm/96-resources/</guid>
      <description>占位中，内容正在编写。</description>
    </item>
  </channel>
</rss>
