这篇文章想回答什么
在学习 LLM 的过程中反复遇到 熵(Entropy) 这个词——交叉熵损失、Perplexity、Temperature、幻觉检测……它们看起来是不同的概念,但背后都指向同一个数学直觉。
这篇文章试图把这些散落的知识点串成一条线:熵是理解 LLM 行为的统一语言。
一句话理解熵
熵 = 不确定性的度量。
抛一枚公平硬币,结果完全不确定,熵最大(1 bit)。如果硬币两面都是正面,结果确定,熵为 0。
Shannon 在 1948 年给出的公式:
$$ H(X) = -\sum p(x) \log p(x) $$概率分布越均匀(越不确定),熵越高;概率越集中(越确定),熵越低。
关于"熵"这个汉字本身:它是民国时期物理学家为翻译 thermodynamic entropy 而造的形声字——火(热力学)+ 商(读音 shāng)。信息论中的 entropy 借用了同一个数学公式,但它不是物理比喻,而是独立的数学定义。两者共享数学形式,不共享物理机制。
训练:Cross-Entropy Loss
LLM 训练的本质目标只有一个:给定上下文,预测下一个 token 的概率分布,让这个预测尽可能接近真实分布。
衡量"接近程度"的指标就是 交叉熵(Cross-Entropy)。
直觉理解
假设真实的下一个 token 是"猫",模型的预测概率分布如下:
| Token | 模型预测概率 | Cross-Entropy 贡献 |
|---|---|---|
| 猫 | 0.7 | $-\log(0.7) ≈ 0.36$ |
| 猫 | 0.01 | $-\log(0.01) ≈ 6.64$ |
关键性质:
- 预测越准(正确 token 的概率越高)→ cross-entropy 越低
- 预测越离谱 → cross-entropy 越高,且是对数级惩罚
- 给正确答案 0.01 的概率比给 0.1 的概率,惩罚不是差 10 倍,而是差很多倍
这正是我们想要的训练信号:严厉惩罚"完全猜错"的情况。
训练曲线上的 Loss
当你看到一条 LLM 训练的 loss 曲线时,纵轴通常就是 cross-entropy loss。曲线下降 = 模型对下一个 token 的预测越来越准 = 预测分布的"不确定性"在降低。
评估:Perplexity
Perplexity(困惑度) 是 cross-entropy 的指数形式:
$$ PPL = 2^{H} $$直觉:Perplexity = 模型平均在多少个 token 之间"犹豫"。
- GPT-2 时代,perplexity 约 20-30,意味着每一步大约在 20-30 个候选 token 间不确定
- 现代大模型的 perplexity 显著更低,说明预测能力更强
Perplexity 是衡量语言模型基础能力的核心指标之一。但它只衡量"预测准不准",不直接衡量"回答有没有用"——这也是为什么我们还需要 BLEU、ROUGE 以及更现代的 LLM-as-Judge 等评估方式。
推理:Temperature 与采样
训练完成后,模型输出的是一个 token 级别的概率分布。怎么从这个分布中选 token,直接决定了输出的熵。
Temperature
Temperature 参数直接缩放 logits(模型输出的原始分数),从而控制概率分布的"形状":
- T → 0:argmax,概率几乎全部集中在最高分的 token 上,输出熵趋近 0,完全确定性
- T = 1:使用模型原始分布
- T > 1:拉平分布,所有 token 的概率差异缩小,输出熵增大,更随机
Top-p(Nucleus Sampling)
Top-p 从另一个角度控制熵:截断累积概率。比如 top_p=0.9 意味着只保留累积概率达到 90% 的 token 集合,剩余的长尾 token 被丢弃。这等效于给输出熵设了一个上限。
实际应用中的选择
| 场景 | Temperature | 原因 |
|---|---|---|
| 代码生成 | 低 (0-0.2) | 需要确定性,正确答案通常唯一 |
| 创意写作 | 高 (0.7-1.0) | 需要多样性和意外感 |
| RAG 问答 | 低 (0-0.3) | 需要忠实于检索到的文档 |
| 数据提取 | 0 | 需要完全确定的结构化输出 |
Context 与条件熵
这一节对 RAG 工程师尤其重要。
从信息论角度看,当你往 context window 注入信息时,你在做的事情是降低模型预测后续 token 的条件熵。
$$ H(Y|X) \leq H(Y) $$条件熵(已知 X 时对 Y 的不确定性)永远小于等于无条件熵。X 提供的信息越充分、越相关,条件熵越低,输出越确定。
这就是 RAG 系统能提升回答质量的信息论解释:
- 用户提问 → 模型面临高不确定性(高熵)
- 检索到相关文档并注入 context → 不确定性降低(条件熵降低)
- 模型基于充分的上下文生成回答 → 输出更确定、更准确
反过来说,如果检索到的文档不相关或互相矛盾,反而可能引入噪声,不一定降低熵——这也是为什么 RAG 系统的 retrieval quality 如此关键。
幻觉检测:Entropy 作为信号
一个实用的观察:当模型逐 token 生成时,如果某个位置的 entropy 突然升高(entropy spike),往往意味着模型在这个位置开始"编造"。
直觉:模型在自己训练数据中见过的、有把握的内容上,预测分布会很尖锐(低熵);而在没有依据、需要"编"的地方,预测分布会变得平坦(高熵)。
一些幻觉检测方法就利用这个特性:
- 监控 token 级别的 logprobs
- 计算滑动窗口内的 entropy
- 当 entropy 超过阈值时标记为潜在幻觉
OpenAI 和 Anthropic 的 API 都支持返回 token 的 log probabilities,这使得上述方法在产品层面可以落地。结合 Langfuse 等可观测性工具,你可以对生产环境中的 LLM 输出做 entropy-based 的质量监控。
Entropy 在 Prompt Engineering 中的隐性影响
虽然写 prompt 时我们不会直接计算熵,但 prompt 的设计在本质上影响着输出分布的熵:
- 指令越明确 → 模型的输出空间越小 → 熵越低 → 输出越稳定可控
- 开放式 prompt → 输出空间大 → 高熵 → 多样但不可控
- Few-shot examples → 约束了输出模式 → 降低熵
- 结构化输出要求(JSON schema、XML tags) → 极大压缩输出空间 → 显著降低熵
这也解释了为什么"好的 prompt"通常是具体的、有约束的——你在帮模型缩小搜索空间,降低它需要做的"决策的不确定性"。
代码库的"熵":一个有用的比喻
最后提一下 entropy 在 AI 工程中的另一个常见用法——不是数学定义,而是比喻。
OpenAI 在 Harness Engineering 一文中描述了一个现象:当 Codex agent 自主生成代码时,代码库会逐渐累积不一致的模式、风格漂移和技术债。他们把这种退化称为 entropy,并设计了 garbage collection 机制(定期跑 agent 扫描偏差、发起重构 PR)来对抗这种"熵增"。
这里的"熵"是借用了热力学的隐喻:系统在没有外部干预时自然趋向无序。虽然不是严格的数学定义,但作为工程直觉,它精确地传达了"自主系统需要持续治理"这个关键认识。
总结
| 阶段 | 熵的角色 | 实际意义 |
|---|---|---|
| 训练 | Cross-entropy loss | 训练目标:最小化预测与真实分布的差距 |
| 评估 | Perplexity ($2^H$) | 模型基础能力的核心指标 |
| 推理 | Temperature / Top-p | 控制输出的随机性和多样性 |
| Context | 条件熵$H(Y \mid X)$ | RAG 注入相关文档 = 降低条件熵 = 提升输出质量 |
| 产品 | Entropy spike 检测 | 幻觉检测和输出质量监控的信号 |
| Prompt | 输出空间约束 | 好的 prompt = 帮模型降低决策不确定性 |
| 工程 | 比喻(代码退化) | 自主系统需要 garbage collection 对抗熵增 |
一句话:LLM 训练是在降低交叉熵,推理时用 temperature 控制输出熵,评估时用 perplexity 衡量质量,产品层面用 entropy 信号检测幻觉。熵是贯穿 LLM 全生命周期的统一语言。