LLM 原理
是什么
LLM(Large Language Model,大语言模型)是一类基于 Transformer 架构、通过海量文本数据训练而成的深度学习模型。它的核心能力可以用一句话概括:
给定一段上文,预测下一个最可能出现的 Token。
这个看似简单的”预测下一个词”的能力,在模型参数量达到数百亿甚至数万亿时,涌现出了理解语义、逻辑推理、代码生成、多语言翻译等远超预期的复合能力。GPT-4、Claude、Gemini、Llama 都属于 LLM。
核心特征
- 生成式:不是从数据库检索答案,而是逐 Token 地”写出”回答
- 概率性:每次输出都是基于概率分布的采样,同一个 Prompt 可能产出不同结果
- 通用性:一个模型可以处理问答、翻译、摘要、编程等多种任务
- 上下文窗口:模型一次能”看到”的文本长度有限(如 128K Token)
为什么需要 LLM
传统 NLP 的困境
在 LLM 出现之前,自然语言处理(NLP)经历了几个阶段:
| 阶段 | 方法 | 局限 |
|---|---|---|
| 规则系统 | 人工编写语法规则 | 覆盖率极低,无法处理歧义 |
| 统计模型 | n-gram、TF-IDF | 只看局部统计,不理解语义 |
| 深度学习(小模型) | RNN、LSTM、BERT | 需要为每个任务单独微调,泛化能力有限 |
LLM 的突破
2017 年 Google 提出 Transformer 架构,2020 年 OpenAI 发布 GPT-3(1750 亿参数),人们发现:
- 规模涌现:当模型参数和训练数据达到一定规模后,模型表现出了训练目标中没有显式要求的能力(如数学推理、代码生成)
- 少样本学习:不需要针对特定任务训练,只需在 Prompt 中给出几个示例,模型就能理解并执行新任务
- 通用接口:自然语言本身成为了”编程语言”——用文字描述需求,模型直接完成任务
核心工作流程
LLM 的推理过程可以分为四步:
用户输入 → Tokenizer 分词 → 模型推理 → 采样输出
1. Tokenizer:文本到数字
模型不能直接读文字。Tokenizer 负责将文本切分为 Token(词元),并映射为数字 ID。
生活类比:想象你要用电报发一段话,但电报只认编号。Tokenizer 就是那本”密码本”——它把文字拆成编号片段,模型只看编号工作。
实际切分示例(以 GPT-4 的 BPE Tokenizer 为例):
输入: "今天天气真不错,适合写代码"
切分结果:
┌──────┬──────┬────┬─────┬──┬────┬────┬───┬──────┐
│ 今天 │ 天气 │ 真 │ 不错 │ ,│ 适合 │ 写 │ 代 │ 码 │
└──────┴──────┴────┴─────┴──┴────┴────┴───┴──────┘
Token 数: 9
对比英文:
输入: "The weather is nice today"
切分: ["The", " weather", " is", " nice", " today"]
Token 数: 5
为什么同样的意思,中英文 Token 数不同? 因为 Tokenizer 的词表是从训练语料中统计学习的,英文高频词往往是完整的一个 Token,而中文需要更细粒度的拆分。这直接影响 API 计费——同样一句话,中文可能比英文”贵”一倍。
一个反直觉的例子:
"ChatGPT" → ["Chat", "G", "PT"] (3 个 Token,被拆开了)
"the" → ["the"] (1 个 Token,太常见了)
"indescribable" → ["ind", "esc", "rib", "able"] (4 个 Token,罕见词被拆碎)
关键概念:
- Token ≠ 字 ≠ 词:一个 Token 可能是一个字、半个词、一个标点,甚至一个字节
- Subword 分词:主流方案(BPE、SentencePiece)通过统计频率自动学习分词粒度——高频组合合并为一个 Token,低频词被拆分为更小的片段
- 词表大小:通常 32K-128K 个 Token,覆盖多语言
- Token 数量直接影响成本:API 计费按 Token 数量计算,而非字符数
2. 模型推理:Transformer 前向传播
Token ID 进入模型后经过以下流程:
Token ID → Embedding 向量 → N 层 Transformer Block → 输出概率分布
每层 Transformer Block 包含:
- 自注意力(Self-Attention):让每个 Token 关注上文中所有相关 Token,捕捉长距离依赖
- 前馈网络(FFN):对注意力结果做非线性变换,存储”知识”
- 残差连接 + 层归一化:保证深层网络的训练稳定性
详细的 Transformer 内部机制参见 02-Transformer 架构。
3. 采样输出:从概率到文字
模型最终输出的是一个概率分布:词表中每个 Token 被选中的概率。如何从中选取下一个 Token,取决于采样策略:
| 参数 | 含义 | 典型值 |
|---|---|---|
| Temperature | 控制随机性。越低越确定,越高越发散 | 0.0-1.0 |
| Top-P | 只从累积概率前 P% 的 Token 中采样 | 0.9-1.0 |
| Top-K | 只从概率最高的 K 个 Token 中采样 | 40-100 |
| Max Tokens | 本次生成的最大 Token 数 | 因模型而异 |
Temperature 直觉:
假设你问模型”用一个词形容大海”,模型给出的候选概率分布为:
"辽阔" 40% | "深邃" 25% | "蔚蓝" 20% | "神秘" 10% | "咸的" 5%
不同 Temperature 下的表现:
| Temperature | 行为 | 可能的输出 | 适用场景 |
|---|---|---|---|
| 0 | 永远选概率最高的 | 每次都输出”辽阔” | 事实问答、代码生成 |
| 0.7 | 适度随机,高概率词仍占优势 | ”辽阔""深邃""蔚蓝”交替出现 | 日常对话、文案写作 |
| 1.5 | 大幅拉平概率差距 | 偶尔蹦出”咸的” | 头脑风暴、创意写作 |
一句话总结:Temperature 就像调节”冒险程度”的旋钮——调低则稳妥重复,调高则天马行空。
4. 自回归生成
LLM 的生成是逐 Token 进行的。下面用一个完整的对话场景来演示:
场景:用户问”推荐一种编程语言”
第 1 步: 模型看到 → "推荐一种编程语言"
候选概率: "Python"(35%) "Java"(20%) "Go"(15%) ...
选中: "Python" ✓
第 2 步: 模型看到 → "推荐一种编程语言 Python"
候选概率: ","(60%) "。"(25%) "是"(10%) ...
选中: "," ✓
第 3 步: 模型看到 → "推荐一种编程语言 Python,"
候选概率: "因为"(30%) "它"(25%) "适合"(20%) ...
选中: "因为" ✓
第 4 步: 模型看到 → "推荐一种编程语言 Python,因为"
候选概率: "它"(40%) "语法"(20%) "入门"(15%) ...
选中: "它" ✓
... 如此循环,直到生成终止符 <EOS> 或达到 Max Tokens
最终输出: "Python,因为它语法简洁、生态丰富,适合初学者入门。"
关键洞察:
- 模型在第 1 步选了”Python”之后,后续所有内容都会围绕 Python 展开——这就是为什么 LLM 有时候”一条路走到黑”,因为前面的选择会锁定后续方向
- 每一步都是独立的概率决策,模型并没有”想好整句话再说”——它真的是一个字一个字蹦出来的
- 如果第 1 步选了”Go”,后续内容会完全不同(如”Go,因为它并发性能优秀”)
训练流程概览
一个 LLM 从零到可用,通常经历三个阶段:
阶段一:预训练(Pre-training)
- 目标:学习语言的统计规律和世界知识
- 数据:互联网文本、书籍、代码、论文等(通常数万亿 Token)
- 任务:Next Token Prediction(给定前文,预测下一个 Token)
- 算力:数千张 GPU,训练数周到数月
- 产出:Base Model(基座模型),能续写文本但不会”对话”
阶段二:有监督微调(SFT, Supervised Fine-Tuning)
- 目标:教模型”如何对话”
- 数据:人工标注的高质量指令-回答对(数万到数十万条)
- 效果:模型从”续写器”变成”助手”,学会遵循指令
阶段三:人类偏好对齐(RLHF / DPO)
- 目标:让模型的输出符合人类价值观和偏好
- 方法:
- RLHF(Reinforcement Learning from Human Feedback):训练奖励模型 → 强化学习优化
- DPO(Direct Preference Optimization):直接从偏好数据优化,省去奖励模型
- 效果:模型学会拒绝有害请求、给出更有帮助的回答、减少幻觉
详细的训练与对齐机制参见 07-模型训练与对齐。
关键概念辨析
Token vs 字符 vs 词
文本: "ChatGPT is amazing"
字符: 19 个
词: 3 个
Token: 4 个 → ["Chat", "G", "PT", " is", " amazing"](取决于 Tokenizer)
- 中文通常 1 个汉字 ≈ 1-2 个 Token
- 英文通常 1 个常见词 ≈ 1 个 Token,罕见词会被拆分
Context Window(上下文窗口)
模型一次推理能处理的最大 Token 数:
| 模型 | 上下文窗口 |
|---|---|
| GPT-3.5 | 4K / 16K |
| GPT-4o | 128K |
| Claude 3.5 Sonnet | 200K |
| Llama 3 | 128K |
上下文窗口 = 输入 Token + 输出 Token。窗口越大,模型能”看到”的信息越多,但计算成本也越高。
幻觉(Hallucination)
LLM 有时会生成看起来合理但实际错误的内容。这不是 Bug,而是其概率生成本质的副产品:
- 模型优化的是”生成看起来合理的文本”,而非”生成正确的事实”
- 当模型对某个知识不确定时,它仍会自信地给出一个”最可能的”答案
- 解决方案之一就是 RAG——让模型先检索再回答
主流模型对比
| 模型 | 开发方 | 开源 | 特点 |
|---|---|---|---|
| GPT-4o | OpenAI | 否 | 多模态、推理能力强 |
| Claude 3.5 Sonnet | Anthropic | 否 | 长上下文、代码能力强、安全性高 |
| Gemini 1.5 Pro | 否 | 超长上下文(1M Token) | |
| Llama 3 | Meta | 是 | 开源标杆、社区活跃 |
| Qwen 2.5 | 阿里 | 是 | 中文能力强、性价比高 |
| DeepSeek V3 | 深度求索 | 是 | MoE 架构、推理效率高 |
| Mistral | Mistral AI | 是 | 轻量高效、欧洲团队 |
局限性
- 知识截止日期:预训练数据有时间边界,模型不知道训练后发生的事
- 幻觉:可能编造不存在的事实、引用、API
- 推理能力有限:复杂数学、逻辑推理仍是弱项(正在通过 CoT 和 o1 类模型改进)
- 无法执行动作:LLM 只能生成文本,不能真正”做事”——这正是 Agent 要解决的问题
- 上下文窗口限制:超出窗口的信息会被丢弃
延伸阅读
- 02-Transformer 架构:深入理解 LLM 的核心引擎
- 03-Embedding 与向量表示:理解 Token 如何变成向量
- 04-Prompt Engineering:如何高效地与 LLM 沟通
- 07-模型训练与对齐:预训练、SFT、RLHF 的详细机制