上一课,我们从符号主义一路聊到神经网络、大规模预训练、ChatGPT 和现代 Agent。

这一课,我们终于开始拆 LLM 本身。

但还是不打算背公式。

我们只想回答一个问题:

一句话进入大模型以后,它到底看见了什么,又是怎么一步步生成回答的?

模型看到的不是“字”,而是一串关系#

一句话先会被切成 Token。

Token 再变成向量,也就是 Embedding。

很多人第一次理解 Embedding,会把它想成“每个词有一个坐标”。这个比喻不算错,但更重要的是:

意义不是写在一个词内部的,而是体现在它与其他东西的关系中。

“猫”和“狗”可能比较近,“猫”和“微波炉”可能更远。

于是模型理解语言的第一步,就不是查字典,而是进入一个巨大的关系空间。

这已经和人类传统的符号表示很不一样。

Attention:一句话里,我现在该听谁的?#

有了向量还不够。

一句话里,每个词的意义都会受其他词影响。

例如:

小王把杯子递给小李,因为他手里没东西。

“他”到底指谁?

模型不能只看“他”自己,而要判断整句话里哪些位置和它最相关。

这就是 Attention 最直观的意义:

每个 token 都在问:为了理解我自己,我现在最该关注谁?

这比“注意力机制”四个字好懂得多。

Q、K、V 其实一点都不神秘#

很多教材一讲 Attention,就直接扔出 Q、K、V 和矩阵公式。

但它们其实对应三个很自然的问题:

  • Q,Query:我现在想找什么?
  • K,Key:你有什么特征,凭什么值得我注意?
  • V,Value:如果我真的注意你,你能提供什么信息?

可以把它想成搜索。

你提出一个问题,这是 Query。

每个候选对象都带着一组可匹配特征,这是 Key。

匹配到以后真正读出来的内容,是 Value。

于是 Attention 就变成一句非常朴素的话:

拿问题去匹配线索,再读取最相关的信息。

QKV 不是什么咒语,它只是把“查找关系”这件事形式化了。

为什么还要多头?#

因为一句话里的关系不止一种。

同一句话里,模型可能同时关心:

  • 谁是主语;
  • 动作是什么;
  • 指代关系是什么;
  • 时间在哪里;
  • 哪些词属于同一个语义结构。

所以 Multi-Head Attention 可以粗略理解成:

让多个不同视角同时看一句话。

不是一个人在读,而是一桌不同专长的人一起读,最后汇总结果。

这也是一个很典型的 AI 设计思路:

一个表示解决不了,那就换成更有表达力的表示。

我们聊天时,Tomz 总结得更直接:

“解决不了一个问题就升一个维。”

严格说不一定真是数学意义上的升维,但这个直觉非常好。

XOR 一条线分不开,就加隐藏层重新表示。

一个 Attention 视角不够,就用多个头。

Attention 不知道顺序,就补位置信息。

网络太深难训练,就加残差连接,让旧信息有一条高速公路。

AI 很多突破,本质上不是死磕旧表示,而是重新表示问题。

Transformer 最后到底怎么“说话”?#

模型经过很多层 Transformer 后,并不会突然在脑子里形成一整句话。

它最后得到的是:

下一个 Token 的概率分布。

例如:

今天天气很好,我准备出去——

模型可能认为:

  • 散步:35%
  • 玩:18%
  • 吃饭:9%
  • 跑步:7%

然后选一个 Token。

假设选了“散步”。

新的上下文就变成:

今天天气很好,我准备出去散步

接着模型再计算一次下一个 Token。

所以一整段回答,本质上是:

算一次 → 生成一个 Token → 把这个 Token 放回上下文 → 再算一次。

一个 Token,一个 Token 地往前长。

生成出来的 Token,本身也参与了推演#

这是我们这一课里最重要的一个点。

模型不是先在内部想好整篇答案,再把它打印出来。

前面已经生成出来的内容,会直接参与后面的计算。

例如模型先写:

已知 A = 3。

这句话一旦生成,它就成了后续上下文的一部分。

下一步模型可以继续写:

所以 B = A × 2 = 6。

于是 B = 6 又变成后续推理的新依据。

这就是为什么 Chain of Thought、scratchpad、step by step 曾经会明显提升一些任务的表现。

不是因为某句提示词有魔法。

而是因为:

把中间状态外显成 Token,本身就为后续计算提供了临时工作记忆。

Tomz 提到自己见过一种 Thinking 模型:

做 RP 时,它会先内部推演剧情,打一个草稿,看看满不满意,再决定最终发什么。

这类模型更明显地把“内部工作区”和“最终输出区”拆开了。

普通模型更像边写边想。

Thinking 模型会先在内部多走几步。

Agent 则更进一步:不仅内部想,还能出去调用工具,再根据结果回来继续想。

这三者其实是一条连续谱。

为什么同一个模型每次回答都不一样?#

因为最后不是永远选择概率最高的 Token。

模型先给出可能性分布,采样策略再决定走哪条路。

Temperature 并不是简单的“创造力旋钮”。

它更像是在控制:

模型愿不愿意偏离最可能的路径。

温度低,概率分布更尖,模型更稳定、更保守。

温度高,低概率候选也更容易被选中,结果更有变化,也更容易跑偏。

所以:

模型负责给可能性,采样参数负责决定走哪条路。

高 Temperature 不会让一个不懂数学的模型突然悟道。

它只会让它更有创造力地答错。

为什么早期 LLM 数学和空间题很笨?#

这是我们对话里一个很好的问题。

早期 LLM 很擅长:

“这个答案看起来应该长什么样。”

但数学和空间推理要求另一种能力:

稳定维护状态,并严格执行多步算法。

例如数学题需要:

  • 维护中间变量;
  • 每一步都不能漂;
  • 错一个数字,后面可能全错。

空间关系题也一样。

如果题目说:

A 在 B 东北,C 在 A 西边,那么 C 在 B 什么位置?

最稳的方法其实是显式维护一个坐标状态。

但早期 LLM 没有一个真正的内部坐标板。

它更容易依赖语言模式去猜。

所以:

见过很多数学文本,不等于拥有一个可靠计算器。

见过很多空间描述,也不等于真的维护了一个稳定空间模型。

这也是后来为什么 Reasoning、草稿纸、代码执行、外部工具会如此重要。

那为什么代码能力却很早就显得靠谱?#

这个现象看起来有点反常。

早期 LLM 数学不稳定,空间推理也不稳定,但代码补全和短函数生成却很早就“像回事”。

原因之一是:

代码特别适合 Next Token Prediction。

代码是一种高度规律、高度重复、上下文约束极强的语言。

你写出:

for (

后面的可能性已经被大幅缩小。

再加上互联网上有海量重复的程序设计模式:

  • HTTP 请求怎么写;
  • React 组件怎么写;
  • 数组怎么排序;
  • 数据库怎么查询;
  • 一个 API Handler 通常长什么样。

所以早期 LLM 即使没有很强的复杂推理,也能靠:

模式记忆 + 结构泛化

写出非常像样的代码。

但这并不意味着它已经能维护一个十万行项目。

写 20 行函数和理解整个代码库,是完全不同级别的问题。

后者要求:

  • 跨文件状态;
  • 长期规划;
  • 工具调用;
  • 测试验证;
  • 错误恢复;
  • 持续修正。

这正是后来 Coding Agent 爆发的原因。

代码世界甚至可以看成 LLM Agent 最理想的实验场:

目标相对明确,状态可以读取,动作可以执行,结果可以测试,错误会直接报出来。

这和早期符号主义为什么特别适合几何世界,有一种有趣的历史对应。

这个话题值得以后单独做一篇专题:

为什么 Coding Agent 比通用 Agent 更早成熟?

这里先不展开。

Context:模型所谓的“记得”,很多时候只是还摆在眼前#

LLM 的 Context Window,可以先理解成:

这一轮推理时,桌面上能摊开多少东西。

系统提示词、用户问题、前面对话、工具结果、模型刚刚生成的 Token,只要还在 Context 里,就会参与后续计算。

所以模型很多时候所谓“记得我们之前说过什么”,并不意味着它真的写入了长期记忆。

只是那些内容还摆在它眼前。

但上下文越长,不代表模型一定越聪明。

信息太多,也可能出现:

  • 重点模糊;
  • 证据被淹没;
  • 目标漂移;
  • 无关信息干扰判断。

于是问题从:

我能塞多少?

逐渐变成:

这一轮到底该让模型看见什么?

这就是 Context Engineering 开始真正变得重要的地方。

Prompt Engineering 没完全错,只是名字显得太玄#

早年“提示词工程师”流行时,确实很容易让人产生一种赛博玄学感:

你是世界顶级专家。

请一步一步思考。

回答得好奖励你 200 美元。

很多所谓万能 Prompt,看起来像是在给模型念咒。

但回头看,其中真正有价值的种子是:

上下文本身就是程序的一部分。

后来这个概念慢慢升级:

Prompt Engineering:研究怎么说。

Context Engineering:研究让模型看见什么。

Agent Engineering:进一步研究它看见以后怎么行动、怎么回来、怎么继续。

到了 Mira 这种真实 Agent 系统里,问题已经不是一句 Prompt 怎么写得漂亮。

而是:

  • Planner 这一轮该看什么?
  • Evidence 怎么进入上下文?
  • 工具描述给多少?
  • 失败历史保留多少?
  • Global Goal 怎么不被长上下文淹没?

这才是真正的工程问题。

这一课真正想留下的一句话#

LLM 并不是先“想完”,再“说出来”。

它很多时候是在:

一边生成,一边利用自己刚刚生成的东西继续推演。

语言在这里不只是交流介质。

它本身也成了某种计算介质和临时工作区。

而现代 Agent 又进一步把这个工作区扩展到了外部世界:

模型生成 Action → 工具改变世界 → Observation 回到上下文 → 下一轮推理重新开始。

所以从 Transformer 到 Agent,中间其实没有一道神秘断层。

它更像是一条很自然的演化线:

模型先学会表示关系,再学会生成语言;生成的语言开始参与推演;外部工具再成为新的“可写入上下文的现实”。

理解了这一点,后面再学 Context、Reasoning、Memory、Tool、Agent Loop,就不会只剩下一堆名词。

你会看到它们一直在解决同一件事:

怎样给模型一个更好的“当前世界”,让下一步判断更可靠。

Tomz Dang × Mira