从 KL、MoE 到 RAG:四篇技术博客的第一性原理学习笔记
关于KL散度、MoE和RAG的学习笔记
从 KL、MoE 到 RAG:四篇技术博客的第一性原理学习笔记(校正版)
基于四篇 LINUX DO 博客重新整理,并用原始论文、技术报告和研究机构文章核对关键细节。
这不是对原文的逐段复述,而是一份可以独立学习的“重构版教材”:保留原文擅长的直觉解释,修正容易误导的绝对化表述,并补上公式成立的条件、工程边界和常见失败模式。
原始博客
目录
- 0. 先看全局:四篇文章在解决什么问题
- 1. 如何用费曼学习法阅读本文
- 2. 第一性原理底座:模型究竟在做什么
- 3. KL 散度:如何衡量“两个行为分布差了多少”
- 4. MoE(上):为什么要让不同 token 走不同专家
- 5. MoE(下):参数、FLOPs、显存、Kimi K3 与确定性
- 6. RAG:如何在生成前把外部证据找回来
- 7. 四篇文章的统一视角:三个“路由问题”
- 8. 原文关键表述校正速查表
- 9. 费曼自测与实践练习
- 10. 术语速查表
- 11. 参考资料
0. 先看全局:四篇文章在解决什么问题
把大语言模型想象成一个正在答题的学生。它面临四类基本问题:
| 问题 | 对应主题 | 一句话解释 |
|---|---|---|
| 我现在的答题习惯,和原来的习惯偏离了多少? | KL 散度 | 比较两个概率分布,并在训练时限制模型“跑偏” |
| 这一道题应该交给哪个脑区处理? | MoE 路由 | 每个 token 只激活少量专家,让总容量变大而单次计算保持稀疏 |
| 班里每个脑区的工作量如何别差太多? | MoE 负载均衡 | 防止少数专家挤爆、其余专家饿死 |
| 仅靠记忆答不出来时,怎样先查资料再回答? | RAG | 从外部知识源检索证据,把证据放进上下文后生成答案 |
四篇博客的主线可以压缩成下面这张图:
训练目标层:
KL —— 控制“模型行为分布”不要偏得太远
模型结构层:
MoE —— 控制“计算资源”应该分配给哪些专家
知识系统层:
RAG —— 控制“外部信息”应该检索哪些证据
共同本质:
都在有限资源下,根据一个分数做选择,并处理选择失误
四篇文章各自最值得保留的观点
KL 博客
最值得保留的是三个直觉:
- KL 不只是“两个分布差多少”,还可以理解成“用错误分布编码数据时,多付出的平均信息成本”。
KL(P‖Q)与KL(Q‖P)不同,交换顺序会改变惩罚重点。- 在 RLHF 中,不能只背一个 KL 公式,还要分清参考策略、旧策略、当前策略,以及“估计 KL 数值”和“估计 KL 梯度”是两件不同的事。
MoE(上)
最值得保留的是一条完整因果链:
专家多了
→ 模型总参数容量变大
→ 必须用 Router 稀疏选择
→ 选择可能不均衡
→ 需要容量、负载均衡和调度机制
MoE(下)
最值得保留的是两个区分:
- 总参数量不等于每个 token 激活的参数量;
- 理论 FLOPs不等于真实延迟,因为 MoE 还受通信、负载长尾和硬件调度影响。
RAG 博客
最值得保留的是“全链路意识”:
文档解析
→ 切块
→ 建索引
→ 查询改写
→ 召回
→ 融合
→ 重排
→ 组装上下文
→ 生成
→ 评估
RAG 的效果不是由某一个 embedding 模型决定,而是整条链路最薄弱的一环决定。
一句话总评
这四篇博客都很适合建立直觉。需要修正的主要问题不是“方向完全错误”,而是:
把某篇论文、某种实现或某个经验规律,说成了所有系统都必然成立的普遍规律。
本文会反复使用三个标签:
- 直觉正确:适合入门,但还需补充条件。
- 条件成立:在指定模型、公式定义或工程设置下成立。
- 需要修正:公式、符号、因果解释或适用范围不够准确。
1. 如何用费曼学习法阅读本文
“费曼学习法”并不是把知识讲得幼稚,而是强迫自己暴露理解漏洞。每个主题都按四层展开。
第一层:用生活类比说清目标
例如:
- KL:两本编码字典哪本更适合真实消息?
- MoE:医院分诊台如何把患者送到合适科室?
- RAG:写论文前如何先去图书馆找证据?
类比只负责回答“它为什么存在”,不负责替代技术机制。
第二层:把类比还原成对象与操作
例如 MoE:
患者 → token
分诊台 → Router
专科 → Expert FFN
接诊上限 → Capacity
科室排队 → Expert load
这一步要能指出:系统接收什么输入,计算什么分数,输出什么结果。
第三层:只保留最小必要公式
公式的作用不是装饰,而是精确回答:
- 在谁的分布下求平均?
- 哪些量能反向传播?
- 哪些量是离散选择?
- 哪些结论需要分布支持集、归一化或采样假设?
第四层:主动寻找失效条件
真正理解一个概念,必须能回答“什么时候它不工作”。
例如:
- HNSW 很快,但它是近似搜索,不保证总能找到精确全局 Top-K。
- Top-k MoE 很省专家计算,但可能产生通信瓶颈和负载长尾。
k3KL 估计器逐样本非负且数值无偏,但这不等于对它直接自动求导就得到正确的 KL 梯度。- RAG 找到相似文本,不等于找到支持答案的证据。
每个大节末尾都有一个“费曼复述”。建议先遮住答案,用自己的话讲一遍,再对照。
2. 第一性原理底座:模型究竟在做什么
在进入专业名词前,先从最小事实出发。
2.1 大语言模型输出的不是“答案”,而是概率分布
给定前文 (h),语言模型计算下一个 token 的条件概率:
[ \pi_\theta(y\mid h) ]
其中:
- (\pi) 常用来表示一个策略或概率分布;
- (\theta) 是模型参数;
- (h) 是已经出现的上下文;
- (y) 是候选下一个 token。
模型真正产生文本时,再用贪婪选择或采样,从这个分布中选一个 token。
术语卡|Token
“Token”原意是符号或记号。在语言模型里,它是分词器处理后的最小编号单位,不一定等于一个汉字或一个单词。模型先把文本变成 token ID,再把每个 ID 映射成向量。训练、上下文长度和生成速度通常都按 token 计数。
术语卡|概率分布
概率分布规定了每种可能结果有多大概率。离散分布满足 (P(x)\ge 0) 且 (\sum_xP(x)=1)。语言模型的“行为”可以视为:在每个上下文下,对所有下一 token 给出一组概率。
因此,训练模型至少包含三件事:
- 表示:把文字、图片或结构化数据变成数值向量。
- 计算:用参数把输入向量变成新的向量和概率。
- 优化:根据损失函数调整参数,使期望行为更好。
KL 主要属于第 3 件事;MoE 改造第 2 件事;RAG 在第 1 件事之前增加“从外部世界取信息”的步骤。
2.2 向量不是知识本身,而是可计算的表示
术语卡|Vector / 向量
向量是一串有顺序的数,例如 ([0.2,-1.1,0.7])。在机器学习中,向量用来承载对象的特征,使相似度、线性变换和梯度优化能够进行。向量不是对象本身,也不天然具有“语义”;语义来自训练目标和数据约束。
术语卡|Embedding / 嵌入
“Embedding”来自数学中把一个对象映射进另一个空间的思想。机器学习里的用法更宽松:把 token、句子、图片或用户映射成固定维度的向量。它的作用是让原本难以直接计算的对象,可以用距离或内积进行比较。
注意:embedding 相近通常只表示模型学到的某种相似性,不自动等于“事实相关”“能够回答问题”或“逻辑上支持结论”。
2.3 分数、概率与选择是三件事
很多系统都遵循同一模式:
输入
→ 计算候选分数
→ 把分数变成概率或排序
→ 选择少量候选
→ 对选择结果继续计算
- KL 比较两个概率分布;
- MoE Router 给专家打分并选 Top-k;
- RAG Retriever 给文档打分并取 Top-k;
- PPO 用奖励和概率比决定更新方向。
最常见的误区是把“分数高”误当成“绝对正确”。分数只是某个训练目标下的代理量。
3. KL 散度:如何衡量“两个行为分布差了多少”
3.1 从编码问题推导 KL,而不是先背公式
假设真实消息来自分布 (P),但你误以为消息来自 (Q)。
信息论告诉我们:一个概率越小的事件,理想编码所需的长度越长。若使用自然对数,事件 (x) 的信息量可写成:
[ -\ln P(x) ]
若使用错误分布 (Q) 编码,平均编码长度是交叉熵:
[ H(P,Q)=\mathbb E_{x\sim P}[-\ln Q(x)] ]
若使用真实分布 (P),理论平均长度是熵:
[ H(P)=\mathbb E_{x\sim P}[-\ln P(x)] ]
两者之差:
[ H(P,Q)-H(P)
\mathbb E_{x\sim P}\left[\ln\frac{P(x)}{Q(x)}\right]
D_{\mathrm{KL}}(P\parallel Q) ]
这就是 KL 散度。
术语卡|Entropy / 熵
“熵”一词先出现在热力学中,后来由 Claude Shannon 在信息论中用于衡量不确定性。信息熵 (H(P)) 表示:若数据服从 (P),最理想的平均编码成本是多少。
它不是“混乱程度”这么简单;在这里,它是一个明确的平均信息量。
术语卡|KL divergence / KL 散度
KL 来自 Solomon Kullback 与 Richard Leibler 在 1951 年发表的工作,原文称为“information for discrimination”,后来也常叫相对熵。
它衡量:当真实数据按 (P) 出现,却用 (Q) 描述或编码时,平均多付出多少信息成本。
离散形式:
[ D_{\mathrm{KL}}(P\parallel Q)
\sum_x P(x)\ln\frac{P(x)}{Q(x)} ]
连续形式把求和换成积分,但还涉及概率密度与测度,初学时不必强行类比成“每个点的概率”。
对数底数决定单位
- (\ln):单位是 nat;
- (\log_2):单位是 bit。
更换底数只会乘一个正常数,不改变非负性和最优点。
3.2 一个硬币例子
设:
[ P=(0.9,0.1),\qquad Q=(0.5,0.5) ]
则:
[ D_{\mathrm{KL}}(P\parallel Q)
0.9\ln\frac{0.9}{0.5} + 0.1\ln\frac{0.1}{0.5} \approx 0.3681\ \text{nats} ]
交换顺序:
[ D_{\mathrm{KL}}(Q\parallel P) \approx 0.5108\ \text{nats} ]
两个结果不同,所以 KL 不是普通几何距离。
3.3 KL 的三个核心性质
性质一:非负
在满足必要支持条件时:
[ D_{\mathrm{KL}}(P\parallel Q)\ge 0 ]
且当两个分布几乎处处相等时取 0。
可以由 (\ln t\le t-1) 推出。直觉上:真实分布本身已经给出最优平均编码,错误分布不能在平均意义上比它更省。
性质二:非对称
一般有:
[ D_{\mathrm{KL}}(P\parallel Q) \ne D_{\mathrm{KL}}(Q\parallel P) ]
**需要修正的常见解释:**非对称不是因为“对数函数不对称”。对数只是一个一元函数。真正原因是交换 (P,Q) 后:
- 求平均所用的权重从 (P(x)) 变成了 (Q(x));
- 比值从 (P/Q) 变成了 (Q/P)。
也就是说,两个方向在关注不同分布认为“经常发生”的区域。
性质三:支持集非常重要
术语卡|Support / 支持集
一个分布的支持集,是它可能产生且概率不为零的区域。
若 (P(x)>0) 但 (Q(x)=0),则 (\ln(P(x)/Q(x))) 发散,(D_{\mathrm{KL}}(P\parallel Q)=+\infty)。
这说明:如果真实世界认为某件事可能发生,而近似模型断言它绝不可能发生,KL 会施加无限惩罚。
3.4 为什么叫 Forward KL 和 Reverse KL
通常先约定:
- (P):目标分布、数据分布;
- (Q):待学习的近似分布。
然后把:
[ D_{\mathrm{KL}}(P\parallel Q) ]
叫 Forward KL,把:
[ D_{\mathrm{KL}}(Q\parallel P) ]
叫 Reverse KL。
但“forward/reverse”是依赖约定的称呼,不是公式自带的宇宙方向。阅读论文时必须先看作者把谁当目标、谁当近似。
Forward KL 的常见倾向:覆盖目标支持
若 (P) 在某区域有概率而 (Q) 给零概率,惩罚会发散。于是受限的 (Q) 往往倾向覆盖 (P) 的多个模式,常被称为:
- mode-covering;
- mass-covering;
- zero-avoiding。
Reverse KL 的常见倾向:避开目标低概率区
若 (Q) 把概率放在 (P) 几乎为零的区域,Reverse KL 惩罚很大。受限的 (Q) 可能集中到某一个高概率模式,常被称为:
- mode-seeking;
- zero-forcing。
重要限定:“Forward 一定覆盖、Reverse 一定寻峰”是对受限近似族和典型多峰例子的经验概括,不是对所有优化问题都无条件成立的定理。若 (Q) 的表达能力足够且优化成功,两个方向的共同最优解都是 (Q=P)。
3.5 KL 为什么出现在最大似然、SFT 和蒸馏中
术语卡|Maximum Likelihood Estimation, MLE / 最大似然估计
MLE 的目标是让模型给观测数据更高概率。对数据 (x\sim P_{\text{data}}),最大化 (\log Q_\theta(x)),等价于最小化负对数似然。
由于 [ H(P_{\text{data}},Q_\theta)H(P_{\text{data}}) + D_{\mathrm{KL}}(P_{\text{data}}\parallel Q_\theta), ] 而 (H(P_{\text{data}})) 对模型参数不变,所以最小化交叉熵等价于最小化从数据分布到模型分布的 KL。
术语卡|SFT / 监督微调
SFT 是 Supervised Fine-Tuning。它用“输入—理想输出”样本继续训练预训练模型,常见目标仍是逐 token 交叉熵。它教模型模仿样本答案,但不直接保证事实正确、偏好最优或长期策略最优。
术语卡|Knowledge Distillation / 知识蒸馏
蒸馏让学生模型模仿教师模型的输出分布。经典做法常最小化教师到学生的交叉熵或 KL,因此具有“不要漏掉教师给出概率的候选”的倾向。现代蒸馏有许多变体,不能把所有蒸馏都归结为同一个 KL 方向。
3.6 KL 在 RLHF 中到底约束什么
术语卡|RLHF
RLHF 是 Reinforcement Learning from Human Feedback,即“基于人类反馈的强化学习”。典型流程是:先做 SFT,再训练奖励模型或使用可验证奖励,最后用强化学习更新策略。它的目的不是单纯模仿一条答案,而是提高被奖励的行为概率。
一个常见的正则化目标是:
[ J(\pi_\theta)
\mathbb E_{\tau\sim\pi_\theta}[R(\tau)]
\beta \mathbb E_x\left[ D_{\mathrm{KL}} \bigl( \pi_\theta(\cdot\mid x) \parallel \pi_{\mathrm{ref}}(\cdot\mid x) \bigr) \right] ]
其中:
- (\pi_\theta):正在训练的当前策略;
- (\pi_{\mathrm{ref}}):固定参考策略,通常来自 SFT;
- (R):奖励;
- (\beta):奖励与“不要偏离参考模型”之间的权衡。
KL 的作用类似护栏:
只追奖励
→ 模型可能钻奖励函数漏洞、语言退化或分布漂移
加入 KL
→ 鼓励模型提高奖励时,仍保留参考模型的基本行为
必须区分三个策略
术语卡|(\pi_{\mathrm{ref}},\pi_{\mathrm{old}},\pi_\theta)
- (\pi_{\mathrm{ref}}):固定参考模型,用于 KL 护栏;
- (\pi_{\mathrm{old}}):生成当前 rollout 的策略快照,用于 PPO 概率比;
- (\pi_\theta):正在 minibatch 更新的当前策略。
(\pi_{\mathrm{ref}}) 与 (\pi_{\mathrm{old}}) 可能在训练初期相同,但角色完全不同。把它们混为一谈,会使 PPO 与 KL 公式都难以理解。
3.7 用样本估计 KL:k1、k2、k3
先固定记号,否则非常容易把正负号写反。
令:
[ x\sim q,\qquad r(x)=\frac{p(x)}{q(x)} ]
目标是估计:
[ D_{\mathrm{KL}}(q\parallel p)
\mathbb E_{x\sim q}\left[\log\frac{q(x)}{p(x)}\right]
\mathbb E_q[-\log r] ]
k1:最直接的估计
[ k_1=-\log r ]
性质:
- 对 KL 数值是无偏估计;
- 单个样本可以为负;
- 只有期望保证非负;
- 当似然比波动大时,方差可能较大。
修正原文表述:“大量 token 累计后总体非负”不是有限样本下的数学保证。有限样本均值仍可能小于 0,只是样本数增大时会在适当条件下收敛到非负的真实 KL。
k2:二阶局部近似
[ k_2=\frac12(\log r)^2 ]
性质:
- 每个样本都非负;
- 一般是有偏估计;
- 当 (p) 与 (q) 很接近时,可由局部二阶近似解释;
- 分布相差较大时,偏差可能明显。
“更稳定”不是无条件保证。样本非负不等于方差一定更小,也不等于梯度一定更正确。
k3:加入零均值控制变量
[ k_3=(r-1)-\log r ]
因为:
[ \mathbb E_q[r-1]
\sum_xq(x)\left(\frac{p(x)}{q(x)}-1\right)
\sum_xp(x)-\sum_xq(x)
0 ]
所以在支持与期望存在等条件满足时:
[ \mathbb E_q[k_3]
D_{\mathrm{KL}}(q\parallel p) ]
又因为对 (r>0):
[ r-1-\log r\ge 0 ]
所以每个样本的 (k_3) 都非负。
术语卡|Control Variate / 控制变量
控制变量是一种蒙特卡洛降方差技术:给估计量加上一个期望为零、但与原估计量相关的随机量,从而不改变期望,却可能减小波动。
(r-1) 的期望为零,因此 (k_3) 可看作给 (k_1) 加了控制变量。
需要保留的限定:
- “低方差”通常在 (p,q) 比较接近时成立得较好,不是所有分布上的绝对保证;
- 若 (r=p/q) 有重尾或极端值,(k_3) 仍可能波动很大;
k1/k2/k3是实践社区常用的非正式标签,不是所有教材统一采用的命名。
3.8 最关键纠错:KL 数值估计器不等于 KL 梯度估计器
这是原博客最值得进一步补上的地方。
假设分布 (q_\theta) 本身依赖参数:
[ F(\theta)
\mathbb E_{x\sim q_\theta}[f_\theta(x)] ]
对它求导时,不只有“对 (f_\theta) 求导”这一项。离散随机变量下,完整形式包含:
[ \nabla_\theta F
\mathbb E_{q_\theta} \left[ f_\theta(x)\nabla_\theta\log q_\theta(x) + \nabla_\theta f_\theta(x) \right] ]
第一项来自“采样分布本身随参数变化”,常叫 score-function 或 policy-gradient 项。
术语卡|Monte Carlo estimator / 蒙特卡洛估计
当一个期望无法精确求和时,可以从分布采样,用样本平均近似期望。估计量是否无偏,描述的是样本平均的期望是否等于目标数值;它不自动说明对该样本表达式做自动微分后,梯度也是无偏的。
因此:
一个表达式能无偏估计 KL 的数值,不代表把它当普通 loss 直接
autograd.backward(),就一定得到正确的 KL 梯度。
2025 年关于 RL 中 KL 梯度估计陷阱的研究专门指出:某些开源实现把 KL 样本估计直接当损失微分,会漏掉目标梯度所需的项;自回归序列还会因为前面 token 改变后续状态分布,使问题更复杂。
3.9 KL 放进 reward,还是显式放进 policy loss
原博客提出了这个重要问题,但“放进 reward 后直接梯度被抹消”需要修正。
方式 A:作为奖励惩罚
令:
[ R' = R-\beta,\widehat{\mathrm{KL}} ]
然后用 (R') 计算 return、advantage 和策略梯度。
即使 KL 数值被 detach,它仍会通过 advantage 影响策略更新:
某类动作 KL 惩罚大
→ 该动作的回报/优势下降
→ policy gradient 降低它再次出现的概率
强化学习本来就通常不要求奖励对策略参数可微。策略梯度通过 (\nabla\log\pi_\theta(a\mid s)) 把奖励信号传给参数。因此“梯度被抹消”不是准确说法。
方式 B:显式正则项
在策略损失之外加入某种可微 KL 正则。它可能直接对当前 logits 产生梯度,但是否正确取决于:
- KL 的方向;
- 采样来自谁;
- 哪些量 stop-gradient;
- 是 token 级还是序列级;
- 是否正确处理采样分布依赖;
- 与 PPO minibatch 重用和 clipping 如何组合。
两种方式为什么工程上不必等价
术语卡|PPO
PPO 是 Proximal Policy Optimization,由 Schulman 等人在 2017 年提出。它通过限制新策略相对 rollout 策略变化过大,提升训练稳定性。常见 clipped surrogate 使用概率比: [ \rho_t(\theta)
\frac{\pi_\theta(a_t\mid s_t)} {\pi_{\mathrm{old}}(a_t\mid s_t)} ] 再把 (\rho_t A_t) 限制在一定更新范围内。
PPO clipping 裁剪的是 surrogate objective 中的策略概率比贡献,并不是“直接把 KL 惩罚裁掉”。但若 KL 被放进 advantage,它会和 clipped surrogate 一起经历优化;若 KL 是额外 loss,它走另一条梯度路径。有限样本、clip、stop-gradient、critic 目标和 minibatch 重用都会破坏简单的代数等价。
Actor 与 Critic 是否“不一致”
术语卡|Actor–Critic
Actor 是策略,决定做什么;Critic 估计状态或动作的未来回报,用作基线和优势估计,主要作用是降低策略梯度方差。
若 actor 优化的是“任务奖励减 KL”后的总回报,让 critic 也学习这个惩罚后的 return 是合理而常见的设计。若把 KL 作为单独正则,让 critic 只估任务奖励,也可能形成另一种有效算法。二者是目标与估计器设计差异,不能简单判断为“一个一致、一个必然错误”。
3.10 自回归序列中的 token KL
序列策略可分解为:
[ \pi(y_{1:T}\mid x)
\prod_{t=1}^T \pi(y_t\mid x,y_{<t}) ]
在适当条件下,序列 KL 可写成沿当前策略生成历史的条件 token KL 期望之和。但要注意:
- 前面 token 改变,后面的上下文状态也改变;
- 后续 token 的概率不是在固定状态上独立计算;
- 逐 token 惩罚、序列级奖励和梯度信用分配不是同一个概念。
这也是“看起来只是把 token KL 加起来”,实现却容易出错的原因。
3.11 费曼复述:把 KL 讲给中学生
我有两本预测字典。真实世界按 (P) 出题,但我用 (Q) 猜题。KL 衡量我因为用错字典,平均多浪费多少编码长度。
顺序不能乱,因为P‖Q是在 (P) 常出现的地方检查 (Q),Q‖P是在 (Q) 常出现的地方检查 (P)。
训练时,我们可以从模型采样来估计 KL,但“估计出一个正确平均数”和“对这个数直接求导得到正确更新”不是一回事。
本节检查点
你应该能回答:
- 为什么 KL 非对称?
- 为什么 (P(x)>0,Q(x)=0) 会导致无限 KL?
- k3 为什么既无偏又逐样本非负?
- 为什么 detached 的 KL reward 仍能影响 policy gradient?
- (\pi_{\mathrm{ref}}) 和 (\pi_{\mathrm{old}}) 有什么不同?
4. MoE(上):为什么要让不同 token 走不同专家
4.1 先理解 Transformer 中的 FFN
一个典型 Transformer block 可以粗略看成两种计算交替:
Attention:
让不同 token 读取、汇总彼此的信息
FFN:
对每个 token 的表示分别做非线性加工
术语卡|Transformer
Transformer 是 2017 年提出的一类序列建模架构。它的核心创新是用注意力机制直接建立 token 间关系,并配合逐 token 的前馈网络、残差连接和归一化层。现代大语言模型通常由许多 Transformer block 堆叠而成。
术语卡|Attention / 注意力
注意力不是人的意识注意,而是一种加权信息汇总运算。一个 token 生成 Query,与其他 token 的 Key 计算匹配分数,再用这些分数加权 Value。它解决的是“当前 token 应该从上下文的哪些位置读取信息”。
术语卡|FFN / Feed-Forward Network
FFN 是前馈网络。在 Transformer 中,它通常对每个 token 独立应用同一组参数。经典形式是: [ \operatorname{FFN}(x)=W_2\phi(W_1x) ] 第一层把隐藏维度扩展到中间维度,激活函数提供非线性,第二层再投影回隐藏维度。
Attention 负责 token 之间“交流”,FFN 负责每个 token 内部“加工”。
因此,原博客说“MoE 是更高级的 FFN”作为直觉可以保留,但精确说法应是:
在许多 Transformer 模型中,MoE 用一个条件激活的专家 FFN 集合,替换部分或全部普通 FFN 子层。
它不一定替换每一层,也不一定所有专家都长得完全一样。
4.2 MoE 从哪里来
术语卡|Mixture of Experts / 混合专家
“Mixture of Experts”思想至少可以追溯到 Jacobs、Jordan、Nowlan 与 Hinton 在 1991 年的工作:多个局部专家处理不同输入区域,一个 gating network 决定如何组合它们。
2017 年,Shazeer 等把稀疏门控 MoE 扩展到超大规模神经网络:专家很多,但每个样本只激活少数专家。它因此成为“条件计算”的代表结构。
术语卡|Conditional Computation / 条件计算
普通稠密网络对每个输入运行同一批参数;条件计算根据输入只运行部分模块。目标是把“模型能储存多少模式”的总容量,与“每次输入要付多少计算”部分解耦。
普通 FFN:
所有 token
↓
同一个 FFN
MoE:
token
↓
Router 打分
↓
选择 Top-k 专家
↓
专家分别处理
↓
加权合并输出
数学上可写成:
[ y_t
\sum_{i\in\mathcal T_k(t)} g_{t,i}E_i(h_t) ]
其中:
- (h_t):第 (t) 个 token 的隐藏表示;
- (E_i):第 (i) 个专家,通常是 FFN;
- (\mathcal T_k(t)):该 token 选中的 k 个专家;
- (g_{t,i}):合并专家输出的权重。
4.3 MoE 真正的收益是什么
第一性原理上,模型容量和单次计算不是同一件事。
总参数量
所有专家、注意力层、Router、共享模块的参数总和。它决定:
- 权重文件有多大;
- 训练时参数、梯度、优化器状态要占多少内存;
- 系统总共能容纳多少可学习自由度。
激活参数量
处理一个 token 时真正参与前向计算的参数。它更接近单 token 算术成本,但不等于完整延迟。
例如有 64 个专家,每个 token 选 2 个:
储存容量:64 个专家
本次专家计算:2 个专家
这就是稀疏 MoE 的核心价值:
在不让每个 token 运行全部专家的情况下,提高总参数容量。
需要修正的过度推断:“参数更多,所以一定储存更多知识、一定更聪明”不成立。参数只是容量条件,效果还取决于:
- 数据质量与数量;
- 专家宽度;
- 路由质量;
- 优化稳定性;
- 专家是否得到足够训练;
- 系统是否能高效运行。
4.4 专家真的会变成数学、代码、中文专家吗
训练中确实可能出现专家特化,但不应把名字理解得太拟人化。
术语卡|Expert specialization / 专家特化
专家特化指不同专家接收的数据分布和学习到的函数出现差异。差异可能与语言、主题、语法结构、token 位置、频率、特征尺度或更难解释的内部模式相关。
“专家”是架构名称,不保证每个专家都有清晰的人类语义标签。
Router 与专家共同训练后,可能形成正反馈:
某专家早期偶然多接到某类 token
→ 它在这类 token 上学得更快
→ Router 更愿意继续选择它
→ 分工逐渐稳定
这既可能产生有益特化,也可能滑向负载崩塌。
4.5 Router:分诊台如何选择专家
术语卡|Router / Gate
Router 是路由器,Gate 是门控器。在 MoE 中,它根据 token 隐藏表示给专家打分,并决定激活哪些专家。早期 MoE 文献常用 gating network;现代工程语境更常说 router。两者功能高度重叠。
经典做法:
[ s_{t}=W_r h_t ]
再用 Softmax:
[ p_{t,i}
\frac{e^{s_{t,i}}}{\sum_j e^{s_{t,j}}} ]
然后选择分数最大的 k 个专家。
术语卡|Softmax
Softmax 把一组任意实数分数变成和为 1 的正数。它的指数形式会放大分数差异,因此常用于分类概率和路由权重。
现代 MoE 不一定都使用 Softmax;例如有些模型使用逐专家 Sigmoid affinity,再只在选中专家间归一化。
术语卡|Top-k
Top-k 表示只保留分数最高的 k 个候选。它把连续分数变成离散稀疏选择。优点是省计算;缺点是边界不连续:两个分数只差一点,排名交换后,实际计算路径可能完全变化。
4.6 为什么会发生负载不均衡
假设医院分诊台发现 A 科最强,于是把大量患者送给 A 科。A 科获得更多病例、训练得更快,分诊台又更相信它,最终形成:
偶然偏好
→ 更多 token
→ 更多梯度
→ 专家更强
→ 更高路由分数
→ 更严重偏好
术语卡|Routing collapse / 路由崩塌
路由崩塌指少数专家吸收大部分 token,而其他专家很少被使用。它会造成专家训练不足、硬件负载失衡和模型容量浪费。
它是负载不均衡的极端情况,不是所有专家溢出的唯一原因。
即使没有崩塌,负载也可能因为以下因素波动:
- batch 太小;
- 当前输入恰好高度同质;
- 领域分布变化;
- top-k 的离散边界;
- capacity factor 太小;
- 推理请求与训练分布不同。
4.7 辅助负载均衡损失
Switch Transformer 中经典的 Top-1 形式为:
[ L_{\mathrm{aux}}
\alpha N\sum_{i=1}^{N} f_iP_i ]
其中:
[ f_i
\frac1T \sum_{t=1}^{T} \mathbf 1[\operatorname{argmax}j p{t,j}=i] ]
表示实际分给专家 (i) 的 token 比例;
[ P_i
\frac1T \sum_{t=1}^{T}p_{t,i} ]
表示 Router 平均给专家 (i) 的概率。
术语卡|Auxiliary loss / 辅助损失
主损失直接对应主要任务,例如下一个 token 预测;辅助损失用于鼓励某种内部性质,例如负载均衡、表示分散或中间层预测。
它的作用是给本来很难由主任务自动学出的结构偏好提供梯度,但权重过大会干扰主任务。
这个公式的直觉是:
[ f_iP_i \approx \text{“已经很忙的专家,Router 还在多喜欢它”的程度} ]
- (f_i) 来自离散分配,通常不直接对 Router 求导;
- (P_i) 是连续概率,可以提供梯度;
- 忙专家的 (f_i) 大,它对应的高 (P_i) 会受到更强惩罚。
原博客数值例子的两个修正
均衡时,若 (N=4):
[ f=P=(0.25,0.25,0.25,0.25) ]
则:
[ N\sum_i f_iP_i=1 ]
所以完整损失是:
[ L_{\mathrm{aux}}=\alpha ]
不是 1,除非 (\alpha=1)。
若博客给定 (\alpha=0.01),均衡例子应为:
[ 0.01 ]
不均衡例子中:
[ N\sum_i f_iP_i=2.91 ]
完整损失应为:
[ 0.0291 ]
原文漏乘了 (\alpha)。相对比较仍然成立,但公式数值需要补全。
这个公式不是任意 Top-k 的统一形式
原公式中的 argmax 对应 Top-1。Top-k 系统通常要按“一个 token 产生 k 次专家分配”重新定义负载比例,论文之间归一化方式也可能不同。
例如一种常见定义是:
[ f_i
\frac{N}{kT} \sum_t \mathbf1[i\in\operatorname{TopK}(t)] ]
这时完全均衡时 (f_i=1),而不是 (1/N)。阅读公式时不能只看符号名,必须看定义。
4.8 Capacity:为什么专家要有接诊上限
术语卡|Capacity / 专家容量
Capacity 是一次路由组中,每个专家最多处理多少 token-to-expert 分配。它最初主要服务于静态张量形状、并行调度与避免单个专家成为长尾。
容量不是 MoE 的数学必需品,而是许多稀疏实现的工程机制;也存在 dropless MoE。
总 token 数为 (T),每个 token 选 k 个专家,共有 N 个专家。总分配数约为 (Tk),平均每个专家:
[ \frac{Tk}{N} ]
于是常见容量公式为:
[ C
\left\lceil \mathrm{CF}\cdot\frac{Tk}{N} \right\rceil ]
其中 CF 是 capacity factor。
术语卡|Capacity factor
Capacity factor 是平均负载之上的安全余量。CF 越大,溢出概率通常越低,但 padding、显存或无效计算可能增加;CF 越小,资源紧凑,但更容易溢出。
原文容量例子的明确笔误
给定:
[ T=1024,\quad N=8,\quad k=1 ]
若:
[ \mathrm{CF}=1 ]
则:
[ C=128 ]
若:
[ \mathrm{CF}=1.25 ]
则:
[ C=160 ]
原文参数列表写的是 1,计算却用了 1.25。
另外,原文同时用 (\alpha) 表示辅助损失权重和 capacity factor,容易混淆。建议固定使用:
- (\alpha_{\mathrm{aux}}):辅助损失权重;
- (\mathrm{CF}):容量系数。
4.9 Token dropping 到底“丢”了什么
当专家超过容量时,超出的路由分配可能被跳过、改送其他专家或进入 fallback。
术语卡|Token dropping
在 Switch Transformer 一类结构中,dropping 通常表示该 token 的专家分支没有正常执行,而不是把 token 从整个序列中删除。残差连接仍可能把原表示送到下一层。
因此更准确的说法是“丢弃某次 token-to-expert 计算路径”。
它仍然有代价:
- 专家分支没有加工该 token;
- 对应专家收不到该样本梯度;
- 若某类 token 更常溢出,会产生系统性偏差;
- 训练与推理的路由行为可能不一致。
但 token dropping 不是所有 MoE 必然存在的机制。DeepSeek-V3 技术报告明确描述其训练与推理采用 no-token-dropping 策略。
4.10 Expert Choice:让专家反过来挑 token
普通 Token Choice:
每个 token
→ 选择自己最喜欢的 k 个专家
Expert Choice:
每个专家
→ 从一批 token 中选择自己最想处理的 c 个
术语卡|Expert Choice Routing
Expert Choice 在 2022 年的工作中系统提出。它把选择方向反转,使每个专家接收固定数量 token,因此专家负载天然受控。代价是每个 token 获得的专家数不再固定。
它解决了专家维度的负载问题,却带来 token 维度的不确定计算量:
- token 可能没被任何专家选中;
- token 可能被多个专家选中;
- 不同 token 获得不同计算量;
- 流式、自回归推理不容易直接实现。
“破坏因果性”需要加限定
术语卡|Autoregressive / 自回归
自回归模型按顺序生成:位置 (t) 只能依赖输入和 (t) 之前的 token,不能依赖尚未产生的未来 token。这叫因果约束。
若训练时让一个专家查看完整序列,再从所有位置中选择 Top-c,那么位置 (t) 是否被选中可能取决于未来位置的分数。这对朴素的自回归解码器会造成训练—推理不匹配。
但这不意味着 Expert Choice 在所有任务中都“违反因果性”:
- 双向编码器不受同样约束;
- 图像模型可同时看到全部 patch;
- 非自回归或扩散式生成也有不同条件;
- 可以设计分块、流式或因果化变体。
4.11 Auxiliary-Loss-Free Load Balancing
传统辅助损失通过反向传播改变 Router:
语言建模目标
+
负载均衡目标
→ 共同更新 Router 参数
两者可能出现梯度竞争。Auxiliary-Loss-Free 方法改为:
[ \operatorname{TopK}(s_{t,i}+b_i) ]
其中 (b_i) 是专家动态偏置。
关键点:
- (s+b) 用来决定选谁;
- 合并专家输出时,权重仍来自原始 affinity (s);
- (b_i) 不靠普通反向传播学习;
- 根据实际负载在训练步骤之间调整偏置。
生活类比:
医学匹配分数 s:
患者最适合哪个科室
调度偏置 b:
哪个科室现在太忙,临时降低排队优先级
这把“能力匹配”和“系统调度”部分分离。
原文更新公式是简化版
原博客写成按负载误差大小比例更新:
[ b_i \leftarrow b_i-\gamma(\ell_i-\bar\ell) ]
这是一种合理的反馈控制形式,但 Auxiliary-Loss-Free 原始方法和 DeepSeek-V3 的主要描述使用固定步长的符号更新:
[ b_i \leftarrow b_i + \gamma,\operatorname{sign}(\bar\ell-\ell_i) ]
即:
- 过载:减 (\gamma);
- 欠载:加 (\gamma)。
原论文也研究过按误差大小更新的变体,但不能把博客公式当作 DeepSeek-V3 的精确实现。
“Loss-Free”不等于绝对没有任何辅助损失
DeepSeek-V3 主要用 batch-wise 动态偏置做负载平衡,但还保留了很小的 sequence-wise 平衡损失,报告中的权重为 (0.0001),用于避免单条序列内部极端失衡。
更准确的说法是:
主要的批级负载控制不再依赖辅助损失梯度,而不是整个模型中任何位置都不存在负载辅助项。
此外,偏置虽然不反向传播,却会改变专家收到的数据,因此仍会间接影响专家训练。它减少的是直接梯度冲突,不是让调度与学习完全隔离。
4.12 费曼复述:把 MoE 讲成医院分诊
普通 FFN 像所有患者都去一个综合科;MoE 像有许多专科,分诊台只把每位患者送到少数几个科室。这样医院可以拥有更多总能力,却不用每位患者看遍所有医生。
难点是热门科室会挤爆。辅助损失像训练分诊员“别总偏爱热门科”;动态 bias 像外部排队系统临时降低繁忙科室优先级;capacity 是科室接诊上限。
专家多并不自动带来速度,因为患者还要跨楼转运,最忙的科室会让所有人等待。
本节检查点
- MoE 为什么能提高总参数容量,却不必激活全部参数?
- Router score、选择偏置和合并权重有什么区别?
- Switch 的经典 aux loss 为什么主要是 Top-1 形式?
- Capacity factor 大和小各有什么代价?
- 为什么 token dropping 不等于删除整个 token?
- Expert Choice 在什么语境下会破坏因果性?
5. MoE(下):参数、FLOPs、显存、Kimi K3 与确定性
5.1 先把参数量和 FLOPs 算对
两矩阵 FFN
忽略 bias,设:
- token 隐藏维度:(D);
- FFN 中间维度:(d_{\mathrm{ff}});
- token 数:(T);
- 层数:(L)。
经典两矩阵 FFN:
[ x\in\mathbb R^D \overset{W_1}{\longrightarrow} \mathbb R^{d_{\mathrm{ff}}} \overset{W_2}{\longrightarrow} \mathbb R^D ]
参数量约为:
[ P_{\mathrm{FFN}} \approx Dd_{\mathrm{ff}}+d_{\mathrm{ff}}D
2Dd_{\mathrm{ff}} ]
若把一次乘加记为 2 FLOPs,前向计算约为:
[ F_{\mathrm{FFN}} \approx 4TLDd_{\mathrm{ff}} ]
若 (d_{\mathrm{ff}}=4D):
[ P_{\mathrm{FFN}}\approx 8D^2 ]
[ F_{\mathrm{FFN}}\approx 16TLD^2 ]
术语卡|FLOPs
FLOP 是一次浮点运算,FLOPs 在不同语境中可能指运算总数或每秒运算能力。模型论文里常把矩阵乘法中的一次乘法和一次加法算作 2 个 FLOPs。
FLOPs 是算术工作量,不是墙钟时间。相同 FLOPs 在不同 batch、数据类型、通信模式和硬件上,延迟可以差很多。
GLU / SwiGLU 不是两个投影,而通常是三个
术语卡|GLU
GLU 是 Gated Linear Unit,最早在门控卷积语言模型中系统使用。它把“内容分支”与“门分支”逐元素相乘,让网络学习每个通道应该开放多少。
Transformer 中常用的 SwiGLU 是 GLU 变体,用 Swish/SiLU 作为门分支非线性。
常见 SwiGLU:
[ \operatorname{SwiGLU}(x)
W_o\left[ \operatorname{SiLU}(W_gx) \odot (W_ux) \right] ]
有三个矩阵:
- (W_g):gate projection;
- (W_u):up projection;
- (W_o):down/output projection。
若三个投影都对应中间宽度 (d_{\mathrm{ff}}),参数量约为:
[ 3Dd_{\mathrm{ff}} ]
前向 FLOPs 约为:
[ 6TDd_{\mathrm{ff}} ]
实际模型常把 SwiGLU 中间维度调小,使参数量或 FLOPs 与传统 (4D) ReLU FFN 接近。因此不能看到 “GLU” 仍直接套用两矩阵 (8D^2) 公式。
5.2 “参数 N 倍、计算 k 倍”何时成立
若有 N 个完全相同的专家,每个专家与原 dense FFN 同宽,每个 token 激活 k 个,那么专家部分近似:
[ P_{\mathrm{expert,total}} \approx N P_e ]
[ F_{\mathrm{expert,active}} \approx k F_e ]
这就是博客所说的“参数 N 倍、计算 k 倍”。
但它只是一个受条件约束的对比式。真实 MoE 还可能包含:
- 更窄的专家中间维度;
- 共享专家;
- Router 计算;
- dispatch 与 combine;
- padding 或容量浪费;
- 通信;
- 只有部分层使用 MoE;
- 量化和低精度;
- 不同专家形状。
更一般的说法是:
总专家参数约等于“专家数 × 单专家参数”;单 token 的专家算术约等于“激活专家数 × 单专家算术”。能否比 dense 基线便宜,取决于单专家宽度和额外系统成本。
例如,若每个专家只有 dense FFN 的四分之一宽,Top-2 的专家算术可能约为 dense 的一半,而不是两倍。
5.3 为什么 FLOPs 少,延迟仍可能高
术语卡|Latency / 延迟
延迟是从请求进入到结果返回所需的实际时间。它不仅取决于算术量,还取决于内存带宽、kernel 启动、并行度、通信、排队和负载长尾。
MoE 典型地需要:
本地 token
→ 按专家重新排列
→ 跨 GPU 发送
→ 专家计算
→ 跨 GPU 送回
→ 恢复 token 顺序
术语卡|All-to-All communication
All-to-All 是一种集体通信:每个设备都可能向其他所有设备发送不同数据。专家并行 MoE 中,token 按路由结果发往持有对应专家的 GPU,再把输出送回。
它可能受网络带宽、延迟、消息大小和负载不均衡限制。
因此实际速度由多个“木桶板”决定:
[ \text{time} \approx \max( \text{expert compute}, \text{communication}, \text{slowest expert}, \text{memory movement} ) ]
不是简单的 FLOPs 除以峰值算力。
5.4 推理显存按总参数还是激活参数
原博客说“所有专家必须常驻 GPU”,方向上提醒了一个重要陷阱,但“必须在同一张 GPU 上常驻”过于绝对。
第一性原理是:
所有可能被路由到的权重,必须在需要时可访问;它们不必全部位于同一张 GPU,也不必永远留在 GPU。
常见部署方式:
- 单设备常驻:所有专家都在同一设备,显存按总权重算。
- Expert Parallelism:不同 GPU 各持有一部分专家,单卡只存分片,但整个集群仍存总参数。
- CPU/NVMe offload:不常用权重放在较慢存储,按需搬运;节省显存但增加延迟。
- 专家复制:热门专家在多设备复制,减轻通信或负载长尾,但增加总内存。
- 量化:用更低位宽储存专家权重,减少字节数,但总参数数量不变。
术语卡|Expert Parallelism / 专家并行
专家并行把不同专家放到不同设备。它与数据并行不同:数据并行通常复制完整模型处理不同样本;专家并行则按路由把 token 发给持有目标专家的设备。
激活参数量不等于推理显存
推理显存还包括:
- 非专家权重;
- 当前激活;
- KV cache;
- 路由缓冲区;
- 通信缓冲区;
- 量化 scale;
- 框架工作区。
术语卡|KV cache
自回归生成时,注意力层会缓存历史 token 的 Key 和 Value,避免每生成一个 token 都重算全部前文。KV cache 通常随上下文长度、层数、batch 和 KV 头数增长。它与 MoE 专家权重是不同的显存来源。
5.5 共享专家与细粒度专家
共享专家
术语卡|Shared Expert / 共享专家
共享专家对所有 token 都激活,用来承担普遍需要的变换;路由专家只处理被选中的 token。其设计动机是把“公共知识/公共变换”与“可特化容量”分开。
但它只是架构偏置,不保证共享专家一定学到“语法”,路由专家一定学到“领域知识”。
细粒度专家
术语卡|Fine-grained Experts / 细粒度专家
把一个大专家拆成多个较小专家,并激活更多小专家,可以增加组合数和路由灵活性。DeepSeekMoE 强调细粒度专家分割与共享专家隔离,以促进更专门的专家组合。
若把一个宽度为 (m) 的专家拆成若干宽度更小的专家,Top-k 的数字会变大,但总激活宽度未必同比增加。比较模型时不能只看“激活几个专家”,还要看每个专家多宽。
5.6 Kimi K3 的 Stable LatentMoE
Kimi K3 技术报告给出的关键规模是:
- 总参数:2.8T;
- 激活参数:104B;
- 每层 896 个 routed experts;
- 每个 token 激活 16 个 routed experts;
- 每层 2 个 full-width shared experts;
- routed experts 在宽度为 (\ell) 的潜在空间中工作。
术语卡|Latent space / 潜在空间
“Latent”意为潜在的、未直接观察的。潜在空间是模型内部的压缩表示空间。LatentMoE 先把 full hidden width (D) 投影到较小宽度 (\ell),在这个空间运行大量专家,再投影回 (D)。它用较小单专家成本换取更多专家数量。
简化流程:
输入 x ∈ R^D
│
├─ 共享路径:2 个 full-width shared experts
│
└─ 路由路径:
W↓:D → ℓ
→ 896 中选 16 个 latent experts
→ 加权聚合 u ∈ R^ℓ
→ RMSNorm
→ W↑:ℓ → D
两条路径相加
数学形式:
[ u
\sum_{i\in\mathcal T_k(x)} p_i E_i^{\mathrm{routed}}(W^\downarrow x) ]
[ y
\sum_{j=1}^{N_s} E_j^{\mathrm{shared}}(x) + W^\uparrow\operatorname{RMSNorm}(u) ]
为什么会有激活尺度问题
原博客用“误差经过很多矩阵连乘被放大”建立直觉,但应避免理解成:
总参数 2.8T
→ 数值误差按 2.8T 倍直接相乘
总参数量本身不会直接作为一个乘数放大激活。
更精确的原因是:
- routed path 包含降维、门控专家、聚合、升维等连续变换;
- 选中专家与路由权重变化,会改变聚合向量 (u) 的尺度;
- SwiGLU 的两个乘法因子都无上界;
- 在低精度训练中,极端激活更容易溢出或造成量化误差;
- 极端稀疏和巨大模型规模使这些稳定性问题更难控制。
Kimi K3 报告本身把问题归因于近四次连续矩阵乘链、极端规模和无界门控共同造成的内部激活爆炸。
5.7 RMSNorm 为什么放在上投影之前
术语卡|RMSNorm
RMSNorm 是 Root Mean Square Layer Normalization。它用向量的均方根尺度做归一化,但不像 LayerNorm 那样减去均值: [ \operatorname{RMSNorm}(x)
g\odot \frac{x} {\sqrt{\frac1d\sum_i x_i^2+\epsilon}} ] (g) 是可学习的逐维增益。作用是稳定整体尺度,同时保留模型重新放大或缩小不同通道的能力。
如果 (u) 整体变成 (100u),忽略 (\epsilon):
[ \frac{100u}{\operatorname{RMS}(100u)}
\frac{100u}{100\operatorname{RMS}(u)}
\frac{u}{\operatorname{RMS}(u)} ]
K3 在 routed expert 聚合后、(W^\uparrow) 之前做 RMSNorm,直接降低上投影对聚合尺度波动的敏感性。
它不是“修复所有矩阵误差”,而是控制进入升维投影的整体幅度。
5.8 SiTU-GLU:给 SwiGLU 两个分支加软上限
SwiGLU:
[ \operatorname{SiLU}(W_gx)\odot W_ux ]
当正输入很大时:
[ \operatorname{SiLU}(z)=z\sigma(z)\approx z ]
门分支和内容分支都可能很大,乘积产生激活离群值。
Kimi K3 使用 SiTU-GLU:
[ \left[ \beta_1\tanh\left(\frac{W_gx}{\beta_1}\right) \odot \sigma(W_gx) \right] \odot \left[ \beta_2\tanh\left(\frac{W_ux}{\beta_2}\right) \right] ]
术语卡|Soft cap / 软截断
硬截断直接把超过阈值的数压到阈值,拐点不可平滑;软截断用平滑函数逐渐饱和。
[ \operatorname{softcap}(z,\beta)=\beta\tanh(z/\beta) ] 小值附近近似 (z),大值时趋近 (\pm\beta)。
K3 设置:
[ \beta_1=4,\qquad\beta_2=25 ]
由于 (|\tanh|<1) 且 (0<\sigma<1),单个坐标的乘积绝对值被控制在约:
[ \beta_1\beta_2=100 ]
以内。它保留小值附近类似 SwiGLU 的形状,同时抑制极端正激活。
5.9 Quantile Balancing:为什么固定步长 bias 不够
普通 loss-free bias 更新每步只加减固定 (\gamma):
- (\gamma) 小:适应负载变化慢;
- (\gamma) 大:容易在目标负载附近来回振荡。
当每层接近 1000 个 routed experts 时,这个权衡更难。
术语卡|Quantile / 分位数
分位数是把数据按大小排序后对应某个累计比例的位置。例如中位数是 50% 分位数。它不是平均值,而是“有多少数据位于这个阈值以下”。
K3 的 Quantile Balancing(QB)从 Router margin 的分位位置估计:每个专家的 bias 应该移动到哪里,才能让其进入大约目标数量 token 的 Top-k。
高层直觉:
固定步长方法:
“你太忙了,下次统一降 0.001”
Quantile Balancing:
“根据本批次所有竞争分数,估算需要降到哪个门槛,
才会大约留下目标数量的 token”
它还用 histogram 近似分位数,避免保存和排序全部 margin。
需要加两个限定:
- QB 根据当前批次估计下一步 bias,输入分布变化时仍可能有误差;
- “目标负载”是设计目标,不等于任何硬件、任何批次都获得数学上绝对完美的全局平衡。
5.10 Temperature=0 为什么仍可能输出不同
术语卡|Temperature / 温度
生成时常把 logits 除以温度 (\tau) 再 Softmax。温度高,分布更平;温度低,分布更尖。工程 API 中
temperature=0通常表示贪婪解码,而不是实际执行除以零。
理论上,若:
- 输入完全相同;
- 权重完全相同;
- 每一步 logits 完全相同;
- argmax 实现确定;
- 没有并列值的不稳定决胜;
则贪婪解码应得到同一序列。
现实差异通常来自数值与执行路径:
浮点运算不满足严格结合律
[ (a+b)+c \ne a+(b+c) ]
在有限精度下,不同归约顺序会有微小差异。
动态 batching 改变 kernel 选择和归约形状
同一请求与不同其他请求一起批处理,矩阵形状、切块和归约顺序可能变化。Thinking Machines Lab 的分析强调:生产 API 的重要非确定性来源是变化的 batch 形状与非 batch-invariant 数值 kernel 的组合。
微小 logit 差异会被 argmax 放大
若两个候选 logit 极接近:
运行 A:token 甲高 1e-6
运行 B:token 乙高 1e-6
→ 选出不同 token
→ 后续上下文不同
→ 整段输出分叉
MoE 会不会放大差异
会,但不是必然随机源。
硬 Top-k Router 具有不连续边界:
专家 A 分数 0.500001
专家 B 分数 0.500000
微小数值变化可能交换排名,token 进入不同专家,随后隐藏状态差异增大。若系统还有容量竞争,batch 组成也可能影响哪些路由溢出。
但要明确:
- 给定完全相同的精确 Router 分数,Top-k 本身是确定的;
- dense 模型也会因为 batch-dependent kernels 出现差异;
- 现代 dropless MoE 不一定存在容量竞争;
- 所以 MoE 是可能的差异放大器,不是 Temperature=0 非确定性的唯一或普遍主要根因。
5.11 Soft MoE 到底“软”在哪里
原博客把 Soft MoE 理解为“每个 token 都进入所有专家”,这个说法容易误导。
术语卡|Soft MoE
Soft MoE 取消硬 Top-k token-to-expert 分配。它先用连续 dispatch 权重,把所有输入 token 的加权组合汇聚成固定数量的 expert slots;专家处理 slots;再用连续 combine 权重把 slot 输出分配回每个 token。
简化流程:
所有 token
│ 连续加权汇聚
▼
固定数量 slots
│
各专家处理自己的 slots
│ 连续加权回写
▼
每个 token 的输出
不是:
每个原始 token 完整跑一遍所有专家
Soft MoE 的特点:
- 不做离散 Top-k token dispatch;
- 专家 slots 数固定,负载规则;
- 路由对分数变化更平滑;
- 所有专家 slots 通常都参与计算,因此不再具有同样的稀疏专家计算方式。
原始 Soft MoE 工作主要面向视觉识别。若把“全序列 token 混合成 slot”的朴素形式直接用于自回归语言模型,未来 token 可能影响过去位置,因此需要因果化设计。
它可以减弱硬 Top-k 边界导致的路径突变,但不能自动消除:
- 矩阵乘法数值差异;
- Attention kernel 非确定性;
- 动态 batching;
- 并行归约差异。
所以“Soft MoE 解决了 Temperature=0 不确定性”过于绝对。
5.12 费曼复述:参数仓库与实际工单
MoE 像一家集团有很多仓库。总参数量是集团拥有的全部库存,激活参数量是当前订单真正取出的货。订单只取少量货,并不代表其他仓库不存在,也不代表它们不占存储。
FLOPs 是搬了多少箱,延迟还取决于仓库之间运输、最慢仓库和排队。
Kimi K3 把大量小专家放到压缩空间中,再用 RMSNorm 控制聚合尺度、SiTU-GLU 限制乘法离群值、Quantile Balancing 调整近千专家的负载门槛。
Temperature=0 只去掉随机采样,不会让浮点数、批处理和 kernel 自动变成严格确定。
本节检查点
- 两矩阵 FFN 与 SwiGLU 的参数公式为什么不同?
- “参数 N 倍、计算 k 倍”依赖哪些条件?
- 为什么所有专家不必常驻同一张 GPU?
- K3 的 latent expert 与 shared expert 分别处理什么空间?
- RMSNorm 与 SiTU-GLU 各控制哪类尺度问题?
- Soft MoE 为什么不是“每个 token 完整跑全部专家”?
6. RAG:如何在生成前把外部证据找回来
6.1 第一性原理:为什么模型需要外部检索
一个只依赖参数回答问题的模型有三类天然限制:
- 容量有限:参数不可能无损记住所有资料;
- 知识有时间边界:训练完成后,世界继续变化;
- 内部记忆不可直接审计:模型给出一句话时,很难从参数中指出它来自哪份证据。
于是产生一个简单想法:
不要要求模型把一切都背下来
而是在回答前,先找到当前问题需要的资料
术语卡|RAG
RAG 是 Retrieval-Augmented Generation,中文常译“检索增强生成”。Lewis 等人在 2020 年的原始 RAG 工作中,把可训练的检索器、外部非参数化知识索引与生成模型联合起来,用于知识密集型任务。
现代工程中,RAG 常被宽泛地用于“先获取外部信息,再把信息用于生成”的系统范式。
这里需要区分历史定义与宽泛用法:
- 严格历史语境:RAG 指特定的 learned retriever + generator 架构及其后续研究谱系;
- 宽泛工程语境:搜索引擎、数据库、工具调用、记忆库等,只要先检索再生成,也常被叫 retrieval augmentation。
因此原博客说 Agent Memory、skills 渐进披露都“可以算 RAG”,作为宽泛类比可以成立,但不是所有研究者都会采用这么宽的术语边界。
6.2 RAG 不是四步,而是一条证据供应链
一个成熟链路通常是:
数据源
→ 解析与清洗
→ 切块与元数据
→ 表示与建索引
→ 查询理解/改写
→ 候选召回
→ 多路融合
→ 重排
→ 上下文构建
→ 有依据生成
→ 引用、拒答与评估
可以把它分成三个目标:
Recall:别漏掉真正相关证据
主要由解析、切块、索引、查询改写和召回决定。
Precision:别把太多噪声送给模型
主要由过滤、融合、重排、去重和上下文预算决定。
Grounding:答案是否真的由证据支持
主要由提示设计、引用、矛盾处理、拒答与生成评估决定。
术语卡|Recall / 召回率
在一组真实相关文档中,系统找回了多少。Recall@k 表示前 k 个结果覆盖了多少真实相关项。高召回关心“别漏”。
术语卡|Precision / 精确率
返回结果中有多少是真相关的。高精确率关心“别塞噪声”。
RAG 的典型失败不是只有“没搜到”,还包括:
搜到了但没放进上下文
放进上下文但被截断
证据正确但排序靠后
证据互相冲突却未处理
模型看见证据仍自由发挥
答案正确但引用错了
6.3 文档解析:先把“页面”恢复成“内容”
术语卡|Parsing / 解析
解析是把原始文件转换成系统能理解的结构,例如标题、段落、表格、列表、页码和坐标。它解决的是“这个文件里有哪些逻辑单元,以及它们之间是什么关系”。
PDF 为什么麻烦
PDF 主要面向视觉呈现。它可能只记录:
- 某个字符画在页面哪个坐标;
- 字体、线条和图片如何绘制;
- 多栏排版;
- 表格线与文本块;
- 扫描图片。
它不保证天然提供“这是标题”“这是第二列表格”“这是图注”的语义结构。
OCR 什么时候需要
术语卡|OCR
OCR 是 Optical Character Recognition,光学字符识别。它把图片中的文字像素转换成字符。扫描 PDF、照片或图表内文字需要 OCR;带可用文本层的 PDF 则不一定需要。
**修正原文表述:**处理 PDF 不应统一说“需要 OCR”。
- 文本型 PDF:优先提取文本层并做版面分析;
- 扫描 PDF:需要 OCR;
- 混合 PDF:文字、表格、图片分区域处理;
- 关键图表:还需保留图片、图注和页面位置,不能只抽纯文字。
LlamaParse 是可选产品之一,不是所有场景的通用最优答案。工具选择应根据:
- 文档语言;
- 表格复杂度;
- 是否有公式;
- 隐私与合规;
- 成本和吞吐;
- 是否需要本地部署;
- 可否保留页码与坐标;
- 实际评测结果。
6.4 Chunking:检索系统到底以什么为单位
术语卡|Chunking / 切块
Chunking 把长文档分成可索引、可召回的小单元。Chunk 是检索系统的基本候选单位。它既要足够小以便定位,又要足够大以保留回答问题所需的完整语境。
块太大
- 多个主题混在一个向量中;
- 真正相关句被无关内容稀释;
- 占用更多上下文;
- 重排与生成成本上升。
块太小
- 条件、定义和结论被拆散;
- 指代词失去对象;
- 表格标题与单元格分离;
- 一个答案需要拼接大量碎片。
因此不存在通用“最佳 chunk size”。合理粒度取决于:
- 文档结构;
- 用户问题粒度;
- embedding 模型;
- reranker;
- 生成模型上下文;
- 语言;
- 评测数据。
结构化切块
原博客强调保留章节路径,这是非常值得保留的做法。
一个 chunk 不只存正文,还可存:
{
"document_id": "handbook-2026",
"title": "员工手册",
"section_path": ["第三章 财务制度", "3.2 差旅报销"],
"page": 37,
"block_type": "paragraph",
"text": "……",
"effective_date": "2026-01-01",
"access_scope": "finance-team"
}
术语卡|Metadata / 元数据
元数据是“描述数据的数据”,例如标题、作者、日期、页码、部门、权限、章节路径和版本。它的作用是过滤、追溯、排序和权限控制,不只是给 embedding 增加文本。
Parent–child retrieval
常见改进是:
- 用小块做精确召回;
- 命中后取回其较大的父章节作为上下文。
这把“用于匹配的粒度”和“用于阅读的粒度”分开。
Overlap 不是越多越好
块间重叠能减少边界切断,但重叠太大会:
- 产生大量重复候选;
- 让相同证据多次占据 Top-k;
- 增加索引和上下文成本;
- 使模型误以为重复信息更可信。
6.5 稀疏检索:关键词如何找到文档
原博客把 TF-IDF、BM25、倒排索引都归入“稀疏 embedding”,需要更精确地区分。
倒排索引是数据结构
术语卡|Inverted index / 倒排索引
普通目录从文档指向词;倒排索引反过来从词指向包含它的文档列表。它是搜索引擎高效关键词检索的核心数据结构。
它本身不是评分模型,也不是 embedding 模型。
例如:
"苹果" → 文档 1、文档 7、文档 20
"芯片" → 文档 7、文档 12
查询“苹果 芯片”时,只需访问对应 posting lists,再对候选打分。
TF-IDF 是词权重方法
术语卡|TF-IDF
TF 是 term frequency,词在当前文档出现多少;IDF 是 inverse document frequency,词在全库有多稀有。
高频于当前文档但全库罕见的词权重更高。它可以形成高维稀疏向量,也可以直接用于检索评分。
BM25 是排序函数
术语卡|BM25
BM25 通常指 Okapi BM25,是概率相关性框架发展出的经典词法排名函数。“25”来自一系列 Best Match 实验版本,不表示 25 个参数。
它通常运行在倒排索引之上,通过词频饱和、逆文档频率和文档长度归一化计算相关性。
一个常见形式:
[ \operatorname{BM25}(q,d)
\sum_{t\in q} \operatorname{IDF}(t) \cdot \frac{ f(t,d)(k_1+1) }{ f(t,d) + k_1 \left( 1-b+b\frac{|d|}{\operatorname{avgdl}} \right) } ]
其中:
- (f(t,d)):词 (t) 在文档 (d) 中的频率;
- (|d|):文档长度;
- (\operatorname{avgdl}):平均文档长度;
- (k_1):控制词频饱和;
- (b):控制长度归一化。
为什么词频要饱和
同一词从 0 次变 1 次很重要,从 1000 次变 1001 次通常没那么重要。BM25 的分式让词频贡献逐渐接近上限,避免关键词堆砌无限提高得分。
原文中的代数修正
令:
[ a=\frac{|d|}{\operatorname{avgdl}} ]
则:
[ 1-b+ba
1+b(a-1) ]
不是 (1-b(a-1))。
Learned sparse retrieval
术语卡|SPLADE
SPLADE 是 learned sparse retrieval 模型。它用 Transformer 学习一个词表维度上的稀疏权重向量,还能进行词项扩展。
与 BM25 相比,它确实更接近“稀疏 embedding 模型”;但代价是训练和推理更复杂。
因此准确分类是:
| 名称 | 类型 | 主要作用 |
|---|---|---|
| 倒排索引 | 数据结构 | 快速找到包含词项的候选文档 |
| TF-IDF | 词权重/稀疏表示 | 衡量词对文档的重要性 |
| BM25 | 词法排名函数 | 对关键词候选做相关性评分 |
| SPLADE | 学习型稀疏表示模型 | 学习词项权重与扩展 |
6.6 稠密检索:把语义映射到向量空间
术语卡|Dense retrieval / 稠密检索
稠密检索把查询和文档编码成大多数维度非零的低维向量,再用内积、余弦或距离检索相近向量。它擅长处理同义改写和语义相似,但可能弱于精确术语、编号和罕见实体。
Dual encoder / 双编码器
术语卡|Dual encoder
双编码器分别编码 query 和 document,使文档向量可以离线预计算。检索时只需计算 query 向量并搜索索引。
“双塔”不代表两个网络一定对称,也不代表一定共享权重;具体取决于模型设计。
原博客说“以前 BERT,现在 Transformer”不准确。BERT 本身就是 Transformer encoder。正确区分应是:
- BERT 是一种具体预训练 Transformer 编码器;
- 现代 embedding 模型可能基于 BERT、RoBERTa、T5、decoder-only Transformer 或其他架构;
- 是否适合检索取决于对比学习、负样本和训练目标,不只取决于基础架构名称。
三种常见相似度
内积:
[ u^\top v ]
余弦相似度:
[ \cos(u,v)
\frac{u^\top v}{|u||v|} ]
欧氏距离:
[ |u-v|_2 ]
若向量都做了 L2 归一化:
[ |u-v|_2^2
2-2u^\top v ]
此时:
- 最大化内积;
- 最大化余弦;
- 最小化欧氏距离;
三者排序等价。
若未归一化,向量模长会影响内积,三者不再等价。
6.7 向量索引:为什么不遍历全部向量
术语卡|ANN
ANN 是 Approximate Nearest Neighbor,近似最近邻。精确搜索要对所有向量计算距离,数据量大时太慢;ANN 牺牲少量召回率,换取显著速度和内存效率。
HNSW
术语卡|HNSW
HNSW 是 Hierarchical Navigable Small World graph,分层可导航小世界图。它把向量连接成多层邻居图:高层节点少,用于快速长距离跳转;底层节点全,用于局部精细搜索。
原博客“最终在局部范围内找到全局最近邻”应改成:
HNSW 在访问过的局部候选中返回最优结果,通常具有很高召回,但它是近似算法,不保证每次找到精确全局 Top-K。
底层包含所有点,不等于查询遍历所有点。搜索只探索图中的一部分候选。
术语卡|efSearch
efSearch 控制查询时保留和扩展多少候选。它越大,通常召回越高、延迟越大。HNSW 的速度—精度权衡不是固定的,要通过实际数据调参。
HNSW 常见代价:
- 图边占额外内存;
- 构建成本较高;
- 大规模删除和更新较复杂;
- 性能依赖构图参数和数据分布。
IVF
术语卡|IVF
IVF 是 Inverted File Index。它先把向量空间粗聚类,查询时只探测距离最近的若干簇,再在簇内找候选。这里的“倒排文件”按向量簇组织,不等于关键词倒排索引。
IVF 的关键参数是探测多少簇。探测越多,召回越高、计算越大。
HNSW 与 IVF 不是简单的“优缺点完全相反”,也不是互斥选择。工程系统可把它们与 Product Quantization 等压缩方法组合。
向量数据库是不是必须
不是。
小规模或低更新场景可以用:
- 内存矩阵;
- FAISS;
- PostgreSQL 扩展;
- 搜索引擎;
- 本地文件索引。
向量数据库的价值更多在:
- 大规模索引;
- 在线更新;
- metadata filter;
- 多租户;
- 复制与容错;
- 权限;
- 监控与运维。
“用了向量数据库”不等于“RAG 做好了”。
6.8 Hybrid retrieval:为什么关键词和语义常要合作
词法检索擅长:
- 产品编号;
- 人名和专有名词;
- 精确错误码;
- 法条编号;
- 罕见缩写。
稠密检索擅长:
- 同义表达;
- 描述性问题;
- 概念近似;
- 用户用词与文档用词不一致。
因此混合检索常有价值,但“目前基本所有问答 RAG 都必须混合检索”过于绝对。是否使用应由语料和评测决定。
原始分数不能随便相加
BM25 得分与余弦相似度没有统一尺度。直接:
[ 0.5\times \text{BM25} + 0.5\times \text{cosine} ]
可能只是让数值范围较大的那一路支配结果。
可选方法:
- 分数归一化;
- 校准;
- 学习融合权重;
- 基于排名的 RRF。
术语卡|RRF
RRF 是 Reciprocal Rank Fusion。它不比较原始分数,只根据每个结果在各检索器中的名次累加: [ \operatorname{RRF}(d)
\sum_m\frac1{k+\operatorname{rank}_m(d)} ] 这样能避开不同检索器分数尺度不一致的问题。它简单稳健,但也忽略了同一路内部的分数间隔。
6.9 查询优化:把用户问题变成可检索问题
原始用户问题往往含有:
- 代词;
- 省略条件;
- 多个子问题;
- 错别字;
- 口语表达;
- 依赖上一轮对话的上下文。
查询优化是显式系统步骤,不应简单等同于“模型 Thinking”。
术语卡|Query rewriting / 查询改写
把原问题改成更明确、与文档用语更匹配的查询。作用是提高召回,但必须保留用户原意,不能偷偷补充未经确认的前提。
Multi-query
为同一问题生成多个表达,再合并结果。优点是覆盖不同措辞,缺点是:
- 增加检索成本;
- 产生离题变体;
- 重复候选;
- 错误改写扩大噪声。
Query decomposition
把复杂问题拆成依赖有序的子问题。
例如:
先找到获奖者
→ 再查获奖者国籍
→ 再查其代表作
不是简单把所有子查询并行发送。后续查询可能依赖前一步实体,系统应保留依赖关系和证据链。
HyDE
术语卡|HyDE
HyDE 是 Hypothetical Document Embeddings。它让模型先生成一段“假想的相关文档”,对这段文档做 embedding,再检索真实语料。
目的不是把假想文档当事实,而是让查询向量更接近目标文档的写作风格和语义区域。
最大风险是:
假想文档可以包含幻觉,它只能作为检索桥梁,不能作为最终证据。
6.10 Rerank:相似不等于能回答
第一阶段召回通常追求高 Recall,会带回较多候选。重排器再用更强但更贵的模型判断“这段文档是否真正回答问题”。
Bi-encoder 与 Cross-encoder
双编码器:
query → 向量
doc → 向量
→ 快速比较
Cross-encoder:
[query; doc]
→ 同一个模型联合编码
→ 相关性分数
术语卡|Cross-encoder / 交叉编码器
Cross-encoder 允许 query token 与 document token 在模型内部直接交互,因此通常比独立向量相似度更精细;但每个 query–doc 对都要单独推理,成本高。
原博客称其“目前精度最高”过于绝对。更准确的说法是:
在许多文本相关性基准和候选规模下,训练良好的 Cross-encoder 是很强的重排基线;具体最优方法仍取决于领域、数据、模型规模、延迟预算和评价指标。
LLM rerank 还能做成:
- pointwise:逐文档打分;
- pairwise:比较两篇;
- listwise:对候选列表整体排序。
但它更贵,也可能受位置偏见、提示敏感性和生成不稳定影响。
6.11 GraphRAG:什么时候图结构有价值
术语卡|Knowledge graph / 知识图谱
知识图谱把实体表示为节点,把关系表示为边,例如“公司—收购—公司”“人物—任职—机构”。它适合显式表达多跳关系、实体网络和结构化约束。
术语卡|GraphRAG
GraphRAG 泛指利用图结构增强检索生成。Microsoft GraphRAG 的代表性流程会从语料抽取实体与关系、建立社区、生成社区摘要,再回答跨文档的全局问题。
它特别适合:
- “整个语料的主要主题是什么?”
- “哪些实体形成了几个阵营?”
- “A 通过哪些中间关系与 D 相连?”
- 跨多文档的关系聚合。
但它不是普通向量 RAG 的无条件升级版。新增成本包括:
- 实体抽取错误;
- 同名实体消歧;
- 关系幻觉;
- 图更新;
- ontology 设计;
- 社区摘要的信息损失;
- 更高构建与查询成本。
事实查找、精确条款、短文档问答,普通词法/稠密检索可能更直接。
6.12 原博客较少展开的关键阶段:上下文构建
检索结果不能原样全部塞进 prompt。上下文构建要做:
- 去重:删除相同或高度重叠块;
- 多样性控制:避免 Top-k 全来自同一段;
- 父块扩展:补足定义、条件和上下文;
- 证据排序:重要证据靠前,相关段落相邻;
- 预算分配:在 token 上限内分配不同来源;
- 来源标识:保留文档、页码、URL、版本;
- 权限检查:不能把用户无权访问的内容放进上下文;
- 冲突检测:标出不同版本或相互矛盾的证据。
术语卡|Context window / 上下文窗口
上下文窗口是模型一次前向计算可读取的 token 范围。窗口变长不等于可以无损塞入更多文档:成本上升,注意力可能被噪声稀释,重要证据还可能出现“中间遗忘”。
6.13 Grounded generation:有资料不等于会据实回答
术语卡|Grounding / 依据约束
Grounding 指答案应由提供的证据支持,并能追溯到来源。它不只是“把文档放进 prompt”,还包括让模型区分证据、推断与未知。
系统应明确要求:
- 只根据证据回答;
- 每个重要事实附 source id;
- 证据不足时拒答或说明不确定;
- 证据冲突时呈现冲突;
- 不把 HyDE 文本或查询改写当证据;
- 引用必须指向真正支持该句的片段。
还要防止检索文档中的 prompt injection:外部文档可能写着“忽略系统指令”。检索内容应被视为不可信数据,而不是更高优先级指令。
6.14 RAG 评估:不要只问“看起来好不好”
检索层
- Recall@k:真实相关证据有多少进入前 k;
- Precision@k:前 k 中有多少真相关;
- MRR:第一个相关结果出现得有多靠前;
- nDCG:考虑多级相关性与排名位置;
- Hit Rate:前 k 是否至少命中一个关键证据。
术语卡|MRR
Mean Reciprocal Rank。若第一个相关结果在第 (r) 位,该查询得分为 (1/r),再对查询取平均。它特别关心“第一个有用结果是否靠前”。
术语卡|nDCG
Normalized Discounted Cumulative Gain。高相关文档排在前面贡献更大,并用理想排序归一化。适合一个查询有多个不同相关等级结果的场景。
生成层
- 答案正确性;
- 答案相关性;
- 对证据的 faithful/faithfulness;
- 引用准确率;
- 引用覆盖率;
- 无证据时是否正确拒答;
- 冲突证据处理能力。
系统层
- 端到端延迟;
- 每次查询成本;
- 索引构建时间;
- 更新新鲜度;
- 权限泄漏率;
- 稳定性和可复现性。
Golden set
术语卡|Golden set / 黄金评测集
一组人工确认的问题、答案、关键证据和允许来源。它是调 chunk、embedding、Top-k、reranker 和 prompt 的共同基准。没有 golden set,只凭几个演示问题调参,很容易过拟合印象。
评估应分阶段诊断:
答案错
├─ 解析错?
├─ 没切到完整证据?
├─ 查询改写偏了?
├─ 召回没命中?
├─ 重排把证据压下去?
├─ 上下文截断?
└─ 模型看见证据仍生成错?
6.15 “RAG 已死”该怎么准确讨论
“RAG 已死”通常把两件事混在一起:
- 早期粗糙流程是否足够;
- 检索增强这个思想是否仍有价值。
更准确的结论是:
“固定长度切块 + 单一路向量 Top-k + 全部塞进 prompt”这一初级配方,在复杂任务上经常不够;但运行时获取外部信息并据此生成,仍是解决时效性、可追溯性、私有知识和工具信息的重要范式。
grep、SQL、Web Search、API、知识图谱和 Agent Memory 并不是 RAG 的敌人。它们是不同检索器或外部信息通道。是否都称作 RAG 是术语选择,真正重要的是:
- 取回的信息是否正确;
- 是否给了模型足够证据;
- 是否能追溯与评估;
- 是否满足权限和时效性。
6.16 费曼复述:把 RAG 讲成写开卷论文
RAG 像写一篇开卷论文。你先把资料整理成可搜索的章节和卡片;收到问题后,既按关键词查目录,也按语义找类似段落;先宽泛找候选,再用更细的标准重排;最后只把真正有用、带页码的证据放到桌面上。
查到相似资料不等于它能回答问题;把资料放桌上也不等于你一定按资料写。好的 RAG 还必须检查引用、冲突、权限和“资料不足时能否承认不知道”。
本节检查点
- 为什么倒排索引、BM25 和 SPLADE 不是同一种东西?
- HNSW 底层包含全部点,为什么仍是近似搜索?
- 为什么 BM25 分数与余弦分数不能直接随意相加?
- HyDE 生成的文本为什么不能作为证据?
- 为什么 Cross-encoder 通常只用于候选重排?
- RAG 的生成正确率低时,为什么要逐阶段诊断?
7. 四篇文章的统一视角:三个“路由问题”
KL、MoE、RAG 看似分别属于数学、模型结构和应用工程,第一性原理上却非常相似。
7.1 都是在候选之间分配概率或资源
| 系统 | 候选 | 分数/概率 | 最终分配 |
|---|---|---|---|
| 语言模型 | 下一个 token | logits / policy probability | 生成哪个 token |
| MoE | 专家 | Router affinity | token 进入哪些专家 |
| RAG | 文档或 chunk | BM25、向量相似度、rerank score | 哪些证据进入上下文 |
| RLHF | 行为轨迹 | reward、advantage、KL penalty | 哪些行为概率上升 |
共同模式:
候选很多
→ 资源有限
→ 用代理分数排序
→ 只保留一部分
→ 选择错误会被后续步骤放大
7.2 三种“崩塌”
策略分布崩塌
模型过度追逐奖励,输出变得单一、投机或偏离参考行为。KL 可以作为护栏,但权重太大又会阻碍学习。
专家路由崩塌
少数专家吸收大部分 token。负载损失、动态 bias、容量设计和系统冗余用于缓解。
检索结果崩塌
Top-k 全是同一来源、同一措辞或相互重复的 chunk。可用混合检索、RRF、多样性约束、去重和重排缓解。
它们共同说明:
只追求当前最高分,容易让系统失去覆盖、多样性和稳健性。
7.3 “最相关”不等于“最有用”
- Router 分数高:表示当前训练下匹配度高,不保证该专家有空;
- 向量相似度高:表示表示空间接近,不保证文档能回答问题;
- 奖励高:表示奖励函数喜欢,不保证符合真实人类目标;
- 概率高:表示模型更相信,不保证事实正确。
所以成熟系统会把多个目标分开:
能力匹配 + 负载调度
语义召回 + 事实重排
任务奖励 + KL 护栏
模型生成 + 证据校验
7.4 连续优化与离散选择的张力
神经网络喜欢连续、可微的量;工程系统经常必须做离散选择。
- KL 是连续的分布差异;
- Top-k Router 是离散选择;
- HNSW 搜索是离散图遍历;
- PPO 生成的 token 是离散动作。
常见解决策略:
- 用连续分数训练,部署时做离散选择;
- 用辅助损失给离散行为提供间接梯度;
- 用控制变量降低采样方差;
- 用外部反馈控制器调整不可微系统;
- 用 Soft MoE 等连续混合减少硬边界;
- 用离线评测而不是只相信训练 loss。
7.5 模型算法与系统工程不能分开
四篇文章都提示同一个现实:
数学目标正确,不代表系统实现就自动正确。
例子:
- KL 数值估计无偏,不代表自动微分梯度无偏;
- MoE FLOPs 合理,不代表 All-to-All 延迟合理;
- HNSW 召回高,不代表每个查询都精确;
- RAG 检索命中,不代表引用真正支持答案;
- temperature=0 的算法确定,不代表浮点执行 batch-invariant。
真正的第一性原理分析应逐层问:
目标是什么?
公式优化的真是这个目标吗?
样本来自哪个分布?
选择在哪一步发生?
数据如何移动?
有限精度会发生什么?
失败时如何观察和定位?
8. 原文关键表述校正速查表
下表不是否定原作者,而是把适合入门的类比改写成更准确、可迁移的技术结论。
8.1 KL 博客
| 原文或常见表述 | 校正后的说法 |
|---|---|
| KL 是两个分布的距离 | KL 衡量相对信息损失,但不是度量距离:不对称,也不满足三角不等式 |
| KL 非对称是因为 log 不对称 | 非对称来自交换后求期望的分布和概率比都改变 |
| Forward KL 一定覆盖所有模式,Reverse KL 一定只选一个峰 | 这是近似分布受限时的常见倾向,不是无条件定理 |
| SFT、蒸馏就是 Forward KL | MLE/SFT 可写成数据到模型的 KL 加常数;蒸馏有多种方向和目标 |
| k1 总体一定非负 | k1 的期望非负;有限样本均值仍可能为负 |
| k3 永远是低方差估计器 | 它逐样本非负且数值无偏;近分布时常有较好方差,但不是所有重尾情形的保证 |
| 无偏 KL 数值估计器可以直接当 loss 求导 | 数值无偏不保证梯度无偏;采样分布依赖参数时要处理 score-function 项 |
| KL 放进 reward 后梯度被抹消 | detached reward 仍通过 advantage 与 policy gradient 影响策略,只是不通过 KL 表达式本身反传 |
| PPO clipping 会直接裁掉 KL | clipping 作用于 PPO surrogate 中的概率比;KL 如何受影响取决于它被放在 advantage 还是额外 loss |
| critic 学纯奖励、actor 加 KL 就必然不一致 | 这是不同算法设计;critic 应估计哪种 return 取决于 actor 的目标与方差设计 |
| reference policy 就是 old policy | (\pi_{\mathrm{ref}}) 是 KL 参考,(\pi_{\mathrm{old}}) 是 rollout 快照,角色不同 |
8.2 MoE(上)
| 原文或常见表述 | 校正后的说法 |
|---|---|
| MoE 就是更高级的 FFN | 更精确地说,是条件激活的专家 FFN 集合,通常替换部分 Transformer FFN |
| 专家会自动成为数学、代码、语言专家 | 可能出现特化,但不保证具有清晰、稳定、可解释的人类语义 |
| 更多总参数等于储存更多知识 | 更多参数提供容量,不自动保证知识、能力或利用效率 |
| 经典 aux loss 是通用 Top-k 公式 | 文中 argmax 版本是 Switch 的 Top-1 形式;Top-k 需重新定义负载归一化 |
| 均衡时 aux loss 为 1 | (N\sum f_iP_i=1),完整 loss 是 (\alpha);原例漏乘 (\alpha) |
| 不均衡例子的 aux loss 是 2.91 | 若 (\alpha=0.01),完整值应为 0.0291 |
| Capacity 例子中 CF=1 得到 160 | CF=1 得 128;CF=1.25 才得 160 |
| (\alpha) 同时表示 aux 权重和容量系数 | 建议分别用 (\alpha_{\mathrm{aux}}) 与 CF |
| Capacity 是所有 MoE 的必需机制 | 它是常见工程机制;存在 dropless 或动态形状实现 |
| Token dropping 是删除 token | 通常是跳过该 token 的某条专家分支,残差路径仍存在 |
| Routing collapse 是 dropping 的唯一或必然主因 | 它是重要原因;小 batch、领域偏移、低 CF 等也可造成溢出 |
| Expert Choice 一定破坏因果性 | 朴素全序列版本会破坏自回归因果性;双向、视觉、非自回归或因果化变体另论 |
| Loss-free bias 按负载误差大小更新就是 DeepSeek-V3 实现 | 原始主方法和 DeepSeek-V3 使用固定步长 sign 更新 |
| Loss-free 表示完全没有任何辅助损失 | DeepSeek-V3 仍有很小的 sequence-wise 平衡损失,主要批级平衡不用辅助梯度 |
8.3 MoE(下)
| 原文或常见表述 | 校正后的说法 |
|---|---|
| 所有 FFN 都可按两矩阵公式计算 | GLU/SwiGLU 通常有 gate、up、output 三个投影,宽度也常重新调整 |
| MoE 一定是参数 N 倍、FLOPs k 倍 | 仅当单专家与 dense FFN 同宽且忽略共享专家、Router、通信等时成立 |
| FLOPs 与专家数量无关 | 激活专家算术主要由 k 与单专家宽度决定,但路由、通信、存储和调度仍随架构变化 |
| 所有专家必须常驻同一张 GPU | 所有权重要可访问,可分片到多 GPU、量化或 offload;代价不同 |
| 推理显存按 active 参数算 | 权重存储更接近总参数分片;激活参数只描述当前算术,KV cache 等另计 |
| K3 激活爆炸是 2.8T 参数把误差逐级放大 | 更精确原因是连续变换、聚合尺度波动、无界 SwiGLU 乘积与低精度风险;总参数数不是直接乘数 |
| RMSNorm 消除了误差 | 它主要控制聚合表示的 RMS 尺度,不能修复所有方向性或数值误差 |
| SiTU-GLU 把两个分支硬裁剪到 4 和 25 | 它用平滑 (\tanh) soft cap;绝对值渐近受限 |
| Quantile Balancing 每批绝对完美平衡 | 它用当前 margin 分位估计下一步 bias;近似、分布变化和系统约束仍存在 |
| MoE Router 自己引入随机性 | 给定相同精确分数,Top-k 可确定;它更像对微小数值差异的路径放大器 |
| Temperature=0 应绝对相同 | 理论贪婪解码确定;真实系统还受浮点、batch、kernel 和并发执行路径影响 |
| Soft MoE 是每个 token 跑所有专家 | 它先把 token 连续汇聚成 expert slots,再处理并连续回写 |
| Soft MoE 解决全部推理非确定性 | 它减弱硬路由不连续,但不能消除其他数值和 batching 来源 |
8.4 RAG 博客
| 原文或常见表述 | 校正后的说法 |
|---|---|
| 任何先取外部信息再生成都严格属于 RAG | 这是宽泛工程用法;原始 RAG 有更具体的 learned retriever + generator 历史定义 |
| PDF 都需要 OCR | 扫描或图片文字需要 OCR;有文本层的 PDF 更应先做文本与版面解析 |
| 某一 PDF 解析产品是首选 | 工具效果依文档、语言、隐私、成本与评测而变 |
| 有一个通用最佳 chunk 大小 | 粒度要按任务、文档结构、模型和 golden set 调整 |
| TF-IDF、BM25、倒排索引都是稀疏 embedding 模型 | 倒排索引是数据结构,TF-IDF 是权重/表示,BM25 是排序函数;SPLADE 才是典型 learned sparse model |
| BM25 长度项 (1-b+ba=1-b(a-1)) | 正确是 (1-b+ba=1+b(a-1)) |
| 以前用 BERT,现在用 Transformer | BERT 本身就是 Transformer encoder |
| 双塔一定是两个对称网络 | query/doc encoder 可共享或不共享,也可结构不对称 |
| 问答 RAG 基本都必须混合检索 | 混合检索常有价值,但应按语料与评测选择 |
| BM25 与向量分数可直接加权相加 | 原始尺度不同,应归一化、校准、学习融合或使用 RRF |
| HNSW 底层有全部向量,所以能找到全局 Top-K | HNSW 只探索部分图节点,是高召回 ANN,不保证精确全局 Top-K |
| IVF 与 HNSW 优缺点完全相反 | 二者是不同 ANN 思路,可组合,性能取决于参数和数据 |
| 向量数据库是 RAG 必需品 | 小规模可用本地索引或普通数据库;向量数据库主要解决规模化工程问题 |
| 模型 Thinking 时就在做查询优化 | 查询优化应是可观察、可评测的显式系统步骤;内部推理不自动等价 |
| 子查询都可以独立并行 | 很多复杂问题有依赖链,后续查询需要前一步实体 |
| HyDE 的伪文档是答案 | 它是检索桥梁,不能作为事实证据 |
| Cross-encoder 是任何场景下精度最高的方法 | 它通常很强,但效果受领域、训练数据、模型和预算影响 |
| GraphRAG 是下一代通用替代方案 | 它适合关系与全局问题,但有抽取、消歧、维护和成本负担 |
| RAG 成功只看是否检索到相关文本 | 还要评估上下文构建、事实依据、引用、拒答、延迟、成本和权限 |
9. 费曼自测与实践练习
9.1 不看正文,用一句话回答
- KL 为什么不是普通距离?
- 为什么交换 (P) 与 (Q) 会改变 KL 的关注区域?
- 为什么 k3 的期望不变?
- 为什么“KL 数值无偏”不能推出“自动微分梯度无偏”?
- MoE 的总参数量与激活参数量有什么不同?
- 为什么 Top-k 会放大微小数值变化?
- 为什么 MoE FLOPs 低,不代表延迟一定低?
- Soft MoE 的 slot 是什么?
- BM25、倒排索引和 HNSW 分别属于哪一层?
- 为什么检索到语义相似文档仍可能回答不了问题?
- HyDE 的假想文档为什么不能作为引用来源?
- 为什么 RAG 必须分检索、上下文与生成三个层次评估?
9.2 参考答案
- KL 不对称,也不满足三角不等式,因此不是数学意义上的距离度量。
- 交换后,不仅概率比倒转,求期望的权重分布也改变;每个方向重点检查不同区域。
- (k_3=k_1+(r-1)),而在 (x\sim q,r=p/q) 时,(\mathbb E_q[r-1]=0)。
- 参数还影响采样分布;完整梯度包含 score-function 项,直接对固定样本表达式微分可能漏项。
- 总参数是系统储存的全部权重;激活参数是当前 token 真正运行的权重。
- Top-k 是离散排序边界,两个接近分数一旦交换,计算路径就发生跳变。
- 延迟还包括 All-to-All 通信、内存移动、kernel 效率、负载长尾和排队。
- slot 是多个输入 token 按连续权重汇聚得到的固定专家输入,不等于某个原始 token。
- BM25 是词法排名函数;倒排索引是数据结构;HNSW 是向量 ANN 索引算法。
- 相似可能只是主题接近,文档未必包含回答所需的条件、结论或证据。
- 它是模型为改善检索生成的假设文本,可能包含幻觉。
- 答案错误可能源于没召回、上下文组装失败,或模型未按证据生成;只看端到端结果无法定位。
9.3 三个最小实践
实践 A:手算 KL
选两个三分类分布:
[ P=(0.7,0.2,0.1),\qquad Q=(0.4,0.4,0.2) ]
完成:
- 计算 (D_{\mathrm{KL}}(P\parallel Q));
- 计算 (D_{\mathrm{KL}}(Q\parallel P));
- 解释哪个类别对两个方向贡献差异最大;
- 把 (Q) 的第三类改为 0,观察支持集问题。
学习目标:不要只得到一个总数,要看每项由“权重 × 对数比”如何组成。
实践 B:模拟 MoE 负载
设 8 个专家、1000 个 token、Top-2。
- 随机生成 Router 分数;
- 统计每个专家的负载;
- 计算理论平均负载 (1000\times2/8=250);
- 分别设置 CF=1、1.1、1.25,统计溢出;
- 加入固定步长 bias 更新,观察适应速度和振荡;
- 再人为制造一个专家偏置,观察 routing collapse。
学习目标:看到“路由质量、均衡与容量”是三个相关但不同的问题。
实践 C:搭建可诊断的微型 RAG
只用 20 篇短文档和 30 个问题。
至少保留以下日志:
原始 query
改写 query
BM25 Top-10
dense Top-10
融合结果
rerank 分数
最终上下文
最终答案
引用 source id
逐步测:
- 只用 BM25;
- 只用 dense;
- RRF 融合;
- 加 Cross-encoder;
- 改 chunk 粒度;
- 加 parent expansion;
- 比较 Recall@5、引用准确率、延迟和成本。
学习目标:不用“感觉更好”调系统,而是找出改动究竟改善了哪一层。
9.4 推荐阅读顺序
若数学基础较弱:
第 2 节基础
→ 第 4 节 MoE 直觉
→ 第 6 节 RAG
→ 第 3 节 KL
→ 第 5 节高级 MoE
若正在学习训练算法:
第 3 节 KL
→ PPO / policy gradient 原论文
→ 第 4 节 MoE 路由损失
→ 第 5 节负载与稳定性
若正在搭建知识库:
第 6.1~6.4 数据与切块
→ 6.5~6.10 检索与重排
→ 6.12~6.14 上下文、生成与评估
→ 第 7 节统一视角
10. 术语速查表
| 术语 | 来源/字面含义 | 在本文中的作用 |
|---|---|---|
| Actor | 行动者 | 输出策略分布并选择动作/token |
| Advantage | 优势 | 某动作相对基线好多少,驱动 policy gradient |
| ANN | 近似最近邻 | 牺牲少量精确性换大规模向量搜索速度 |
| Attention | 注意/加权读取 | 让 token 从上下文其他位置汇总信息 |
| Auxiliary loss | 辅助损失 | 给负载均衡等内部目标提供梯度 |
| Batch | 一批样本 | 并行计算单位,也会影响数值 kernel 与负载统计 |
| BM25 | Best Match 系列第 25 版 | 经典词法相关性排名函数 |
| Capacity | 容量 | 专家一次最多处理的 token 分配数 |
| Chunk | 块/片段 | RAG 的索引和召回基本单位 |
| Critic | 评判者 | 估计回报,帮助构造低方差 advantage |
| Cross-encoder | 交叉编码器 | 联合读取 query 与 doc 做精细重排 |
| Dense model | 稠密模型 | 每个输入运行同一批主要参数 |
| Dispatch | 分发 | 把 token 或 slot 送给专家 |
| Embedding | 嵌入 | 把对象映射成可计算向量 |
| Entropy | 信息熵 | 分布自身的平均不确定性/编码成本 |
| Expert | 专家模块 | MoE 中可被条件激活的 FFN |
| Expert parallelism | 专家并行 | 把不同专家分布到不同设备 |
| FFN | 前馈网络 | 对每个 token 做非线性通道变换 |
| FLOPs | 浮点运算数 | 估计算术工作量,不等于实际延迟 |
| GLU | 门控线性单元 | 用门分支调制内容分支 |
| Grounding | 依据约束 | 要求答案受外部证据支持 |
| HNSW | 分层可导航小世界图 | 高召回的向量 ANN 索引 |
| HyDE | 假想文档嵌入 | 用生成的假想相关文档改善查询表示 |
| Inverted index | 倒排索引 | 从词项映射到包含它的文档列表 |
| IVF | 倒排文件向量索引 | 先找近簇,再在簇内搜索 |
| KL divergence | Kullback–Leibler 散度 | 衡量用一个分布近似另一个分布的相对信息损失 |
| KV cache | Key–Value 缓存 | 自回归生成中缓存历史注意力状态 |
| Latent space | 潜在空间 | 模型内部的压缩表示空间 |
| Logit | 未归一化分数 | 经 Softmax 后形成概率 |
| Metadata | 元数据 | 用于过滤、追踪、权限和结构恢复 |
| MLE | 最大似然估计 | 提高观测数据在模型下的概率 |
| MoE | 混合专家 | 用稀疏条件计算扩展总参数容量 |
| OCR | 光学字符识别 | 把图片中的文字转成字符 |
| Policy | 策略 | 给定状态时的动作概率分布 |
| PPO | 近端策略优化 | 通过受限策略更新提高 RL 稳定性 |
| Quantile | 分位数 | 用排序位置而非均值描述阈值 |
| RAG | 检索增强生成 | 先取外部信息,再用其增强生成 |
| Recall | 召回 | 真正相关项中被找回多少 |
| Rerank | 重排 | 对粗召回候选做更精细相关性排序 |
| RRF | 倒数排名融合 | 用名次而非原始分数融合多路检索 |
| RMSNorm | 均方根归一化 | 控制向量整体尺度 |
| Router | 路由器 | 给专家打分并选择 Top-k |
| SFT | 监督微调 | 用标注输入输出继续训练模型 |
| Softmax | 指数归一化 | 把 logits 转成概率分布 |
| Support | 支持集 | 分布可能取到的区域 |
| Temperature | 温度 | 调整生成分布尖锐程度 |
| TF-IDF | 词频–逆文档频率 | 衡量词对文档的词法重要性 |
| Token | 符号单元 | 模型处理和生成的离散基本单位 |
| Top-k | 最高 k 个 | 在候选中做稀疏离散选择 |
| Vector database | 向量数据库 | 管理大规模向量索引、过滤与在线服务 |
11. 参考资料
11.1 四篇原始博客
-
olddove,《MoE 相关知识点汇总与讲解(上)》
https://linux.do/t/topic/2684588 -
olddove,《MoE 相关知识点汇总与讲解(下)》
https://linux.do/t/topic/2687837 -
olddove,《RAG,你真的了解 RAG 吗?RAG 全链路拆解》
https://linux.do/t/topic/2720669 -
olddove,《KL 散度概论的个人总结》
https://linux.do/t/topic/2673517
11.2 KL、PPO 与 RLHF
-
Kullback, S. & Leibler, R. A. (1951). On Information and Sufficiency.
https://doi.org/10.1214/aoms/1177729694 -
Shannon, C. E. (1948). A Mathematical Theory of Communication.
https://doi.org/10.1002/j.1538-7305.1948.tb01338.x -
Schulman, J. Approximating KL Divergence.
http://joschu.net/blog/kl-approx.html -
Tang, Y. & Munos, R. (2025). On a few pitfalls in KL divergence gradient estimation for RL.
https://arxiv.org/abs/2506.09477 -
Schulman, J. et al. (2017). Proximal Policy Optimization Algorithms.
https://arxiv.org/abs/1707.06347 -
Christiano, P. et al. (2017). Deep Reinforcement Learning from Human Preferences.
https://arxiv.org/abs/1706.03741 -
Ouyang, L. et al. (2022). Training language models to follow instructions with human feedback.
https://arxiv.org/abs/2203.02155
11.3 MoE、路由与稳定性
-
Jacobs, R. A., Jordan, M. I., Nowlan, S. J. & Hinton, G. E. (1991). Adaptive Mixtures of Local Experts.
https://doi.org/10.1162/neco.1991.3.1.79 -
Shazeer, N. et al. (2017). Outrageously Large Neural Networks: The Sparsely-Gated Mixture-of-Experts Layer.
https://arxiv.org/abs/1701.06538 -
Fedus, W., Zoph, B. & Shazeer, N. (2021). Switch Transformers.
https://arxiv.org/abs/2101.03961 -
Zhou, Y. et al. (2022). Mixture-of-Experts with Expert Choice Routing.
https://arxiv.org/abs/2202.09368 -
Dai, D. et al. (2024). DeepSeekMoE: Towards Ultimate Expert Specialization in Mixture-of-Experts Language Models.
https://arxiv.org/abs/2401.06066 -
Wang, P. et al. (2024). Auxiliary-Loss-Free Load Balancing Strategy for Mixture-of-Experts.
https://arxiv.org/abs/2408.15664 -
DeepSeek-AI (2024/2025). DeepSeek-V3 Technical Report.
https://arxiv.org/abs/2412.19437 -
Puigcerver, J. et al. (2023). From Sparse to Soft Mixtures of Experts.
https://arxiv.org/abs/2308.00951 -
Kimi Team (2026). Kimi K3: Open Frontier Intelligence.
https://arxiv.org/abs/2607.24653 -
Shazeer, N. (2020). GLU Variants Improve Transformer.
https://arxiv.org/abs/2002.05202 -
Zhang, B. & Sennrich, R. (2019). Root Mean Square Layer Normalization.
https://arxiv.org/abs/1910.07467 -
Thinking Machines Lab. Defeating Nondeterminism in LLM Inference.
https://thinkingmachines.ai/blog/defeating-nondeterminism-in-llm-inference/
11.4 RAG 与信息检索
-
Lewis, P. et al. (2020). Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks.
https://arxiv.org/abs/2005.11401 -
Karpukhin, V. et al. (2020). Dense Passage Retrieval for Open-Domain Question Answering.
https://arxiv.org/abs/2004.04906 -
Malkov, Y. A. & Yashunin, D. A. (2016/2020). Efficient and Robust Approximate Nearest Neighbor Search Using HNSW Graphs.
https://arxiv.org/abs/1603.09320 -
Gao, L. et al. (2022). Precise Zero-Shot Dense Retrieval without Relevance Labels (HyDE).
https://arxiv.org/abs/2212.10496 -
Formal, T. et al. (2021). SPLADE: Sparse Lexical and Expansion Model for First Stage Ranking.
https://arxiv.org/abs/2107.05720 -
Robertson, S. & Zaragoza, H. (2009). The Probabilistic Relevance Framework: BM25 and Beyond.
https://doi.org/10.1561/1500000019 -
Cormack, G. V., Clarke, C. L. A. & Buettcher, S. (2009). Reciprocal Rank Fusion Outperforms Condorcet and Individual Rank Learning Methods.
https://doi.org/10.1145/1571941.1572114 -
Edge, D. et al. (2024). From Local to Global: A Graph RAG Approach to Query-Focused Summarization.
https://arxiv.org/abs/2404.16130
结语
把四篇文章真正学会,不是记住更多缩写,而是能反复问出下面五个问题:
- 被比较或被选择的对象是什么?
- 分数是在谁的分布下计算的?
- 这个分数能否求导,梯度是否对应真正目标?
- 离散选择会造成什么容量、负载或召回问题?
- 理论公式经过有限精度、批处理、索引和系统调度后,还剩下哪些保证?
能回答这五个问题,你就不再只是“知道 KL、MoE、RAG 的名词”,而是具备了分析新模型、新论文和新系统的通用框架。