在人工智能火热的今天,很多开发者虽然能熟练调用 API,甚至能在本地跑起 70B 的模型,但面对"模型是怎么思考的"这个问题,往往觉得像隔了一层迷雾。

你可能听过这样的比喻:LLM 是"电子鹦鹉",是"概率复读机",是"随机并行计算器"。这些比喻都对,但都不完整——更重要的是,它们都没告诉你:这台机器是怎么一步步造出来的,以及为什么非得这么造。

今天这篇文章换一种方式讲。我们不从 Transformer 开始,而是从它的"祖先"开始——从最笨的数数法出发,顺着每一代模型的硬伤追下去,直到你自然而然地推导出 Transformer 的诞生逻辑。读完你会明白:

  1. 为什么"上下文越长,模型越容易犯糊涂"是物理限制而不是玄学;
  2. 为什么同一个问题换个说法,回答质量天差地别;
  3. 当你在调 API 参数或写 Prompt 时,背后到底在拨弄哪根杠杆。

第一章:进化史——从死记硬背到举一反三

理解现代 LLM,最好先看它的"祖先"犯了什么错。每一代模型的诞生,都是为了填补上一代的硬伤。

1.1 N-gram:最聪明的笨办法

语言模型最原始的问题只有一个:给你前面几个词,猜下一个词最可能是什么。

比如看到"我 想 喝 ___“,你大概会猜"水”“咖啡”“茶”,而不会猜"桌子"。

N-gram 的做法简单粗暴:翻遍语料,死记硬背地数数。 它统计"我想喝"后面出现过多少次"水"、多少次"茶",谁出现次数多就猜谁。它背后的理论根基叫马尔可夫假设 (Markov Assumption):当前词只依赖于前面有限个词,而不是全部历史——这是一种工程上迫不得已的"截断",因为历史越长,要统计的组合呈指数增长,数据永远不够用。

这套笨办法有两个致命硬伤:

硬伤一:组合没见过就彻底歇菜(数据稀疏性,Sparsity)。 语料里恰好没出现过"我想喝"这个三词组合?模型直接傻眼,给出概率 0。前文看得越长(N 越大),这种"没见过"的组合就越多,绝大多数合法的句子在语料里压根没出现过。

硬伤二:完全不会举一反三(缺乏泛化能力,Generalization)。 “喝"和"饮用"在 N-gram 眼里是毫不相干的两个符号。哪怕它学过"我想喝水”,也完全无法推出"我想饮用水"也合理。它没有"相似词"这个概念,每个词都是一座孤岛。

1.2 前馈神经网络:给词画一张"坐标地图"

N-gram 的根本缺陷在于:它把每个词当成孤立符号,不知道词与词之间有语义关联。

前馈神经网络语言模型(FFNN LM,2003 年 Bengio 等人提出)的破局思路只有一个聪明想法:把每个词变成一串数字,让意思相近的词,数字也相近。 这串数字就是后来大名鼎鼎的词向量 / 词嵌入 (Word Embedding),背后的理念叫分布式表示 (Distributed Representation)

你可以把它想象成给每个词在一张"地图"上安排一个坐标。“咖啡”“茶”“水"会挤在地图的同一片区域,“桌子"则在很远的地方。有了这张地图,模型就能举一反三——哪怕从没见过"我想喝果汁”,因为"果汁"的坐标紧挨着"水”“茶”,模型能推断:这个位置该填个饮料类的词。N-gram 的硬伤二,就这么被治住了。

那它具体怎么工作?整个网络把"前 n−1 个词"映射成"下一个词在整个词表上的概率分布",数据自底向上流过几层:
在这里插入图片描述
图 1:前馈神经网络语言模型 —— 输入的词查表变向量,过隐藏层做非线性加工,输出层为词表每个词打分,最后 Softmax 归一化成概率。

你可以把整个网络想象成一台带旋钮的计算器

  1. 输入:前面几个词,先各自查出坐标(一串数字);
  2. 计算:计算器把这些数字搅拌、加工一通(隐藏层做非线性变换);
  3. 输出:对词表里每一个词打一个分,分高的就是它觉得最可能的下一个词(Softmax 把分数变成概率)。

训练,就是拧这些旋钮。 一开始旋钮乱设,计算器瞎猜;拿真实句子去考它,猜错了就微调旋钮,让它下次更倾向于猜对。用海量句子反复这样调,调到最后,这台计算器就很会猜了。

这里有个关键细节:那张"词坐标地图"也是在训练过程里一起调出来的。模型在学"怎么猜下一个词"的同时,顺手就把"哪些词意思相近"也摸清楚了——词向量是训练的副产品,而不是预先给定的。

但这一代模型有个和 N-gram 一样的毛病:仍然只能看固定窗口内的前几个词,本质还是马尔可夫假设的束缚。“我昨天在那家新开的店里喝的那杯东西特别……”——要正确接上后文,得记住很前面的主语,固定窗口模型完全够不着。

1.3 RNN:滚雪球式的记忆

RNN(循环神经网络,Recurrent Neural Network)就是冲着"固定窗口"这个毛病来的。

它的核心思想很直觉:像人读文章一样,一个词一个词往下读,边读边在脑子里更新一个"记忆",这个记忆装着迄今为止读到的所有内容的概要。 这个"记忆"有个学名,叫隐藏状态 (Hidden State)
在这里插入图片描述

图 2:RNN 把同一个单元在时间上"摊开"。横向箭头是灵魂——读"想"时,输入不只是"想"这个词,还揉进了上一步的记忆 h₁(装着"我"的信息),合成新记忆 h₂,再往后传。

看这张图要抓住横向那排箭头:记忆像滚雪球一样一路往后传。读到"水"时的记忆 h₄,原则上揉进了"我想喝"全部三个词的信息。这就是它对前馈网络的根本超越——不再死盯固定窗口里的几个词,而是理论上能把任意长的上文都浓缩进当前这个记忆里。还有个巧妙之处:整条链上自始至终用的是同一套旋钮(同一个单元反复使用),所以不管句子多长,要学的参数量是固定的,这也是"循环"二字的由来。

但理论上归理论上,实际上记不住。

记忆每往后传一步,早期词的信号就被稀释一点。传过十几二十步,开头的信息基本被冲淡没了——这个现象叫"梯度消失 (Vanishing Gradient)"。结果就是:句子一长,句首的信息到句尾几乎丢光。

这个硬伤催生了 LSTM / GRU,它们给记忆加了"闸门 (Gate)",能主动决定什么该记牢、什么该忘掉,让重要信息扛得更久。但它们没改变一个根本限制:信息依然是一步一步串行传递的——这意味着无法并行计算,长句子训练极慢,长距离依赖也始终不够稳。

1.4 Transformer:干脆不要"一步步传"了

2017 年,谷歌的论文《Attention Is All You Need》给出了一个彻底的破局思路:

别再"一步步传记忆"了。让句子里每个词直接去看所有其他词。

这个"直接看"的机制就叫注意力 (Attention),是整个 Transformer 架构的灵魂。

“它"想搞清楚自己指代的是"小猫"还是"狗”,不需要像 RNN 那样把记忆从句首一步步传过来(传远了就丢),而是一步到位、直接盯着"小猫"看。任意两个词之间都有一条"直达通道",不管隔多远——RNN 的硬伤就这么被绕开了。

更关键的是工程上的红利:所有词可以同时并行计算,不必等前一个词算完再算下一个,天然适合在 GPU 上大规模铺开。这才是大模型时代得以爆发的物质基础。

至此,进化主线已经清晰:N-gram 死记硬背 → 前馈网络学会用坐标举一反三(但只能看固定窗口)→ RNN 滚动记忆能看变长上文(但记不久)→ Transformer 让每个词直接看所有词(长距离 + 并行两个难题一起解决)。 接下来的章节,我们就钻进 Transformer 内部,看看一句话从输入到吐字,到底经历了什么。


第二章:数据怎么进模型——从文字到向量

在钻进注意力机制之前,得先搞清楚:你输入的那句话,是怎么变成模型能算的数字的。这一步分三小步:切词、查坐标、加位置。

2.1 分词:把文本切成"词元",再编上号

模型不直接读字。它做的第一件事,是把文本切成一块块碎片——每一块叫一个词元 (Token)。这个过程叫分词 (Tokenization)

第一步:怎么切? 切法既不是按字、也不是按词,而是基于统计频率的子词切割 (Subword Tokenization),主流算法是字节对编码 (Byte Pair Encoding, BPE)。它的思路很暴力:在海量语料里统计哪两个相邻碎片最常一起出现,就把它们合并成一个新碎片,如此循环几万次。结果就是——高频的完整词(如 “the”“apple”“深度”)会被合并成一个独立词元;低频的长词,则会被拆成几个更小的碎片。

这个反复合并的过程,最终产出一份固定的清单——词表 (Vocabulary),里面装着模型认识的所有词元,常见规模是 3 万到 20 万个。词表在模型训练之前就构建好了,之后固定不变。

第二步:那"数字 ID"到底从哪来? 关键就在词表这份清单上。词表本质是一个有顺序的列表,每个词元在里面占一行,它所在的行号,就是它的 ID——就这么简单,ID 不是算出来的,是"排座位排出来的"。

举个具体例子,假设词表长这样:

 行号(ID)    词元
   0         <pad>
   ...
   101       "我"
   ...
   2310      "喜欢"
   ...
   8521      "猫"

那么当你输入"我喜欢猫",分词器只做两件事:

  1. 按 BPE 规则把句子切成词元:["我", "喜欢", "猫"]
  2. 去词表里查出每个词元的行号,输出一串整数:[101, 2310, 8521]

所以结论是:ID 就是词元在词表里的行号(索引),分词器的全部工作,就是把一段文本翻译成这样一串整数。 从这一刻起直到最后,模型看到的从来不是文字,而是这串编号。

到这里,分词的机制就讲完了,一句话概括:先切碎,再编号。

理解了这套机制,下面这几个开发者天天踩的坑也就顺理成章了——它们本质上都是"模型按 token 切分、也按 token 计费"带来的副作用:

💡 关于 Token 的几个实用提示

  • 中文比英文费 token。 同样一段意思,中文占用的 token 数常常是英文的 1.5~2 倍,直接影响你的 API 账单和上下文窗口预算。
  • 一个"词"未必是一个 token。 常用词如 “apple” 可能是 1 个 token,而"深度学习"这类组合词可能被切成"深度"/"学习"两个 token;生僻字、随机字符串、emoji 甚至会被打散成多个字节级的 token。所以模型眼里的"长度"是 token 数,不是字数。
  • 代码里的空格、缩进、变量名都是 token。 user_iduserId 在模型眼里是完全不同的切法,会实实在在影响它对代码结构的感知。
  • 数字会被拆开。 “12345” 可能被切成 “12”+“345”,这正是早期模型做算术题总出错的原因之一。

2.2 词嵌入:用 ID 去查一张巨大的坐标表

有了一串 ID,下一步是把每个 ID 变成第一章说的那种"坐标"——一个高维向量 (Vector),通常是 4096 维甚至更高。

靠的是一张巨大的查找表,叫词嵌入矩阵 (Embedding Matrix)。把它想象成一张天文级的 Excel:行数 = 词表大小(比如 5 万行),列数 = 隐藏维度(比如 4096 列)。规则极其简单——第 ID 行的那一整行数字,就是这个词元的向量

所以"把 token 变成向量"这一步,说穿了就是一次按行号取数据:ID=8521 → 翻到矩阵第 8521 行 → 取出这 4096 个数字 → 这就是"猫"的向量。没有任何魔法,就是查表(这也是为什么它叫"嵌入查表")。

那这张表里的数字哪来的?一开始是随机的,然后在训练中和模型一起被慢慢调出来——这正是第一章说的"那张词坐标地图是训练出来的副产品"。调到最后,语义相近的词,它们的行向量在空间里也彼此接近,于是出现了那个经典现象:

vector("国王") − vector("男") + vector("女") ≈ vector("女王")

语义关系,变成了向量的加减法。模型并不知道"猫"是什么,它只知道"猫"这个坐标周围住着"狗"“宠物”"喵"这些邻居——意义是在"邻居关系"中涌现出来的

一个优雅的工程细节:词嵌入矩阵常常和模型最后的输出层"权重共享 (Weight Tying)"。也就是说,“把 token 变成向量"和"把向量变回 token”,用的是同一张表的正反两面。

2.3 位置编码:再给每个词盖一个"位置戳"

到这里还差最后一步。词嵌入只管"这个词是什么",完全不管它排在第几位。同一个"猫"字,出现在句首还是句尾,词嵌入都是同一串数字。

这就埋下一个隐患:第三章会讲到,注意力机制天生把句子看成"一袋词",只算谁和谁匹配,不在乎先后顺序。这样一来,"猫追狗"和"狗追猫"在它眼里就一模一样了,显然不行。

位置编码 (Positional Encoding) 就是来补这个窟窿的:它给"第 0 位"“第 1 位”“第 2 位”……各自也生成一串数字,专门标记位置。然后把"词嵌入"和"位置编码"逐位相加,揉成一串再送进网络:

最终输入 = 词嵌入(我是"猫")+ 位置编码(我在第 0 位)

光说不够直观,我们拿"猫追狗"用一组编造的 4 维迷你向量摆出来看(真实模型是几千维,道理一样):
在这里插入图片描述
图 3:绿色(词嵌入)只看词义、不看位置;黄色(位置编码)只看位置、不看词义;紫色(两者相加)才是真正送进网络的东西,每个词从此既知道"我是什么"又知道"我站在哪"。

这张图里藏着位置编码的全部精髓,看三件事:

  • 绿色只认词义:"猫"的绿色向量 [0.8, 0.2, 0.9, 0.1] 和"狗"的 [0.7, 0.3, 0.8, 0.2] 很接近——因为它俩都是动物,语义相似。绿色部分压根不知道谁前谁后。
  • 黄色只认位置:第 0 位的黄色向量是 [0.0, 1.0, 0.0, 1.0],这串数字只取决于"第 0 位",哪怕把"猫"换成别的词放这儿,黄色还是这串。
  • 相加后就能区分语序了:在"猫追狗"里,“猫"在第 0 位,最终向量是 [0.8, 1.2, 0.9, 1.1];可一旦句子变成"狗追猫”,"猫"跑到第 2 位,要加的是第 2 位的黄色向量,最终向量就完全变了。同一个"猫"字,仅仅因为站的位置不同,送进网络的向量就不一样——注意力于是再也不会把"猫追狗"和"狗追猫"当成同一句话。

位置编码的三代演化:

  • 原始 Transformer 用一组固定的正弦/余弦函数算出来,不需要训练;
  • BERT、早期 GPT 改用可学习的位置编码 (Learned Positional Encoding),把每个位置的数字也当参数,和词嵌入一起训练;
  • 现代大模型主流是 RoPE(旋转位置编码,Rotary Positional Encoding)——不是把位置向量加进去,而是对 Q/K 做旋转变换。RoPE 的优雅之处在于:长上下文扩展(从 4K 到 128K)往往只需调整它的基频参数,不用重训整个模型。

第三章:注意力机制——在信息的海洋里"拉关系"

数据备好了,现在进入 Transformer 的灵魂部件。这一章是全文最精妙、也最值得啃透的部分。

3.1 先建立直觉:每个词直接去看所有词

句子是"小猫困了,它睡着了"。模型读到"它"时,需要搞清楚"它"指的是谁。

注意力的做法是:让"它"同时去看句子里每一个词,并对每个词分配不同的"关注度"。
在这里插入图片描述

图 4:线条越粗 = 注意力越强。“它"几乎把全部注意力放在了"小猫"身上,于是模型就知道"它 = 小猫”。这种跨越任意距离的"直达通道",正是注意力对 RNN 的根本超越。

注意这里和 RNN 的本质区别:RNN 要靠记忆一步步传,传远了就丢;而注意力让"它"一步到位、直接盯着"小猫",中间隔多少个词都无所谓。

3.2 Q / K / V:一场"开会提问"

那"看"这个动作,具体怎么算?这就是注意力最核心的 Query / Key / Value(查询 / 键 / 值) 机制。想象句子里每个词都是会议室里的一个人,每人手上同时备好三样东西:

  • Query(查询,“我在找什么?”):当前词的信息需求。"它"作为代词,它的 Q 大概是:“我在找一个能被我指代的名词,最好是有生命的东西。”
  • Key(键,“我有什么特征?”):每个词挂在胸前的"标签牌"。"小猫"的 K 写着:“我是名词、是动物、是这句话的主语。”
  • Value(值,“我真正的内容”):这个词真正要交出去的"干货信息"。

算注意力的过程就是:"它"拿自己的 Q,去和在场每个词的 K 逐一比对,看谁最匹配。 技术上用点积 (Dot Product) 算相似度——"小猫"的标签牌和"它"的查询高度吻合,得分就高;“困”"了"这些词得分就低。再用 Softmax 把这些得分归一化成一组加起来等于 1 的权重,最后按权重把所有词的 V 加权求和:谁权重大,就多拿谁的干货。

得到的这个混合结果,就成了"它"的新表示(学名叫上下文表示,Contextual Representation),里面已经牢牢揉进了"小猫"的含义。原本孤立的词向量,经过这一层就被语境"染了色"。

你也可以把它类比成一次数据库查询:Q 是 SQL 语句,K 是索引,V 是真实行数据。区别在于这不是"精确匹配",而是"软匹配"——相似度越高,取的 V 就越多。

技术上 Q、K、V 并不神秘:就是把每个词的向量分别乘上三个不同的、可训练的权重矩阵,相当于让每个词"生成自己的三个分身"。另外,为防止点积数值过大导致 Softmax 梯度消失,实际会先除以一个缩放系数 √d(这就是经典的 Scaled Dot-Product Attention)。

3.3 多头注意力:同时派好几拨人去看

真实的 Transformer 不止做一次注意力,而是并行做很多次——多头注意力 (Multi-Head Attention):把 Q/K/V 切成 8 份、32 份甚至 128 份,每一"头"独立算一次注意力,最后把结果拼回来。

可以理解成派出好几拨人,每拨专盯一种关系:

  • 有的头专门追踪语法依存(主谓宾关系);
  • 有的头专门追踪共指消解("它"指代的是哪个名词);
  • 有的头甚至学会关注标点和段落结构。

就像一个评审团,每个评委有自己的关注点,最后综合打分——这样模型一次就能从多个维度捕捉词与词的联系。

3.4 长上下文的诅咒:为什么文章一长模型就"变笨"

注意力有一个绕不开的物理事实:它的计算复杂度是 O(n²)。因为每个词都要和其他所有词两两匹配,上下文从 2K 涨到 200K,计算量就翻了一万倍。

这条物理定律,直接解释了开发者常踩的几个现象:

  • “中间信息丢失”(Lost in the Middle):注意力天然更偏爱文档的开头和结尾,放在长文档正中间的信息最容易被稀释、被忽略。
  • 推理越来越慢:每生成一个新 token,都要和前面所有 token 重算一次注意力。虽然有 KV Cache 缓存历史的 K/V 来省力,但显存占用会随上下文长度线性膨胀。
  • 长文总结会"漂移":上下文越长,注意力权重被摊得越薄,细节越难被精准定位。

所以"把所有资料一股脑塞进 Prompt"并不是最优策略。合理的 RAG(检索增强生成,Retrieval-Augmented Generation) 本质上就是在帮注意力省力——把模型真正需要的那一小段内容,提前筛出来递到嘴边。


第四章:组装成一层,以及知识到底藏在哪

讲完注意力,我们把零件拼成一个完整的 Transformer 层 (Block),再深入看看一个被严重低估的部件:前馈网络。

4.1 把零件拼成一个完整的层

一个 Transformer 层,是按固定顺序把几个组件摞起来的。真正的大模型会把这样的层堆叠几十上百次,一层层把理解逐步加深:
在这里插入图片描述

图 5:一个 Transformer 层的内部 —— 输入(词坐标+位置编码)→ 多头自注意力 → 残差连接+归一化 → 前馈网络 → 残差连接+归一化 → 输出,再堆叠 N 层。

图里有两个还没提过的小组件,顺带说清楚:

  • 残差连接 (Residual Connection):给信息开一条"抄近路"的旁路,让原始输入能直接绕过某一层、加到该层输出上。这样哪怕堆几十层也不会因为太深而"训不动"——它是把网络堆深的关键工程技巧。
  • 归一化 (Normalization):把每层的数值幅度拉回到稳定区间,让训练更平稳,不至于数值爆炸或消失。

而图中间那个前馈网络 (Feed-Forward Network, FFN),作用是在注意力"博采众长"之后,再对每个词的表示单独做一轮深加工。别小看它——下面你会看到,模型的"知识"主要就存在这里。

4.2 前馈网络:模型真正的"小黑屋思考"

很多人误以为注意力是推理的核心。其实更准确的分工是:注意力负责"找资料",FFN 负责"想问题"。

FFN 通常是一个两层的全连接网络,做的事是"升维—激活—降维"三步舞:

  1. 升维:把向量维度瞬间拉升(例如从 4096 维拉到 16384 维);
  2. 非线性激活:过一个非线性激活函数(如 GELU、SwiGLU)。这一步至关重要——没有非线性,再多层 Transformer 叠起来,数学上也只等价于一层线性变换;
  3. 降维:再投影回原来的维度。

这个"先摊开晒太阳、再折叠收起来"的过程,每折叠一次都留下一些经过非线性加工的痕迹。模型在预训练里学到的"如果 A,那么 B"这类逻辑规则,就刻在这些权重里。

4.3 为什么模型会有"常识"?

因为 FFN 占据了模型约 2/3 的参数量。当模型在预训练中读遍整个互联网,它就把那些物理定律、编程语法、历史常识,全部转化成了 FFN 里的权重数值。所谓"模型的知识",物理上就是 FFN 里那一大坨数字。

近年的可解释性 (Interpretability) 研究还发现一个反直觉的事实:FFN 里的神经元不是"一个萝卜一个坑",而是多个概念共享一组神经元——这叫"叠加态 (Superposition)“。研究人员甚至能在某些神经元上找到"金门大桥”“DNA 双螺旋”"Python 的 for 循环"这样具体的触发器。

当你让模型写代码时,并没有某个"Python 模块"整齐地亮起来,而是几十层 FFN 里一大群分散的微小特征同时被激活、竞争、叠加——这就是"涌现 (Emergence)"一词的工程真相。

4.4 MoE:让大象只动一条腿

最新一代大模型普遍采用 MoE(混合专家,Mixture of Experts) 架构:把一个巨大的 FFN 拆成 8 个、64 个甚至 256 个"专家子网",每次推理只激活其中 2 个左右。

好处是:总参数量可以堆到 1T,但每次推理的活跃参数只有 30B 左右。 相当于你雇了 100 个专家,每次只让最相关的 2 个开会,账单只按 2 个人算。GPT-4、DeepSeek-V3、Mixtral 都是这一派的代表。


第五章:解码与采样——模型是怎么"吐字"的

模型最后一层输出的并不是文字,而是词表上每个词的一组分数,叫 logits,经 Softmax 变成一组概率分布。“怎么从这组概率里挑一个词出来”,直接决定了回答的风格——这是很多教程跳过、但开发者必须懂的旋钮。

5.1 Temperature:创造力旋钮

Temperature(温度)的作用,是对概率分布做"拉伸"或"压扁":

  • temperature = 0:永远选概率最高的那个词(贪心解码,Greedy Decoding)。回答最稳定、最可复现,但也最无聊、最容易重复;
  • temperature = 0.7:按概率分布抽样,同时适度拉大高概率词的优势。这是对话场景的常用默认值;
  • temperature = 1.5:分布被"抹平",稀有词也有机会冒头。适合创意写作,但容易"放飞自我"、胡说八道。

5.2 Top-k 与 Top-p:掐掉长尾噪声

  • Top-k:每次只从概率最高的 k 个词里抽;
  • Top-p(核采样,Nucleus Sampling):每次只从累计概率达到 p(比如 0.9)的那一小撮词里抽——是动态大小的候选集,比固定的 Top-k 更灵活。

两者目的相同:掐掉概率长尾里的"噪声词",防止模型突然蹦出一句离谱的话。

5.3 一张调参速查表

任务类型 推荐参数 理由
确定性任务(代码、抽取、分类) temperature=0top_p=1 要稳定、可复现
创意任务(文案、头脑风暴) temperature=0.8~1.0top_p=0.9 要多样性,又不至于失控
调 Prompt 做对比实验 先锁 temperature=0 否则分不清是"改得好"还是"运气好"

第六章:训练三部曲——从"读书"到"做人"

一个能聊天的 LLM,不是一次训练出来的,而是经历了清晰的三段式流水线。

6.1 预训练:把互联网喂进去

预训练 (Pretraining) 的目标只有一个:给定前文,预测下一个词。 用几万亿 token 的数据、成百上千张 H100、花上几个月,把语言规律、世界知识、代码语法、推理模式全部压缩进权重里。

预训练出来的模型叫 基座模型 (Base Model),像一个读完了整个图书馆的孩子:博学,但不会聊天。你问它"你好",它可能接着写"你好,欢迎访问淘宝网……“——因为它只学会了"续写互联网”,还不知道自己该扮演一个有问必答的助手。

6.2 监督微调:教它怎么对话

工程师准备几十万条高质量的"问题—回答"对,让模型学会:看到 <user>...</user> 就该在 <assistant> 里给出一个"像样的助手回答"。这一步叫监督微调 (Supervised Fine-Tuning, SFT),它把基座模型变成了能对话的 Chat Model

SFT 是便宜但关键的一步:数据质量远比数据量重要。 少量高质量的人工标注,胜过海量的爬虫垃圾。

6.3 RLHF:用人类偏好打磨

要让模型更"懂事",还需要对齐 (Alignment),主流做法是 RLHF(基于人类反馈的强化学习,Reinforcement Learning from Human Feedback)

  1. 学生作答:模型对同一个问题给出多个答案;
  2. 老师打分:人类标注员对这些答案排序,用来训练一个"奖励模型 (Reward Model)“,让它学会"人类偏好什么”;
  3. 微调权重:通过强化学习算法(PPO / DPO),修改模型权重,让高分答案的概率变大。

RLHF 之后,模型学会了:简洁、有礼貌、拒绝危险请求、承认自己不知道。但有个副作用叫"对齐税 (Alignment Tax)":模型在某些基准测试上的"纯智力"会略有下降,换来的是更好的可用性和安全性。

6.4 Claude 的不同做法:Constitutional AI

相比纯靠人类逐条打分,Anthropic 引入了 CAI(宪法 AI,Constitutional AI):让一个 AI 依据一套写明的逻辑准则(“宪法”)去监督、修改另一个 AI 的输出,而不是雇几万个人类标注员逐条评判。

这套流程更可扩展、更一致,也让模型的逻辑更稳定,不容易在复杂推理里"崩盘",还更擅长解释"我为什么这么做"。


第七章:推理能力强,到底强在哪里?

我们常说某个模型"推理性强",这背后的工程本质,其实就是前面几章拆过的零件协同得更好:

  1. FFN 算子更丰富:强模型的前馈网络权重分布更精细,能处理更复杂的逻辑分支。就像同样是 Excel,一个只装了 sum/avg,另一个装了几千个自定义函数。
  2. 长程注意力更稳定:即便上下文长达 200K,依然能精准定位几万字前的一个微小约束——这需要位置编码、注意力头、训练数据三方协同。
  3. 隐式思维链:在吐出答案前,信息已经在几十层 Transformer 里完成了多轮"逻辑自洽检查",每一层都在对上一层的中间结果做"二次思考"。
  4. 显式思维链(CoT)的加持:让模型"一步一步想"会显著提升准确率。因为每一步的中间结论都会被写进 KV Cache,变成后续推理可以反复查看的"草稿纸"。

一个反直觉的结论:让模型"输出思考过程"不只是给人看的,它真的能让模型变聪明——因为它把"内心活动"外化成了可被下一步注意力消费的 token。这正是 OpenAI o1、Claude Extended Thinking 这类推理模型 (Reasoning Model) 的底层逻辑:用更多 token,换取更深的推理。


第八章:给开发者的实用备忘

拆解完原理,回到最实际的问题:懂了这些,你在写 Prompt、调 API、做 AI 应用时能少走多少弯路?

8.1 Prompt 编写

  • 把重要指令放在开头或结尾,避开第三章说的"中段盲区";
  • 明确角色、格式、约束,减少模型在 Q/K 匹配时的歧义;
  • 少用否定句(“不要做 X”),多用肯定句(“请做 Y”)。模型对否定天然更弱,因为词向量空间里"做"和"不做"往往只差一个稀疏的反义特征;
  • 给例子比讲道理管用(Few-shot > Zero-shot)。例子会直接参与注意力计算,而抽象规则需要模型自己"脑补";
  • 复杂任务让它一步步想(引导 CoT),别要求它一步到位——这是真能让它变聪明,不是表演。

8.2 参数调优

  • 确定性任务(代码、抽取、分类):temperature=0top_p=1
  • 创意任务(文案、头脑风暴):temperature=0.8~1.0top_p=0.9
  • 长上下文任务:尽量前置关键信息、裁剪无关段落,别迷信"窗口越大越好"。

8.3 应用架构

  • RAG 不是"万能胶",它的本质是"把注意力该找的东西提前递到嘴边"。做好 chunking 和 reranking,往往比换一个更大的模型更立竿见影;
  • Agent 的稳定性 ≈ 单步成功率的 n 次方。一个 5 步的 Agent,单步 90% 成功率,整体只剩 59%。要么缩短链路,要么在关键步骤加校验;
  • 幻觉无法根治,只能隔离。把"模型生成"和"事实校验"拆成两个阶段,用代码、检索、工具调用去兜底,比一味调 Prompt 更可靠。

结语:从黑盒到白盒

从 N-gram 的死记硬背,到前馈网络学会举一反三,到 RNN 的滚雪球记忆,再到 Transformer 让每个词直达所有词——这条演化线索不是历史课,而是每一次迭代都在解决上一代真实存在的硬伤。

当你敲下一个问题、到屏幕上第一个字符跳出来之前,这中间发生的事情是:数千亿个权重在纳秒级时间内,经历了一场从切词编号向量映射,再到关联搜索非线性逻辑加工,最后经过概率采样的数学风暴。

没有魔法,只有矩阵乘法;没有灵魂,只有梯度下降。所谓"涌现",不过是当参数量、数据量、计算量三者同时跨过某个阈值时,量变引发质变的统计奇迹。

但这并不会让 LLM 变得乏味——恰恰相反,当你理解了它的"暴力美学",你会更有分寸地使用它:

  • 知道它为什么在中文长文上会"漂移",所以你会主动做 chunking;
  • 知道它为什么对"不要"这类否定词钝感,所以你会改写 Prompt;
  • 知道它的"常识"其实是 FFN 里的一坨权重,所以你不会轻信它给出的具体数字和引用;
  • 知道它的"推理"需要思维链当脚手架,所以你会耐心引导它一步一步来。

下一次有人再问你"AI 到底是怎么思考的",你可以笑着回答:

它不思考。它只是在几十层 Transformer 里,对着一堆向量做了无数次加权求和。而这,就是我们这个时代最浪漫的暴力美学。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐