从 0 开始理解大语言模型 封面
AI 系列

从 0 开始理解大语言模型

不讲玄学。从 Tokenizer 怎么切词、注意力为什么是 O(n²)、三阶段训练各自在学什么,到 KV Cache 与量化如何把推理变便宜——一次建立对 LLM 的工程级认知。

大语言模型 核心概念示意图
模型的核心组成:Tokenizer → Transformer 层 → 输出头
大语言模型 工作流程示意图
一次推理的链路:编码、注意力、采样
大语言模型 实践检查示意图
工程检查清单:上下文设计 + 验证闭环

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 实测为准。

小贴士:OpenAI / Hugging Face 都提供 tokenizer 在线工具,把提示词贴进去就能看到真实 token 数与切分,比凭感觉估算靠谱得多。

02 · 注意力机制:强,但代价是 O(n²)

Transformer 的核心是自注意力(self-attention)。处理第 i 个 token 时,模型计算它与序列中每个 token 的相关度(query 与 key 的点积),再按权重把所有人(value)加权求和。这一步让“指代关系”“远距离依赖”都能被捕捉——这是它碾压 RNN 的根本原因。但它有个绕不开的成本:每个 token 都要和前面所有 token 算一遍,计算与显存随序列长度 n 近似 O(n²) 增长

这就是为什么长上下文既贵又慢:把窗口从 8k 拉到 128k,注意力开销不是 16 倍而是约 256 倍。业界用各种稀疏注意力、分块(chunked)与显存优化来缓解,但本质矛盾仍在。工程上的启示很直接:不要把无关内容塞满上下文,真正需要的上下文越短,延迟和成本越低。

ATTENTION
Q·Kᵀsoftmax×V加权表示
每个 token 都和全序列算相关度,所以复杂度约 O(n²)

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,大模型一次性并行校验,把自回归的串行瓶颈摊薄。

踩坑提醒:4bit 量化对“写诗聊天”几乎无损,但对数学推导、长链代码等精细任务可能掉点。上线前务必用你的真实任务做 A/B,别只看 benchmark。
INFERENCE
权重 FP16量化 INT8/4bit·KV Cache 复用·投机解码加速
三类优化分别压显存、省重算、破串行瓶颈

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 与量化,贵靠精简上下文。原理清楚,取舍才有底气。