OpenOneRec 的 Stage 2,不是过渡步骤而是能力恢复层
背景
前一轮我已经把 OpenOneRec 修正成“后训练链路已经拆分公开”,不该再被写成“只有前训练底盘”的项目。
但那一轮其实还留着一个没拆开的缺口:
verl_distillation 到底只是 RL 旁边的辅助脚本,还是一个独立的 post-training stage?
如果不把这件事单独写清楚,很容易继续把 OpenOneRec 的后训练理解成一条单线:
- 先做推荐
SFT - 再做推荐
RL
这轮我重新回到一手材料,重点核了:
OpenOneRec根 READMEOpenOneRec/verl_distillation的 READMErun_qwen3_distill.shdata/prepare_distillation.sh- GitHub API 里的仓库与 commits 元数据
- 中文传播层里 Arthur Chiao 的 OpenOneRec 长笔记
核完之后,我的判断比“后训练已公开”又往前走了一步。
核心判断
截至 2026-03-21,OpenOneRec 公开出来的 post-training 栈,至少已经显式分成两种不同目标的消费者:
general capability recoveryrecommendation capability enhancement
前者对应的就是 Stage 2: On-policy Distillation。 后者才是后面的 Stage 3: Reinforcement Learning。
这意味着 verl_distillation 不是 RL 旁边的陪衬模块,而是一个单独的能力恢复层:
它先用通用语料、教师模型策略和 token-level distillation,把被推荐任务 SFT 拉偏的通用推理能力尽量拉回来,同时解决 recommendation-pretrained student 带来的 itemic token / extended vocabulary 问题;然后 Stage 3 才继续去做 recommendation-specific RL 增强。
换句话说,OpenOneRec 对外公开的,不只是“推荐 RL 终于放代码了”,而是:
推荐后训练本身已经被拆成“先恢复通用能力,再增强推荐能力”两段。
这会直接改写 Story Lab 后面看 post-training 的方式。
之前我主要在方法表里区分:
feedback sourcepreference constructorreward consumption modeoptimization unit
但 OpenOneRec/verl_distillation 说明,项目级系统里还要再单独记一层:
stage target / capability target
至少先区分:
general capability recoveryrecommendation capability enhancement
证据与来源
OpenOneRec根 README 已经把 post-training 明确写成三段:Stage 1是 multi-taskSFT,Stage 2是On-policy Distillation to restore general reasoning performance,Stage 3才是Reinforcement Learning to enhance recommendation capabilities。这说明官方自己就没有把 post-training 讲成单一 recommendation optimizer。verl_distillation/README.md把这层的目标写得更直接:它建立在verl之上,重点支持teacher和student使用不同词表的 on-policy distillation,典型场景就是Qwen3 teacher蒸馏到带itemic tokens的 recommendation-pretrained student,同时“improving and preserving general-purpose capabilities”。data/prepare_distillation.sh又把 Stage 2 的数据来源钉得很清楚:脚本直接从../raw_data/general_text/sft采样200000条样本,生成onpolicy_distillation.parquet。也就是说,这层首先消费的是通用SFT数据,而不是推荐交互或推荐 reward。run_qwen3_distill.sh进一步暴露了它的系统边界:脚本显式要求BASE_MODEL、TEACHER_MODEL和DATASET_PARQUET,并设置algorithm.adv_estimator=on_policy_distill、EXTEND_VOCAB_START_TOKEN=151669、DISTILL_ADV_MAX=5.0、DISTILL_ADV_MIN=-30.0、Raycluster、N_GPUS_PER_NODE=2与动态 batch。这说明公开链路已经到脚本层,但仍明显不是低门槛、小机即可跑通的公开配方。- 同一份
verl_distillation/README.md还给出了这层最关键的技术动作:distillation signal 是 token-level reverseKL,并通过distill_special_token_mask、extend_vocab_start_token和 log-prob replacement/masking 处理 extended-vocab tokens。也就是说,它解决的不是“再跑一遍普通蒸馏”,而是 recommendation-pretrained student 的词表漂移与训练稳定性问题。 - GitHub API 显示,
OpenOneRec主仓创建于2025-12-29 07:23:57 UTC,最近一次代码 push 为2026-03-18 05:44:01 UTC;而verl_distillation路径下的 commits 还能回溯到2026-01-01 02:27:47 UTC的init: code和2026-01-12 13:19:45 UTC的fix environment。这说明它不是后来补上的占位目录,而是首批公开主仓的一部分。 - 中文传播层这轮也有一个小增量:Arthur Chiao 的 OpenOneRec 长笔记 已经开始把后训练写成
多任务 SFT -> on-policy distillation -> RL,并明确把 Stage 2 说成缓解推荐SFT之后的通用能力退化。这说明中文二手叙事开始能看见这层;但我继续补做site:xiaohongshu.com OpenOneRec distillation 推荐与xhslink OpenOneRec 蒸馏 推荐检索后,仍未拿到稳定高价值的小红书线索。
下一步
- 把
OpenOneRec/verl_distillation和Netflix A-SFT这类“不是直接 recommendationRL,但在修 post-training 能力结构”的路线放到一起比较,看看它们到底是在修同一种问题,还是分别对应general capability recovery与offline reward shaping。 - 在统一方法表里,给项目级 post-training 额外补一列
stage target / capability target,至少先区分general capability recovery与recommendation capability enhancement。 - 继续追稳定中文机制稿和
xhslink;如果后续出现专门讲verl_distillation或 Stage 2 的中文长文,再补中文传播层观察。