Skip to content

大模型是怎么工作的 ​

核心心智模型 ​

大模型的本质:根据前文,预测下一个 token 的概率分布,采样一个,追加到前文,重复。 所有能力——对话、写代码、调用工具——都是这个简单循环的涌现结果。

先用一个小例子把它想象清楚:你输入“今天下雨,记得带”,模型并不是脑中先写好整句答案,而是先判断下一个 token 更像“伞”还是“外套”;选出“伞”后,再根据“今天下雨,记得带伞”继续猜下一个 token。每一步都只向前走一小格,最后才拼成完整句子。这个例子也解释了为什么模型会在前文有歧义时走错方向:第一步选错,后面会沿着错误的路继续写。

一个大模型由哪些部分构成 ​

上面的"预测下一个 token"是行为,这一节拆开看它是用什么零件搭出来的。 现代主流大模型(GPT、Claude、Llama、DeepSeek 等)几乎都是 decoder-only Transformer 架构, 数据从输入到输出会流经下面这条固定管线:

输入文本
  │
  ▼
① 分词器 Tokenizer      文本 → 一串 token id(整数)
  │
  ▼
② 嵌入层 Embedding       每个 id → 一个高维向量
  + 位置编码             叠加"这是第几个"的位置信息
  │
  ▼
③ Transformer 层 × N     自注意力 + 前馈网络,堆几十到上百层
  │                       每个 token 的向量被反复"提炼",融入上下文
  ▼
④ 输出层 LM Head         最后一层向量 → 词表大小的分数(logits)
  │
  ▼
⑤ Softmax               分数 → 概率分布(所有候选 token 加起来 = 1)
  │
  ▼
⑥ 采样 Sampling          按概率挑一个 token(temperature/top_p 在这一步起作用)
  │
  └──► 追加到输入末尾,回到 ①,循环,直到生成结束标记

逐个部件看它是什么、干什么、和你后面开发有什么关系:

① 分词器(Tokenizer)—— 模型门口的翻译官 ​

  • 是什么:不是神经网络,是一段独立的预处理程序。用 BPE/BBPE 算法把文本切成 token 并转成整数 id(以及反向把 id 转回文本),词表通常几万到十几万个。
  • 作用:模型内部永远看不到"字",只看到 id。它是文本世界和数字世界的边界。
  • 和你的关系:token 怎么切直接决定计费粒度(API 按 token 收费),也解释了模型为什么有时数不清字符、拼错单词——因为它看到的是"块",不是字母。

② 嵌入层(Embedding)—— 把 token 变成向量 ​

  • 是什么:一张巨大的查找表,形状 = 词表大小 × 隐藏维度(hidden size,如 4096)。
  • 作用:把每个离散的 token id 换成一个几千维的连续向量,模型才能对它做数学运算。含义相近的 token,向量也相近。
  • **隐藏维度(hidden size)**是贯穿全模型的"数据带宽",维度越大,每个 token 能携带的信息越多,参数量也越大。

③ 位置编码(Positional Encoding)—— 告诉模型谁先谁后 ​

  • 为什么需要:注意力机制本身不区分顺序(对它来说"我打你"和"你打我"没差别),必须额外注入位置信息。
  • 主流做法:RoPE(旋转位置编码)。它还决定了上下文窗口能不能"外推"到比训练时更长——这是长上下文模型的技术关键之一。

④ Transformer 层(Decoder Block)× N —— 模型主体,90%+ 的参数在这 ​

每一层内部有两个核心子模块,配两个稳定器:

  • 自注意力(Self-Attention) —— ⭐ 最核心的机制
    • 作用:让序列里每个 token 去"看"其他 token,按相关性加权汇聚信息(靠 Query / Key / Value 三组向量算相关度)。模型理解指代、依赖、上下文关系全靠它。
    • 因果掩码(causal mask):因为是逐字生成,只允许每个 token 看它前面的,看不到后面的(否则就"作弊"了)。
    • 多头(multi-head):多个注意力并行,各看一个角度(有的头管语法、有的管指代)。
    • 代价:注意力计算量随序列长度平方级增长——这就是"上下文越长、越慢越贵"的根因。
  • 前馈网络(FFN / MLP)
    • 作用:每个 token 各自过一个两层非线性变换。研究普遍认为模型记住的事实性知识主要存在这里。参数量占大头。
  • 残差连接 + 归一化(Residual + RMSNorm/LayerNorm)
    • 作用:工程稳定器。残差让梯度能穿过上百层不消失,归一化让每层数值稳定——正是它俩让"堆得很深"成为可能。

层数 × 宽度 = 参数量:所谓 7B / 70B / 671B,主要就是这些 Transformer 层堆多少、每层多宽算出来的。

⑤ 输出层(LM Head)+ Softmax —— 从向量变回概率 ​

  • LM Head:把最后一层输出的向量乘以一个"词表大小"的矩阵,给词表里每个候选 token 打一个原始分数(logits)。分数越高 = 模型越想选它,但这些分数是没有范围的实数(可能是 8.7,也可能是 -1.5),没法直接当概率用。(常和嵌入层共享权重,叫 weight tying。)
  • Softmax:把这一堆杂乱的分数换算成"占比"——每个都压到 0~1 之间,且全部加起来正好等于 1(也就是 100%);原始分数越高占比越大,差距还会被适当拉开。 举例:三个候选的原始分数是 [2.0, 1.0, 0.1],过一遍 Softmax 就变成约 [0.66, 0.24, 0.10],读作"下一个词有 66% 的概率是第一个、24% 是第二个、10% 是第三个"。有了这张概率表,第 ⑥ 步才能按概率抽签。

⑥ 采样(Sampling)—— 掷一次骰子 ​

按上一步的概率分布挑出一个 token。temperature / top_p 就作用在这里。 选出的 token 追加到输入末尾,回到 ①——这就是开头那个"核心心智模型"循环的完整展开。

一张表:每个部件决定了什么 ​

部件主要决定
分词器计费粒度、对数字/拼写类任务的表现
嵌入 / 隐藏维度每个 token 的信息"带宽"、参数量
Transformer 层数 × 宽度模型总参数量(7B / 70B …)
自注意力上下文理解能力;长文本的速度与成本(平方级)
前馈网络(FFN)存储的知识量
位置编码上下文窗口能做多长、能否外推
采样(temperature/top_p)输出的随机性与创造性

现代架构的几个变体(选模型时会遇到,速览即可) ​

这几个不是必备零件,而是主流大模型为了"更省、更快、更强"做的改造,做 Agent 选型和成本估算时经常碰到:

  • MoE(专家混合,Mixture of Experts):把每层的前馈网络换成很多个"专家",每个 token 只激活其中少数几个。 这样可以扩大模型的总参数量,同时减少每个 token 实际经过的专家计算。不过,所有专家权重仍要存放,路由和跨卡通信也会花时间,所以激活参数少不代表显存需求小,更不能直接推断它和同等激活参数量的 Dense 模型一样快。DeepSeek、Mixtral 等是典型。 看到模型同时标出“总参数量”和“激活参数量”时,先分清“模型一共保存多少参数”和“一个 token 经过多少参数”。完整解释见 MoE 混合专家:大模型为什么要学会分工。
  • KV Cache(键值缓存):⭐ 和 Agent 性能强相关。生成第 N 个 token 时,前面 token 的 Key/Value 已经算过, 缓存起来复用,不必重算。代价是占显存,且随上下文长度线性增长——这是长上下文推理贵、并发受限的直接原因。
  • 注意力家族(MQA / GQA / MLA):都是为了压缩 KV Cache、让推理更快更省显存的改法,本质是"多个注意力头共享/压缩 Key、Value":
    • MQA(多查询注意力):所有头共享同一份 KV,压得最狠、省得最多,但质量略降。
    • GQA(分组查询注意力):MQA 和原始多头的折中,分组共享,是现在的主流标配。
    • MLA(多头潜在注意力):DeepSeek 提出,把 KV 压成低秩"潜向量",省显存的同时尽量保住质量。
  • 滑动窗口注意力(Sliding Window Attention):每个 token 只看最近固定窗口内的 token,而不是全部, 把长序列的成本从"平方级"压下来。Mistral 等用过。
  • SwiGLU 等激活函数:现代前馈网络里常用的激活单元,比老的 ReLU 效果更好——属于"把 FFN 调得更强"的细节,知道有这回事即可。
  • 非 Transformer 架构(了解即可):如 Mamba / 状态空间模型(SSM),用线性复杂度处理长序列,长文本上有潜在优势, 目前仍在发展、也有和 Transformer 混合的做法(如 Jamba)。记住"主流是 Transformer,但不是唯一一条路"就够了。

和 Agent 开发的连接:你之所以要做上下文管理、关心首字延迟和并发, 根子都在这套架构——注意力的平方成本 + KV Cache 的显存增长。理解构成,才能理解这些工程约束从哪来。

三个层面别搞混:架构 / 训练 / 部署 ​

MoE、LoRA、SFT、量化这些缩写常被混为一谈,实则分属三个不同层面。 区分它们是模型选型与阅读技术文档的基础:

层面回答的问题典型概念详见
① 架构模型长什么样(结构)Transformer、MoE、GQA/MLA、KV Cache本篇
② 训练 / 微调参数怎么练出来的预训练、SFT、RLHF/DPO、LoRA/PEFT../training-overview
③ 部署 / 推理优化训好后怎么跑得省量化、蒸馏、投机解码../training-overview、../ml-glossary

其中 LoRA、SFT 属于第 ② 层(训练/微调),而非架构。各概念简述:

  • SFT(监督微调):用"指令 → 回答"示范数据,把只会续写的基座模型调教成会听话的助手。
  • RLHF / DPO:按人类偏好对齐,模型"有用、无害、会拒答"就来自这步。
  • LoRA(低秩适配):⭐ 最常用的高效微调法——冻结原模型,只在旁边训练一小片新增参数(可能不到 1%), 省显存、省钱、产物只有几十 MB。想给模型加"专属语气/领域知识"又不想全量重训时用它。
  • 量化(Quantization):把权重精度压低(如 FP16→INT4),换取更小显存、更快速度,代价是轻微掉精度——属于第 ③ 层。

各概念的详细展开见对应篇章,本节只需建立"哪个词属于哪一层"的分层地图。

关键名词详解 ​

  • token(词元):模型处理文本的最小单位,不是字也不是词。英文约 4 个字母 = 1 token, 中文约 1 ~ 2 个字 = 1 token。API 按 token 计费、上下文按 token 计长度,所以它是成本和容量的度量衡。 可以用 OpenAI 的 tokenizer 工具或 tiktoken 库直观感受。
  • 上下文窗口(context window):模型单次能"看到"的最大 token 数(输入 + 输出加起来)。 超过就必须裁剪或压缩——这是 Agent 需要做记忆管理的根本原因。
  • 权重 / 参数(weights / parameters):模型内部存储"知识"的数字,训练时确定,推理时只读。 所谓 7B、70B 模型就是 70 亿、700 亿个参数。
  • 推理(inference):拿训练好的模型做预测(也就是调 API 这件事本身),区别于"训练"。 注意与 reasoning(推理思考)是两个不同概念,中文都叫推理,语境要分清。
  • temperature / top_p:控制采样随机性的两个旋钮。temperature 越高输出越随机、越低越确定; top_p 是核采样,另一种等价旋钮,一般二者只调其一。
  • 推理模型(reasoning model):先生成一段"思考过程"(reasoning tokens,通常不可见但计费)再给答案的 模型(如 o 系列)。用 reasoning_effort 控制思考多深。
  • 知识截止(knowledge cutoff):训练数据的时间边界,模型不知道这之后的事——所以 Agent 需要搜索工具和 RAG。
  • 幻觉(hallucination):模型一本正经地编造事实。根源:它在预测"像正确答案的文本",而不是查数据库。 缓解手段贯穿整个课程:RAG 提供依据、工具提供事实、评估兜底。

持续学习,持续实践。