从 0 开始理解大语言模型
不讲玄学。从 Tokenizer 怎么切词、注意力为什么是 O(n²)、三阶段训练各自在学什么,到 KV Cache 与量化如何把推理变便宜——一次建立对 LLM 的工程级认知。
01 · Tokenizer:为什么 token 数≠字数
文本进入模型的第一步是分词(tokenization)。模型并不认识“字”或“词”,它只认词典里的 token。主流算法是 BPE(Byte-Pair Encoding) 和 WordPiece:它们从字符或字节对出发,反复合并出现频率最高的相邻单元,最终得到一套兼顾常见词与罕见词的词表。于是“learning”可能被拆成“learn”“ing”两个 token,“_temperature”也可能被切得更碎。
这带来三个工程后果:第一,token 数≠字数,英文通常比中文更“费” token,同样的 prompt 英文计费可能更高;第二,生僻词、代码、非拉丁文字会被切成很多小 token,长上下文消耗更快;第三,跨模型迁移提示时要注意词表不同——A 模型的 100 token 在 B 模型可能不是 100。计算预算时务必以目标模型的 tokenizer 实测为准。
02 · 注意力机制:强,但代价是 O(n²)
Transformer 的核心是自注意力(self-attention)。处理第 i 个 token 时,模型计算它与序列中每个 token 的相关度(query 与 key 的点积),再按权重把所有人(value)加权求和。这一步让“指代关系”“远距离依赖”都能被捕捉——这是它碾压 RNN 的根本原因。但它有个绕不开的成本:每个 token 都要和前面所有 token 算一遍,计算与显存随序列长度 n 近似 O(n²) 增长。
这就是为什么长上下文既贵又慢:把窗口从 8k 拉到 128k,注意力开销不是 16 倍而是约 256 倍。业界用各种稀疏注意力、分块(chunked)与显存优化来缓解,但本质矛盾仍在。工程上的启示很直接:不要把无关内容塞满上下文,真正需要的上下文越短,延迟和成本越低。
03 · 训练三阶段:各自在学什么
今天能对话的模型,能力来自三个递进阶段。预训练(Pre-training):在海量无标注文本上做“下一个 token 预测”,目标是让模型掌握语言规律、世界知识与推理基底。这一步最贵,决定能力上限。指令微调(SFT):用“指令—回答”配对数据继续训练,让模型学会“按人类要求的格式与意图回应”,从“续写机器”变成“能听话的助手”。偏好对齐(RLHF / DPO):用人类偏好数据教模型“哪种回答更合人意、更安全”。其中 DPO 把强化学习简化成直接对比损失,比传统 RLHF 的奖励模型+PPO 更稳定、更易训练。
理解这条链路后你会明白:“参数量更大”只是决定上限,而上下文是否完整、任务是否定义清楚、是否给了工具与验证,往往更直接地决定你手上的实际效果。很多“模型不行”的问题,其实出在 SFT 之后的使用环节。
| 阶段 | 在学什么 | 数据 | 谁最贵 |
|---|---|---|---|
| 预训练 | 语言 + 世界知识 | 万亿级无标注文本 | 是(算力天花板) |
| 指令微调 SFT | 听懂指令、规范格式 | 指令-回答对 | 中等 |
| 偏好对齐 DPO | 更合人意、更安全 | 偏好对比数据 | 较低 |
04 · 推理优化:把“贵”变成“可用”
模型训好只是开始,部署时的成本与延迟才是落地门槛。几个关键手段:KV Cache——自回归生成时,前面 token 的 key/value 缓存复用,避免每生成一个新词就重算整个历史,这是长输出提速的核心;量化——把权重从 FP16 压到 INT8 甚至 4bit(如 GPTQ / AWQ),显存大幅下降、吞吐提升,代价是少量精度损失,4bit 下复杂推理可能略降质;投机解码(speculative decoding)——用小模型先草拟若干 token,大模型一次性并行校验,把自回归的串行瓶颈摊薄。
05 · 能力边界与失效模式
知道模型“不知道什么”比知道它会什么更重要。知识截止:训练数据有时间点,之后的事它只能靠检索补;推理 vs 记忆:模型擅长“在训练分布内组合”,但不等于真正理解——让它做长链算术或多步逻辑,容易在中段走偏;上下文污染:你塞进去的错误前提,它多半会顺着演下去。失效时不报错、不犹豫,反而更自信,这正是幻觉最危险的地方。
06 · 开发者实战:上下文设计 + 验证闭环
落到工程,做对三件事就能解决大部分问题:先定义任务类型(生成 / 分类 / 抽取 / 核验),再设计最小必要上下文(只放与任务相关的证据,用 system 固定指令、用 user 放动态内容),最后接一道程序侧验证(schema 校验、来源核对、关键数字复算)。把模型看作流水线的一环,而非黑盒终点。
# 一个最小可运行的验证闭环(Python)
from pydantic import BaseModel, ValidationError
class Answer(BaseModel):
problem: str
steps: list[str]
risk: str | None
def call_llm(prompt: str) -> Answer | None:
raw = client.chat.completions.create(
model="gpt-5",
messages=[{"role": "system", "content": "只依据给定证据回答,缺失则说不知道"},
{"role": "user", "content": prompt}],
response_format={"type": "json_schema", "schema": Answer.model_json_schema()}
)
try:
return Answer.model_validate_json(raw.choices[0].message.content)
except ValidationError as e:
print("输出不符合约束,需重试或兜底:", e)
return None
理解原理不是为了背概念,而是为了知道问题该在模型、数据还是工作流里解决:幻觉靠证据与校验,慢靠 KV Cache 与量化,贵靠精简上下文。原理清楚,取舍才有底气。