X thread analysis · RESD · 2026-05-15

RESD:失败轨迹不能直接教会模型,除非先把失败解释成可复用的经验

Yuwei Zhang 的 X 线程介绍了论文 Learning with Rare Success but Rich Feedback via Reflection-Enhanced Self-Distillation。它的核心不是泛泛地“让模型反思”,而是在 on-policy self-distillation 中新增一个可持久化的反馈解释层:局部 reflection 诊断失败,global playbook 累积规则,再让 self-teacher 基于这些结构化上下文给 token-level 监督。

材料对象X 线程、Notion Blog、arXiv 2605.12741、GitHub horizon-llm/RESD
论文状态Work in Progress;arXiv v1,2026-05-12 发布
主张一句话原始环境反馈是 diagnostic,不是 instructional;RESD 把它变成可训练监督。
我的判断方向有价值,但证据主要集中在可执行反馈丰富的任务,尚不能外推到所有开放式长程 agent。

1. 来源地图:这条 X 到底指向什么

X 原帖
OpenCLI 读取到 1/N 到 6/N 主线程、最终 Paper/Blog/Code 链接、作者补充的 updated paper link,以及关于 playbook curation 的回复。
论文
作者最初 paper 短链解析到 GitHub `resd` 分支并返回 404;作者后续补发链接解析到 `main/paper.pdf`,PDF 已下载并抽取全文。arXiv ID 为 `2605.12741`。
Blog
Notion 项目页标题为 “Learning from Rare Success and Rich Feedback via Reflection-Enhanced Self-Distillation”,包含 TL;DR、背景、方法图、主要结果图和 citation。
代码
GitHub 仓库 `horizon-llm/RESD` 公开,README 说明基于 veRL 和 SDPO,包含训练脚本、context updater、feedback、datasets、teacher 和 trainer 模块。
读这条推文时最容易误解的一点:RESD 不是把失败样本直接拿来 SFT,也不是简单在 prompt 里塞一句“请反思”。它仍然是 self-distillation:学生模型生成 on-policy rollout,teacher 使用更丰富的上下文重新给每个 token 的概率分布,学生去匹配这个 teacher distribution。

2. 推文主张:失败本身不是学习信号,解释后的失败才可能是

  1. On-policy self-distillation 看起来适合从文本反馈学习,但问题是:它能否真正从 failed trajectories 学到东西?作者的回答是:不太能,除非模型主动解释失败。
  2. 现有 SDPO 在样本充足时会借助 successful peer solutions。一旦限制 rollout 数量,让同一 prompt 没有成功 peer demonstration 可看,性能明显下降。
  3. RESD 的改动是把 raw environment feedback 先变成 local reflection,再把反复出现的经验沉淀进 persistent playbook。
  4. 在 rare-success regime 中,RESD 相比 SDPO 类 self-distillation baseline 表现更强;相比 GRPO,它在早期训练阶段用更少 rollout 更快提升。
  5. 作者还强调了一个机制性观察:RESD 的 teacher 更“纠错”,distillation loss 更集中在 reasoning-decision tokens 上。

作者回复里补充了一个有用信息:去掉 teacher prompt 中的 playbook 会显著掉点,Manufactoria-Has 的 per-test-case accuracy 降 16%,BouncingSim-Easy 降 6%;playbook 的一个关键维护机制是每隔几步压缩,避免过长。

3. 问题背景:为什么 SDPO 会卡在 rare-success 场景

On-policy

训练数据来自当前正在训练的模型自己生成的 rollout,而不是固定离线数据。好处是分布匹配,坏处是当前模型很弱时会生成大量失败轨迹。

Self-distillation

teacher 不是另一个强得多的外部模型,而是学生模型的当前或 EMA 版本,只是 teacher 能看到 privileged context,例如环境反馈、成功样例、playbook。

Token-level supervision

不是只给一条成功/失败奖励,而是在每个生成位置上给一个 teacher distribution。学生优化目标是让自己的 token 分布接近 teacher。

SDPO 的问题在于,它虽然把环境反馈给 teacher 看,但这些反馈很多时候只是诊断性的。例如代码执行失败会告诉你哪个 test case 没过、哪个状态机 parse error,却不直接告诉你“哪一步推理错了、应当如何重构策略”。如果同一 batch 里有成功 peer solution,teacher 可以用成功样例作为正例来纠正失败样本;但当任务初始成功率接近 0,batch 里几乎全是失败时,teacher 就只剩下 raw failure feedback。这时 SDPO 的监督会变弱。

核心瓶颈不是没有反馈,而是 feedback formulation。同样一段失败信息,直接 append 到 prompt 里是被动暴露;先诊断 root cause、提炼规则、维护有效/有害计数后再给 teacher,是主动理解。

4. RESD 方法:从 rollout 到 reflection,再到 playbook,再到 KL loss

RESD workflow

RESD 官方 workflow:student rollout 产生反馈;失败样本进入 reflection 和 playbook curation;teacher 使用 enriched context 生成 token-level log probabilities。

4.1 一次训练 step 发生什么

  1. Student rollout:当前策略 πθ 对 prompt `x` 生成回答 `y`。
  2. Environment feedback:环境执行或评估 `y`,得到 reward `R(x,y)` 和详细反馈 `c(x,y)`。例如 Manufactoria 会检查 DSL 状态机能否通过所有 tape test cases。
  3. Context update:如果 rollout 失败,模型调用 reflector 生成 reflection `r`,解释失败原因,并给已有 playbook 条目打 helpful / harmful / neutral 标签;curator 再把新的、非重复的 lesson 加入 playbook。
  4. Solution buffer:如果 rollout 成功,则把成功轨迹缓存到 solution buffer,之后同一问题或相近训练上下文可以作为 teacher prompt 的成功参考。
  5. Teacher prompt construction:把 playbook、reflection、previous trial、environment feedback 和可用成功解组成 privileged context。
  6. Token-level distillation:teacher 在 privileged context 下计算 token 分布,student 在普通上下文下计算 token 分布,训练 student 去匹配 teacher。

4.2 损失函数直觉

论文把 self-distillation 写成 f-divergence 的统一形式。对每个 token 位置 `t`,teacher 和 student 对 vocabulary 中每个 token `v` 给出概率。令 teacher/student 的概率比为:

τv,t = πθold(v | x, y<t, c, r, P, B(x)) / πθ(v | x, y<t)

然后对所有 token 位置求期望,最小化一个 f-divergence。实现上论文报告默认多用 reverse KL 或 JSD,并对 top-100 tokens 做 distillation。直觉上,这不是奖励某个最终答案,而是在每个位置问:如果 teacher 看到了失败解释和 playbook,它会不会更偏好另一个 reasoning decision?如果会,student 就朝这个方向更新。

LSD(θ) = Ex,y∼πθ [ Σt Σv∈V πθ(v | x,y<t) · f(clip(τv,t)) ]

4.3 playbook 到底是什么

代码里 playbook 不是抽象比喻,而是带 ID、helpful/harmful 计数的自然语言 bullet 列表。典型格式类似:

[ctx-00001] helpful=2 harmful=0 :: When matching a target substring, skip non-pattern symbols instead of rejecting immediately.

reflection prompt 要求模型输出:错误识别、root cause、正确做法、key insight,并给每个已有 bullet 打标签。curator prompt 要求只输出 JSON operations,只新增当前 playbook 缺失的 insight,不重写整个 playbook。`playbook_utils.py` 里会解析 bullet、更新 helpful/harmful 计数,并在重建时丢弃不符合格式的泄漏行。

这点很重要:RESD 的“记忆”不是直接把所有失败日志越堆越长,而是用计数和 concise 策略维护一个紧凑的经验库。论文附录说默认 global playbook 跨训练样本共享,Manufactoria-Has 最多 200 条,BouncingSim/FiNER 等任务最多 120 或 150 条,定期按 staleness 或 priority 删除。

5. 评估:它到底测了什么,结果强在哪里

5.1 任务设置

任务训练/测试量模型输入输出为什么适合测 RESD
Manufactoria-Has742 / 132Qwen3-4B-Thinking-2507输入字符串模式任务,输出 DSL 状态机程序初始成功率接近 0,但执行器能给丰富 test-case feedback
BouncingSim-Easy640 / 100Qwen3-4B-Thinking-2507输入 2D 碰撞场景,输出 Python 模拟代码程序综合 + 物理推理,失败反馈可执行、可定位
BouncingSim-Medium320 / 100Qwen3-30B-A3B-Thinking-2507更难的多物体碰撞模拟测试 30B-A3B 模型在更难程序任务上的提升
FiNER1000 / 500Qwen3-4B-Thinking-2507SEC filings 中金融实体标注初始成功率较高,用来检查有成功样例时 RESD 是否仍有收益

5.2 指标定义

5.3 关键结果

方法Manufactoria-Has Per-Task m@4/b@4Manufactoria-Has Per-Test-Case m@4/b@4FiNER Per-Task m@4/b@4FiNER Per-Test-Case m@4/b@4
Base model0.38 / 1.5225.31 / 60.9739.28 / 51.9069.65 / 79.21
SDPO0.95 / 3.7937.66 / 73.5540.93 / 50.5071.27 / 78.21
SDPO+ss0.57 / 2.2737.97 / 71.9350.25 / 59.1276.15 / 82.21
RESD35.80 / 65.9176.95 / 96.5353.66 / 61.1278.98 / 84.32

最显眼的是 Manufactoria-Has:这是 rare-success 最强的场景。RESD 把 per-task m@4 从 SDPO+ss 的 0.57 提到 35.80,把 per-test-case m@4 从 37.97 提到 76.95。这个不是小幅调参收益,而是从“几乎学不动”到“能系统性修复大量局部失败”。

RESD vs SDPO results

官方 SDPO 对比结果图。注意曲线不是只看最终点,RESD 在 streaming training 的早期也更快抬升。

5.4 和 GRPO 的比较要谨慎读

推文说 GRPO 使用 8 rollouts per prompt,而 RESD 只用 1 rollout per prompt。这是 RESD 的核心样本效率卖点。但这也意味着比较对象本质不同:GRPO 是 group-relative reward optimization,需要多条 rollout 估计组内相对优势;RESD 是单 rollout + teacher context distillation。论文的结论应读成:在有丰富执行反馈的 early-stage bootstrapping 中,结构化失败反馈比单纯多采样 sparse reward 更划算。它不证明 RESD 在训练后期或成功率较高后一定替代 GRPO。

RESD vs GRPO results

官方 GRPO 对比图。论文还报告 per-step latency:SDPO 最低约 400s,RESD 因 reflection/curation 有额外开销,但仍低于 GRPO 的 1200s 以上。

5.5 消融实验说明哪些部件真的有用

变体Manufactoria-Has per-test m@4/b@4BouncingSim-Easy per-test m@4/b@4FiNER per-test m@4/b@4解释
RESD full76.95 / 96.5338.87 / 55.8078.98 / 84.32reflection + playbook + solution buffer 全开
w/o reflection51.41 / 79.2636.85 / 55.3377.78 / 82.26Manufactoria 掉得最狠,说明局部失败诊断是关键
w/o playbook60.65 / 92.3732.95 / 53.6077.42 / 83.07没有持久经验库,跨 step 复用变弱
w/o solution buffer60.24 / 80.1031.97 / 52.4078.36 / 83.42成功轨迹缓存能把局部进展转成完整示范

6. 局限和风险:不要把 RESD 读成通用 agent 记忆解决方案

任务依赖丰富、可信的环境反馈

RESD 的强项是在程序、DSL、执行器、NER 这类可以给明确反馈的场景。开放式写作、主观偏好、长程规划失败,反馈往往不够可验证,reflection 可能会自圆其说。

reflection 本身也可能错

如果模型对失败原因诊断错误,playbook 会沉淀错误规则。代码里有 helpful/harmful 计数和 concise,但这只能缓解,不能保证每条 lesson 都是真因果。

global playbook 有迁移和污染风险

论文默认 global playbook 跨训练样本共享。它适合任务家族规则稳定的 setting;如果任务分布很混杂,旧规则可能误导新样本。

成本不是免费的

RESD 省 rollout,但增加 reflection、curation、teacher prompt 计算。它更像“用推理和记忆换采样”,不是绝对降低所有计算。

结论边界:论文证明的是“在 rare-success、rich-feedback、online streaming 的训练设定下,结构化失败反馈显著改善 self-distillation”。它还没有证明“模型可以靠自然语言反思在所有 long-horizon agent 任务中持续自我改进”。

7. 我的 insight:RESD 真正有价值的地方是把反馈从 prompt trick 变成训练系统状态

我认为 RESD 的贡献不在于“reflection”这个词,而在于它把 reflection 放进了一个可更新、可筛选、可复用、能影响 token-level loss 的闭环。

很多 self-reflection 方法的问题是,反思只发生在推理时:模型失败了,再让它想一想,然后重新回答。这种做法对单题 retry 有用,但不一定会进入参数。RESD 的不同之处是:失败解释先影响 teacher distribution,然后通过 distillation loss 进入 student 参数。也就是说,它把一次失败的自然语言诊断转译成下一次训练更新的 token 概率偏移。

这也解释了为什么它在 Manufactoria 这种任务上效果大:任务有明确的局部规则,失败反馈可执行,reflection 能把 “parse error / wrong tape behavior / infinite loop” 映射成稳定的编程规则。playbook 又让这些规则跨样本复用。相比之下,GRPO 的 scalar reward 虽然更原则化,但在成功样本很少时,reward 只告诉模型“这条不行”,不告诉它“为什么不行”。

如果要把 RESD 用到更一般的 agent memory / continual learning,我会优先看三个问题:第一,feedback 是否足够 grounded,能否被程序或 judge 稳定验证;第二,playbook 是 global、per-task 还是 per-user,如何避免污染;第三,teacher prompt 中的 lesson 如何从自然语言规则升级成可检验的 causal credit assignment。

8. 本次核验命令和本地材料

opencli twitter thread "https://x.com/YuweiZh49446108/status/2054322467347542242" --limit 80 -f json
curl -Ls -o /dev/null -w "%{url_effective}\n%{http_code}\n" "https://t.co/d6xBIQvvDk"
curl -L "https://github.com/horizon-llm/RESD/raw/main/paper.pdf" -o "resd-x-analysis/refs/resd-paper.pdf"
pdfinfo "resd-x-analysis/refs/resd-paper.pdf"
pdftotext -layout "resd-x-analysis/refs/resd-paper.pdf" "resd-x-analysis/refs/resd-paper.txt"
curl -Ls "https://raw.githubusercontent.com/horizon-llm/RESD/main/README.md"
curl -Ls "https://api.github.com/repos/horizon-llm/RESD/git/trees/main?recursive=1"

本地归档:

报告生成日期:2026-05-15。本文档基于 OpenCLI 抽取的 X 线程、Notion 项目页、arXiv 元数据、本地 PDF 全文和 GitHub 仓库 README/代码树交叉核验。