论文精读

精读:One-Shot OPD —— 一条 query 够不够,取决于它走出多宽的状态

把 on-policy 蒸馏的训练集砍到只剩一条 query,学生仍拿回全量数据八成以上的增益;用状态覆盖率与吸收速率两把尺子说明 OPD 是数据过饱、算法饥饿

论文: Rethinking On-Policy Distillation of Large Language Models II: One Training Example
作者: Zixuan Fu, Bingxiang He, Yuxin Zuo, 等 13 人
arXiv: 2609.04172
One-Shot OPD On-Policy Distillation State Coverage 吸收速率 数据效率 知识蒸馏 cs.LG

1 论文概览

一句话总结:在 on-policy 蒸馏里把训练集砍到只剩一条 query,学生照样能跑几百步、拿回全量数据八成以上的增益——因为 OPD 真正消费的不是 query,是 query 的 rollout 走出来的状态,而卡住训练的是学生吸收监督的速率,不是监督的供给量。

核心问题

on-policy 蒸馏(OPD)已经进了前沿后训练的标配流水线。论文开篇点名 Qwen3、MiMo、GLM-5、DeepSeek-V4、Kimi K3 五套栈都在 SFT 与 RL 之外挂了 OPD。它的机制不难说清:学生自己采样 rollout,教师在每一个访问到的前缀上给出完整的下一 token 分布,于是监督是 token 级、稠密的,而不是 RLVR 那种一条轨迹一个标量奖励。

已有的解释工作几乎全站在算法那一侧——更新几何、哪些 token 可学、什么时候失效。数据那一侧是空的:没人问过 OPD 到底需要多少条训练输入,也没人问数据和算法怎么互相牵制。这篇论文把 RLVR 领域的 one-shot 控制实验搬过来,直接把训练集压到极限:一条 query。

对本专栏来说,这个问法的位置很特殊。前五期——DART-SD 换标注粒度、SPADE 让模型自造环境、OPSA 把教师整个拿掉、Terminal-Universe 把轨迹反演成环境、Compile by Training 把提示词编译成权重——全都在数据侧做功。这篇给出的答案是:数据侧的功,很大一部分做在了非约束条件上。

主要贡献

  1. 确立 one-shot OPD 现象。单条 query 在数学推理上跑到 68.5 分,全量数据 69.8 分;第 300 步拿回教师-学生差距的 69%、全量增益的 87%。跨三个师生族(R1-Distill-1.5B、Llama-3B-It、OLMo-7B-It-DPO)与四个域(数学、代码、指令遵循、agentic 工具调用)都成立,后三域的差距回收率分别是 73%、66%、64%。
  2. 提出 state coverage 这个可测量。把状态表示成教师最后一层的隐向量,PCA 降到 50 维后 K-means 切成 200 个簇,一个设定的覆盖率就是它的 rollout 触达的簇占比。单条 query 触达 71.5%,16 条语义各异的 query 触达 98.9% 并追平全量。
  3. 把「数据多样性」还原成「状态多样性」。off-policy 侧固定 query 只改保留的轨迹条数(1/4/16/64),精度单调上升;on-policy 侧沿语义簇加 query,精度与覆盖率同步上升。加一条 query 值多少钱,由它是否触达新状态决定。
  4. 测出吸收速率并证明它与数据量无关。学生与教师的距离全程在降,降的比例逐步变小;1、4、16、全量四档到第 300 步各自吸收掉步 30 距离的 78%–84%,慢化因子也在同一量级。固定住状态的 off-policy 消融同样要跑几百步。
  5. 把结论推到多教师与无内容输入。MOPD 下每域 16 条 query 拿回全量 101% 的增益;空模板与领域外的 WildChat 闲聊 query 也贴着真题基线跑。

论文自己把这套结果压成一句判词:OPD 是「data-overfed but algorithm-starved」(数据过饱、算法饥饿)。


2 方法详解

方法概述:训练单位是状态,不是 query

整篇论文的推理链条建立在一次单位换算上。一条 query xx 配一条采样出的响应 yy,在每个 token 位置 ii 上产生一个状态 s=(x,y<i)s=(x,y_{<i}),每个状态都配一份教师分布。每步 64 条 rollout,单条 query 一步就能生出上万个受监督状态。于是「训练集有多少条 query」这个计数方式,严重低估了 OPD 实际拿到的监督量。

OPD trains on states rather than queries. […] With 64 rollouts per update, even a single query yields tens of thousands of supervised states, so query count can substantially understate the amount of supervision available to OPD.

(OPD 训练在状态上而非 query 上。每次更新 64 条 rollout,哪怕单条 query 也产出数万个受监督状态,所以 query 计数会大幅低估 OPD 可用的监督量。)

—— §4.1 Setup

单位一换,「一条数据够不够」就不再是个反直觉的问题,而变成「一条 query 的 rollout 能走多宽」。

关键创新点一:state coverage 的三段构造

覆盖率要有意义,参照系必须先立住。论文的做法分三步:

  • 表示:状态取教师最后一层在该状态末 token 上的隐向量,称为 teacher signature。
  • 参照空间:全量 OPD 在 DAPO-Math-17K 上整轮跑下来的状态汇成池子,按优化步而非随机采集——第 1 到 500 步每步取 5 条 rollout,其中 3 条建簇、2 条留出,得到 12,000 个参照状态与 8,000 个留出状态。
  • 切簇:PCA 降到 50 维(保留 71.9% 方差)后 K-means 切 200 簇,覆盖率是触达簇数占比。

留出那一份是这套构造的关键控制。簇是用全量 rollout 拟合的,如果不留一份新鲜样本,「全量覆盖 100%」就是同义反复。留出集在同预算下也跑到 100%,说明这个天花板是全量 OPD 真能达到的水平,而非构造保证的上限。

覆盖率只记「触达没触达」,不记「访问多少次」。这条设计取舍论文写在明面上,它也是后面几处松动的源头。

关键创新点二:距离与吸收速率

算法侧用两个量描述对齐状态。距离 dtd_t 是学生访问到的位置上教师-学生对数概率差的平均绝对值——取绝对值是为了防止正负抵消,让 dtd_t 只在两者真正达成一致时才趋零。吸收速率 vt=(dt−dt+1)/dtv_t=(d_t-d_{t+1})/d_t 是一次更新吃掉剩余距离的比例。

两处测量约定值得留意:从第 30 步起测(此前梯度裁剪一直生效,被裁过的更新不是目标函数要的那个更新);每条 run 对自己第 30 步的值归一化(各 run 在自己访问的状态上测距离,起点电平本就不同)。

关键创新点三:固定状态消融

on-policy 训练的状态会随学生漂移,于是「跑得久」有个平凡解释:新状态一直在供。论文用一次消融直接掐掉这个解释——always-off-policy 那条 run 只用初始学生一次性采出的 64 条轨迹,反复喂给每次更新,训练状态全程冻死。

结果是这条 run 稳定涨了约 200 步才停,对齐指标也是几百步的量级才动完。新状态供给不是 run 长度的成因。

与基线方法的区别

论文最有信息量的对照不是全量 OPD,是 one-shot RLVR。两者表面现象一致(单条 query 撑起上千步更新),学习信号的来源完全不同:

one-shot RLVRone-shot OPD
信号来源每条轨迹一个可验证结果每个访问状态一份教师分布
对输入的要求任务可验证,且结果要有波动rollout 能暴露教师-学生落差
失效方式学生学会解这道题后组内近乎一致,GRPO 无优势可用落差逐步收窄,吸收速率持续下降
天花板不绑在教师分布上训练目标就是匹配教师分布

One-shot RLVR is therefore limited by the outcome variation available from its query. One-shot OPD is instead limited by how quickly it absorbs dense teacher supervision.

(one-shot RLVR 受限于它的 query 能提供多少结果波动,one-shot OPD 受限于它吸收稠密教师监督的速度。)

—— §7.2

这张对照解释了一件容易被忽略的事:OPD 对训练输入的要求比 RLVR 松得多。RLVR 需要一道能判对错、且当前学生做起来有输有赢的题;OPD 只需要一段能走出落差的推理。难度与可验证性都不再是硬约束。


3 实验结果

主要指标

数学推理上,第 300 步 one-shot 68.5 对全量 69.8,回收教师-学生差距的 69%、全量增益的 87%。往后两条曲线维持在约 3 分的带内,到第 1000 步 one-shot 68.4、全量 72.1,回收率 72%,整段区间在 62%–89% 之间浮动。

跨族与跨域都稳。三个师生族的末检查点分别从 77.1、28.2、70.8 涨到 85.5、40.2、82.4。代码生成、指令遵循、agentic 工具调用的差距回收率是 73%、66%、64%。

鲁棒性一栏最刺眼的是难度那一项。论文按训练前 8 次 rollout 的通过率挑了三条 query:8/8(易)、4/8(中)、0/8(难)。难那条在整个训练里从未被解对,one-shot 增益照样出现。稠密教师信号在错误 rollout 上依然带信息量,这是 OPD 与 RLVR 的分水岭——RLVR 拿到全错的组就没有优势可算。

与参照方法的对比

这是一篇机制论文,没有 SOTA 榜。它的参照有两层:

对全量 OPD。第 300 步 1.3 分之差,第 1000 步 3.7 分之差。

对 one-shot RLVR。同一条中等 query、同为每步 64 条 batch(RLVR 每 query 采 8 条按结果打分,OPD 采 1 条按 token 对教师打分)。1000 步内 OPD 闭合 72% 的教师差距,验证精度增益是 RLVR 的两倍以上;换成按 rollout token 对齐,这个优势仍在。

MOPD 一层。一个 R1-Distill-1.5B 学生在数学、代码、指令遵循三域上单轮训练,每域路由到自己的教师。全量 MOPD 把均分从 43.5 拉到 52.8(回收 79% 差距),三个分开训的全量 OPD 达到 53.8,差 1.0 分——多域合训本身没塌。每域 16 条 query 把均分从 one-shot 的 50.1 拉到 52.9,对全量 52.8 的增益回收率 101%,分域看是数学 93%、代码 136%、指令遵循 109%。

消融实验关键发现

覆盖率的时间形状。单条 query 第 100 步已触达 65.9%,之后 200 步只再加 5.6 个百分点,第 300 步到 71.5%。最终覆盖率的 92.2% 在前三分之一的步数里就完成了。同一条 run 的验证精度从 59.1 涨到 66.9,全量同步是 70.8。

多样性的因果拆分。off-policy 侧把 query、batch、优化预算全固定,只改保留轨迹数(1/4/16/64),精度单调上升——多出来的只有状态。on-policy 侧沿 BGE-M3 语义簇取代表,16 条追平全量,覆盖率从 71.5% 同步升到 98.9%。附录 B.2 的两个控制把「条数」和「多样性」分开了:条数固定在 16、取自 16 个语义簇比取自 1 个簇,覆盖率与精度都陡升;而固定 query 集合的训练顺序不影响结果。

吸收速率的四档对照(附录 Table 7):

设定(query 数)1416全量
d300/d30d_{300}/d_{30}0.160.170.180.22
v50/v200v_{50}/v_{200}5.65.24.26.4

学习率只做横轴缩放(附录 C.2)。半倍、一倍、两倍学习率三条 run,把横轴从步数 tt 换成 u=(lr/10−6)tu=(\mathrm{lr}/10^{-6})t 后基本重合,离散度从约 2.2 倍收到约 1.1 倍。学习率决定沿曲线走多快,不改曲线形状。慢化的成因没被碰到。

无内容输入的压力测试。空的 user turn 加一个 <think> 起头、同模板加一行领域系统提示、以及 WildChat 的通用闲聊 query(192,824 条,保守启发式判定只有 0.17% 与数学有关、2.63% 与代码有关)——三种条件都贴着真题基线跑,基线把三基准均分从 59.1 拉到 69.8,三者各用了它三分之一到二分之一的 rollout token 就到了同一水平。显式领域内容在这些实验里只值约 1 分。

这里有一条边界值得抄下来:把 think 块立刻闭合的脚手架(<think>\n</think>\n)会塌成简短的元层回复,训不了。「内容不重要」的真正条件是「必须诱导出一段足够长的推理」。论文自己也把话说紧了:

These results do not imply that task content is generally dispensable. They show that content is not the only source of useful signal in OPD.

(这些结果并不意味着任务内容普遍可弃。它们说明的是,内容不是 OPD 里唯一的有用信号来源。)

—— §7.1


4 个人分析

亮点

单位换算做得干净。「一条 query 够不够」是个措辞陷阱,因为 query 不是 OPD 的消费单位。把计数单位从 query 换成状态之后,反直觉消失,剩下的是一个可测量的量。这类工作的价值在于它让后续研究不必再重复惊讶。

三条腿的论证互相咬合。数据侧证明「一条 query 覆盖得已经很宽」,算法侧证明「慢化与数据量无关」,固定状态消融证明「run 长不是因为新状态在供」。任何一条单独拿出来都能被平凡解释吃掉,三条摆在一起才逼出「瓶颈在优化器」这个结论。

难题那条 query 全程没被解对。这是全文最有说服力的一个细节。它把 OPD 与 RLVR 的差别从「稠密 vs 稀疏」这种抽象说法,落成了一个可复现的现象:训练样例本身正确与否不进入 OPD 的信号通路。

自陈局限写得比多数论文诚实。§9 把 state coverage 的三重弱点一次列全:它是语义级代理、参照系由全量 rollout 定义(所以只能报「触达了那个空间的多少」而非「它自身覆盖了什么」)、每个簇等权而不管访问频次与残余教师信号量。这三条后面各自都能长出问题。

局限性

覆盖率随分辨率单调滑落,没有收敛平台。附录 Table 4 把分析在 K∈{50,100,200,500}K\in\{50,100,200,500\} 上重跑:

KK1-shot4-shot16-shot全量(留出)
500.7550.8291.0001.000
1000.7270.8031.0001.000
2000.7150.7980.9891.000
5000.5640.6950.9040.956

论文的读法是「更细的簇拉低绝对覆盖率,但 1→4→16 的序关系不变,16-shot 仍贴近全量」。序关系确实稳。可头条那个 71.5% 长在 K=200K=200 上,而 KK 从 200 走到 500 时,1-shot 掉 15.1 个百分点,天花板本身也从 100% 掉到 95.6%(按天花板归一化后 1-shot 是 59.0%,比 K=200K=200 的 71.5% 低 12.5 个百分点)。四个取值里看不到任何趋于平稳的迹象——分辨率越接近真实状态粒度,覆盖率越低。71.5% 这个数字的量级由簇的粗细决定,它支撑「序关系」够用,支撑「一条 query 已覆盖大半状态空间」这种绝对表述则偏弱。而后者才是摘要里的说法。

风险精确地落在被当作头条的那一档。附录 Table 6 另测了一个诊断量:某状态到它最近 10 个参照状态的平均余弦距离(在未降维的 1536 维空间里),超过留出全量状态第 95 分位就记为 off-reference。

设定超阈比例平均距离AUROC
1-shot17.2%0.2830.552
4-shot4.4%0.2180.477
16-shot3.8%0.2310.512
全量(全池)4.0%0.2150.476

阈值按第 95 分位设,基准线就是约 5%。1-shot 的 17.2% 是全量 4.0% 的 4.3 倍,约每 5.8 个状态就有一个落在教师监督未经校验的区域。论文用 AUROC 0.552 接近随机来收束这一段,说 one-shot 的状态整体上与全量不可分。两句话都对,量的却是两件事:AUROC 量整体可分性,超阈比例量尾部。稳态误差与尾部风险在部署里从来不是同一回事。更值得记的是 4-shot 已经回落到 4.4%、16-shot 3.8%——尾部问题只在 1 这一档存在,而 1 正是摘要拿出来的那个数。修起来很便宜,但「一条就够」这个处方本身携带这个尾部。

残余距离与验证精度反向。把附录 Table 7 与 §4.1、§4.2 的精度并排看,会出现一组尴尬的对应:d300/d30d_{300}/d_{30} 随数据量单调上升(0.16 / 0.17 / 0.18 / 0.22),意思是 1-shot 吸收掉了 84% 的初始距离、全量只吸收 78%;而验证精度的方向相反,1-shot 66.9、全量 70.8,差 3.9 分。在自己访问的状态上与教师对齐得最好的那一档,泛化最差。

这不是测量错误,dtd_t 的定义就写明「在该 run 自己访问的位置上测」,所以它本质是一场自出题的考试:状态越集中,越容易考高分。可论文把这张表只用来论证「慢化速率与数据量无关」,没把两列并排读。并排读的结论要更重一些——教师-学生距离在自访问状态上的闭合程度,不是学生能力的单调代理。而「OPD 的任务是闭合教师-学生差距」正是全篇的框架前提。那张表里 16-shot 的慢化因子 4.2 与全量的 6.4 差了 1.52 倍,被归进「similar factor」也略显宽松。

教师与学生同尺寸。Table 1 的配对里,1.5B 学生配 1.5B 教师(R1-Distill-1.5B ← JustRL-1.5B),最大的学生是 OLMo-7B。论文动机引的是 Qwen3、GLM-5、DeepSeek-V4、Kimi K3,那些栈里教师比学生大一到两个数量级。同尺寸配对下两者的状态分布天然高度重合,一条 query 的 rollout 能覆盖教师值域的比例自然高。换成远大于学生的教师,「学生 rollout 触达的状态」与「教师有能力给出高质量监督的状态」之间的错位会扩大,71.5% 这个量级没有理由平移过去。论文把「更大的学生」列进 future work,等于承认了这一点。

固定状态消融只覆盖前 200 步。§5.3 的 off-policy run「稳定涨约 200 步然后停」,而 on-policy 的 one-shot 能跑到 1000 步。「移除新状态供给不缩短 run」在前 200 步内立得住;恰好第 300 步之后才是全量把差距从 1.3 分拉到 3.7 分的区间。这段区间里新状态供给的作用没有被这次消融覆盖。

对大模型领域的影响

先说这篇对本专栏主线的冲击。前五期都在数据侧做功:换标注粒度、自造环境、拿掉教师、反演轨迹、编译提示词。这篇把靶子挪了——如果 OPD 阶段的绑定约束是吸收速率而不是监督供给,那么大量投在 OPD 数据集筛选上的工程量,投在了不起作用的那一维上。它与第三期 OPSA 合起来读格外锋利:OPSA 说 OPD 的教师监督有相当比例是噪声,这篇说 OPD 的数据量从 17k 砍到 1 也基本不掉。教师和数据两侧都严重过剩。

「一条够了」有明确的时效性,别当成无条件结论。把论文自己的数字排一下:第 300 步 one-shot 68.5、全量 69.8,差 1.3 分;第 1000 步 one-shot 68.4、全量 72.1,差 3.7 分。差距放大到 2.85 倍,而这中间 one-shot 净变化是 −0.1 分(走平),全量净涨 2.3 分。论文自报的全量增益回收率从 87% 掉到 72%,掉了 15 个百分点,说的就是这件事。所以准确的表述是「一条 query 够用到几百步」,而不是「一条 query 够用」。真正的数据规模效应出现在长训练的尾部——恰好是前沿栈实际工作的区间。

全篇最没被兑现的数字埋在附录 E.1。代码生成域的四种输入条件末端相差不到 1.7 分,而同样 500 步里,真题基线花了 2.77 亿 rollout token,空模板只花了 1800 万——15.39 倍,省掉 93.5%。论文把这一段摆在「内容可不可弃」的框架下,读作数据故事。可 on-policy 蒸馏的主成本从来是 rollout 生成,这个数字是算力故事:空模板诱导的推理更短,于是每步更便宜。真题在数学域只换来约 1 分。一篇把「data-overfed」写进结论的论文,手里握着一个 15 倍的算力杠杆而没有展开,这是全文最大的未兑现资产。

方法论层面的迁移价值高于结论本身。「把一个流水线阶段的计价单位换成它真正消费的单位,再测覆盖率」这套动作可以照搬。RLVR 的计价单位是可验证任务,实际消费的是优势有波动的组;SFT 的计价单位是样本,实际消费的是梯度方向。每次换单位都会暴露一批被误配的工程投入。


5 实践启示

可以借鉴的技术

用状态覆盖率而非样本条数来定 OPD 的数据预算。可落地的近似做法:拿现有全量 run 的 rollout 抽一批状态、取教师末层隐向量、PCA 后 K-means 建一次参照空间,然后测候选 query 集的触达簇占比。论文把「不依赖全量 run 就能从 query 本身估覆盖率」列为 future work,这一步目前还得先付一次全量的钱。KK 要扫一遍再定——Table 4 已经说明单个 KK 的绝对值不可靠,序关系才可靠,所以把它当排序工具用、别当验收指标。

按语义簇取代表,而不是按难度或来源分层。附录 B.2 的控制很干净:条数固定在 16 时,取自 16 个语义簇远好于取自 1 个簇,而固定集合的训练顺序无影响。这直接给出选样规则——先聚类再每簇取一条,比按难度分层更贴近 OPD 真正消费的东西。顺序无影响这一条也顺手省掉了课程学习那套设计。

在 OPD 阶段把优化预算的优先级放在数据预算之上。论文的 future work 给了两个具体方向:一个 batch 在每 token 落差的信任域约束下复用几个 epoch;按 token 残余教师信号量加权。这两条都是冲吸收速率去的,与「再洗一遍数据集」相比更贴近绑定约束。

教师选择的权重要往上调。§9 那句判词是全篇对数据工程最直接的一句话:

An input need only start the student reasoning, which turns data design from collecting problems into choosing teachers.

(输入只需要让学生开始推理,这把数据设计从收集题目转成了挑选教师。)

—— §9 Conclusion

在 1.5B 到 7B 这个尺度、教师与学生同族同尺寸的设定下,这句话有实验支撑。往上放大要自己重测。

空模板可以先当算力探针用。这是把附录 E.1 那 15.39 倍变现的低成本做法:新配一对师生时,先用空模板跑一次短程 OPD,看学生是否进入长推理、教师落差是否张开。它花的 token 是真题的十几分之一,而附录的四条曲线末端相差不到 1.7 分——作为管线连通性与师生匹配度的冒烟测试,性价比很高。注意那条边界:think 块必须留着让学生填,立刻闭合会塌成元层回复。

潜在应用场景

数据采集最贵的那些域优先受益。agentic 工具调用、长上下文、多轮交互,这些域的训练数据单价最高。论文在 agentic 工具调用上测到 64% 的差距回收率——不算亮眼,但它对应的是 xLAM-function-calling-60K 换成一条随机采样的 query。按采集成本折算,这个比价关系很划算。

多教师流水线的域预算可以先压到 16 条量级探底。§6 的每域 16 条拿回 101% 增益(分域 93%/136%/109%)给了一个明确起点。论文自陈只测了三域各一个教师,教师数量增加后能推到哪里未知,所以把它当探底的起点而非配置模板。

教师-学生同尺寸的场景可以直接抄配置。Table 1 里 R1-Distill-1.5B ← JustRL-1.5B 这种「同族、同尺寸、教师后训练更充分」的配对,正是内部小模型迭代的常见形态:上一版模型经过一轮 RL 之后作为教师,把能力灌给下一版基座。这个设定与论文实验条件重合度最高,71.5% 与 16 条这两个数在这里最可信。

给蒸馏流水线加一个吸收速率看板。dtd_t 与 vtv_t 都只需要教师和学生在同一批状态上的对数概率,蒸馏流水线本来就在算。把 v50/v200v_{50}/v_{200} 这类慢化因子挂成监控项,能把「该加数据还是该改优化器」从拍脑袋变成读数。两条测量约定要跟着抄:从梯度裁剪不再生效之后开始测,每条 run 对自己的起点归一化。

别把结论外推到 RLVR。§7.2 的对照说得很清楚,两种目标函数对输入的要求不一样:RLVR 需要可验证且结果有波动的题,OPD 只需要能走出落差的推理。「数据不是瓶颈」这句话在 OPD 里有条件成立,搬到 RLVR 上不成立——那里 query 一旦被稳定解对,GRPO 的组内优势就消失了。


参考文献

  • Zixuan Fu, Bingxiang He, Yuxin Zuo, Haohuan Huang, Jinqian Zhang, Ruhang Xiao, Cheng Qian, Qinyu Luo, Huan-ang Gao, Yudong Wang, Zhiyuan Liu, Ning Ding, Chaojun Xiao (2026). Rethinking On-Policy Distillation of Large Language Models II: One Training Example. arXiv:2609.04172 [cs.AI]. 清华大学、中国科学院大学、东北大学、伊利诺伊大学厄巴纳-香槟分校、约翰霍普金斯大学。代码:https://github.com/Thinking-Space/One-Shot-OPD
  • Wang et al. (2026a). one-shot RLVR。本篇 one-shot 控制实验的先例,§7.2 的对照对象。
  • Li et al. (2026). OPD 成败条件分析,top-kk token 重合率指标的来源(§2.3 Eq.4)。
  • Armandpour et al. (2026). 教师信号在错误 rollout 上仍具信息量,§8 用它解释难题 query 为何有效。

相关精读

本专栏连续四十三期追问同一个问题:训练数据这一侧还能榨出多少东西。