OpenOneRec 的 Stage 2,不是过渡步骤而是能力恢复层

背景

前一轮我已经把 OpenOneRec 修正成“后训练链路已经拆分公开”,不该再被写成“只有前训练底盘”的项目。

但那一轮其实还留着一个没拆开的缺口:

verl_distillation 到底只是 RL 旁边的辅助脚本,还是一个独立的 post-training stage?

如果不把这件事单独写清楚,很容易继续把 OpenOneRec 的后训练理解成一条单线:

  1. 先做推荐 SFT
  2. 再做推荐 RL

这轮我重新回到一手材料,重点核了:

  1. OpenOneRec 根 README
  2. OpenOneRec/verl_distillation 的 README
  3. run_qwen3_distill.sh
  4. data/prepare_distillation.sh
  5. GitHub API 里的仓库与 commits 元数据
  6. 中文传播层里 Arthur Chiao 的 OpenOneRec 长笔记

核完之后,我的判断比“后训练已公开”又往前走了一步。

核心判断

截至 2026-03-21OpenOneRec 公开出来的 post-training 栈,至少已经显式分成两种不同目标的消费者:

  1. general capability recovery
  2. recommendation 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 的方式。

之前我主要在方法表里区分:

  1. feedback source
  2. preference constructor
  3. reward consumption mode
  4. optimization unit

OpenOneRec/verl_distillation 说明,项目级系统里还要再单独记一层:

stage target / capability target

至少先区分:

  1. general capability recovery
  2. recommendation capability enhancement

证据与来源

  • OpenOneRec 根 README 已经把 post-training 明确写成三段:Stage 1 是 multi-task SFTStage 2On-policy Distillation to restore general reasoning performanceStage 3 才是 Reinforcement Learning to enhance recommendation capabilities。这说明官方自己就没有把 post-training 讲成单一 recommendation optimizer。
  • verl_distillation/README.md 把这层的目标写得更直接:它建立在 verl 之上,重点支持 teacherstudent 使用不同词表的 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_MODELTEACHER_MODELDATASET_PARQUET,并设置 algorithm.adv_estimator=on_policy_distillEXTEND_VOCAB_START_TOKEN=151669DISTILL_ADV_MAX=5.0DISTILL_ADV_MIN=-30.0Ray cluster、N_GPUS_PER_NODE=2 与动态 batch。这说明公开链路已经到脚本层,但仍明显不是低门槛、小机即可跑通的公开配方。
  • 同一份 verl_distillation/README.md 还给出了这层最关键的技术动作:distillation signal 是 token-level reverse KL,并通过 distill_special_token_maskextend_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 UTCinit: code2026-01-12 13:19:45 UTCfix environment。这说明它不是后来补上的占位目录,而是首批公开主仓的一部分。
  • 中文传播层这轮也有一个小增量:Arthur Chiao 的 OpenOneRec 长笔记 已经开始把后训练写成 多任务 SFT -> on-policy distillation -> RL,并明确把 Stage 2 说成缓解推荐 SFT 之后的通用能力退化。这说明中文二手叙事开始能看见这层;但我继续补做 site:xiaohongshu.com OpenOneRec distillation 推荐xhslink OpenOneRec 蒸馏 推荐 检索后,仍未拿到稳定高价值的小红书线索。

下一步

  • OpenOneRec/verl_distillationNetflix A-SFT 这类“不是直接 recommendation RL,但在修 post-training 能力结构”的路线放到一起比较,看看它们到底是在修同一种问题,还是分别对应 general capability recoveryoffline reward shaping
  • 在统一方法表里,给项目级 post-training 额外补一列 stage target / capability target,至少先区分 general capability recoveryrecommendation capability enhancement
  • 继续追稳定中文机制稿和 xhslink;如果后续出现专门讲 verl_distillation 或 Stage 2 的中文长文,再补中文传播层观察。