Executable Counterfactuals: Improving LLMs' Causal Reasoning Through Code
这篇论文不是在考模型会不会“把输入改掉,再运行一次程序”。 它刻意把程序内部的随机状态藏起来,只给模型一次真实运行的输入与输出;模型必须先从结果反推出当时可能的隐藏状态,再换输入,并且沿用 同一个隐藏状态 计算替代结果。作者用成对的 code/math tasks 发现:很多强模型会前向计算,却会在这一步“回看事实、恢复隐藏状态”的 abduction 上明显失速;只在 if_else 题上训练时,SFT 的迁移很脆,而 RLVR 更容易保住“先反推、再前向”的策略,但远没有把问题解决。
先拆掉最容易产生的误会
误会一:题目里有 “what if”,就是反事实
不一定。如果题目已经告诉模型隐藏状态 r=0.4,再问把 x 改成 3 会输出什么,模型只需做一次 forward execution。这是 intervention。
严格一些的反事实题会说:曾经输入 x=1,看见输出 y=-1,但 r 没告诉你;如果当时输入是 x=3,同时保持那次运行中的 r 不变,输出会是什么?这里多出来的第一步才是 abduction。
误会二:executable counterfactual 是让模型调用 Python
不是。executable 指研究者可以执行程序或 computational graph,自动得到可核验的答案。论文的 code prompt 反而明确要求模型不要使用外部执行环境,而是在文本中推理。
误会三:RLVR 表现更好,等于模型学会了现实世界因果推理
也不是。模型看见完整程序,因果结构由代码预先给定;它学习的是一类受控 inverse-program problem 的解题策略。这个结果对“如何训练出可迁移的 abduction 行为”很有启发,但没有测试从现实数据发现机制,也没有证明模型内部形成了唯一、显式的 SCM。
先给一个客观判决
| 判决层级 | 最稳妥的表述 |
|---|---|
| 论文有力支持 | 在同一程序上,只把隐藏状态从“给出”改成“需要从事实结果反推”,就会造成很大的性能落差;当前模型的短板不只是 forward computation。 |
| 论文提供了较强但有限的证据 | 只在 if_else synthetic code 上用 RLVR 训练,能比 long-CoT SFT 更好地迁移到更长分支、多个隐藏变量、while loop 和 GSM-style 合成数学题。 |
| 论文尚未唯一证明 | RLVR 学到的是一般性的 causal cognition,而不是逆向求解、搜索、程序模拟或适应该生成器的其他算法。 |
| 论文没有检验 | 未知机制的 causal discovery、现实 observational data、hidden confounding、连续 posterior、真实医疗决策,以及允许 agent 调工具时的表现。 |
最准确的定位是:一个把 abduction 从反事实措辞中剥离出来、变成可执行且可配对检验的受控 benchmark,同时给出一组 post-training 对比证据。
一个直观世界
想象一台封住旋钮的饮料机。每次运行前,机器内部先抽取一个隐藏档位 r,然后读取你按下的按钮 x,输出饮料量 y。
你亲眼看见:
按钮 x = 1
机器输出 y = -1
内部档位 r = ?
现在问:“如果那一次按的是 x=3,输出会怎样?”
你不能重新抽一个档位,也不能随便假设 r=0。你要做的是:
事实证据 (x=1, y=-1)
-> 反推出与事实相容的 r
-> 把 x 改成 3
-> 保持同一个 r,重新计算 y
论文的全部设计都围绕这句“保持同一个 r”展开。它把人们口头上很容易混在一起的两件事分开了:
intervention: 已知世界状态,换动作
counterfactual: 从事实恢复世界状态,再换动作
真实问题与实验设定
程序对应一个小型 SCM
最小图是:
X ----> Y <---- R
X:可干预的输入;R:本次运行中的隐藏随机状态;Y=f(X,R):程序输出。
论文给模型源代码、事实输入 x、事实输出 y 和替代输入 x',但不直接给 r。如果多个 r 都能解释同一个事实输出,正确答案就可能是一个集合,而不是一个数字。
形式上,先找与事实相容的隐藏状态集合:
再计算反事实答案集合:
这也是为什么论文同时报告 set-level F1 和 exact match:模型少找、多找或找错一个可能答案,含义不同。
四类 code task
| split | 程序结构 | 它在检查什么 | 规模 |
|---|---|---|---|
ID if_else |
与训练同类的短分支 | 同分布能力 | 500 |
OOD if_else-long |
更长、更深的嵌套分支 | 长度和组合复杂度 | 480 |
OOD multi_r |
三个隐藏输入,另含简单 for loop |
新 causal structure / 多隐藏状态 | 575 |
OOD while |
训练未见的 while control flow |
新控制逻辑 | 480 |
作者从少量 templates 生成可执行函数:训练侧有 8 个 function templates,并提供 15 组 template/code-block 组合;各 evaluation setup 使用 3-4 个 templates。完整 code block、operators 和 values 都可变化,生成后再 deduplicate。模板候选由 Claude-4-Sonnet 协助起草并经过人工检查。
一对题,只差 abduction
对每个 counterfactual code/math task,作者构造一个 interventional counterpart:代码与数值条件不变,只把原来隐藏的 r 明示出来。这样,两题的 forward computation 基本相同,主要差别就是是否需要根据 (x,y) 回推 r。
从 code 迁移到 math
GSM-style math tasks 把隐藏状态改写成日常叙事里的未知费用、每件附加费或额外物品数量。例如总账单已知,但每盘服务费没写出;先从事实账单反推出服务费,再问订购数量改变后的总价。
ground truth 来自执行 computational graph。作者还会改变隐藏量检查最终答案是否真的随之变化;若不变化,就重新生成该题。
训练比较
- SFT:在 5,500 个、只含
if_else逻辑的 counterfactual code prompts 上训练;reasoning traces 来自 DeepSeek-R1-Distill-Qwen-32B,经 rejection sampling 筛选。训练对象是 Qwen2.5-1.5B/3B/7B-Instruct。 - RLVR:同样从 Qwen2.5 三个规模出发,以 exact match 为 verifiable reward,用 GRPO 做 1,500 steps;prompt batch size 16,rollout size 24。
- 测试:除受控训练模型外,还包含 32B/72B Qwen、Llama-3.3-70B、GPT-4o、Claude-4-Sonnet、R1-Distill-Qwen-32B、QwQ-32B 与 o4-mini。每题采样
k=3,报告 avg@k。
方法或任务流程
对一条 code counterfactual,读者可以把正确流程压缩成下面五步:
- 执行事实路径。 用已知
x沿代码控制流走一遍,把y写成关于隐藏量r的约束。 - Abduction。 解约束,得到所有与事实
(x,y)相容的r;不能因为麻烦就任选一个。 - Intervention。 把输入覆盖成题目给出的
x',不回改事实结果,也不重新抽r。 - Prediction。 对每个相容
r运行替代路径,收集所有可能输出。 - 集合核对。 去重、排序并按要求输出完整集合。
论文在 reasoning-trace 分析中看到的三种典型失败,刚好对应流程被破坏:
- 无目的地穷举所有
r,没有先利用事实约束; - 题目复杂时任意指定一个
r; - 不必要地反复分情况,陷入循环分析。
自己走一遍最小例子
下面不是论文原题,而是一个保持其任务结构的“锁住档位的混合器”:
def mixer(x, r):
if r % 2 == 0:
return (x + r) % 5
return (2 * x + r) % 5
已知 r 只能取 {0,1,2,3}。事实运行是:
x = 1
y = 3
r 未知
问题:如果当时 x=4,保持同一个 r,输出可能是什么?
第一步:abduction,不要先改 x
逐个检查事实运行:
| r | mixer(1,r) |
与 y=3 相容吗 |
|---|---|---|
| 0 | 1 | no |
| 1 | 3 | yes |
| 2 | 3 | yes |
| 3 | 0 | no |
所以事实没有唯一确定档位,只得到:
第二步:intervention
把 x 改为 4,但候选档位仍然只有事实允许的 {1,2}。
第三步:prediction
r=1 -> mixer(4,1) = (2*4+1) mod 5 = 4
r=2 -> mixer(4,2) = (4+2) mod 5 = 1
因此完整反事实答案是:
如果题目直接告诉你 r=1,答案只剩 4;那就是配对的 interventional task。这个小例子也解释了为什么随便猜一个 r 可能“碰巧答中一个值”,却仍然没有完成反事实推理。
关键结果与证据层级
结果一:隐藏 r,会让同一个程序骤然变难
Figure 3 的 paired comparison 是论文最干净的证据。以下都是 exact match:
| model / task | counterfactual | interventional | 落差 |
|---|---|---|---|
o4-mini / multi_r |
42.3 | 85.0 | -42.7 pp |
o4-mini / while |
74.4 | 99.4 | -25.0 pp |
Claude-4-Sonnet / multi_r |
58.8 | 99.5 | -40.7 pp |
Claude-4-Sonnet / while |
46.9 | 89.8 | -42.9 pp |
Qwen2.5-72B / while |
9.0 | 55.1 | -46.1 pp |
它有力说明:forward execution 能力不能代表完整 counterfactual ability。由于两题仍然在信息量和 inverse-search difficulty 上不同,这个 gap 最直接证明的是“abduction-like inverse problem 很难”,而不是单凭分数就证明模型缺少某个唯一的因果模块。
结果二:SFT 擅长见过的形状,却没有保住跨结构策略
以 Qwen2.5-7B 为例,Table 1 的 F1 为:
| model | ID if_else |
if_else-long |
multi_r |
while |
|---|---|---|---|---|
| base | 38.8 | 54.9 | 21.6 | 7.3 |
| SFT | 75.8 | 61.4 | 24.9 | 2.5 |
| RLVR | 81.7 | 75.0 | 40.3 | 11.2 |
SFT 在 ID 上大涨,也能承受一部分“只是变长”的变化;但隐藏变量数量、控制流或问题领域一变,收益缩小,while 甚至从 base 的 7.3 降到 2.5。
结果三:code-to-math transfer 最能显示训练差异,也最能显示离“解决”还有多远
Figure 4 的 GSM-counterfactual accuracy:
| Qwen size | base | SFT | RLVR |
|---|---|---|---|
| 1.5B | 9.0 | 1.5 | 11.0 |
| 3B | 22.0 | 8.5 | 27.7 |
| 7B | 39.0 | 12.9 | 46.3 |
这里 SFT 明显负迁移,RLVR 则在三个规模上都超过 base。但最强的 7B RLVR 也只有 46.3:论文展示的是“更会迁移”,不是“已经可靠”。
结果四:行为痕迹支持“策略与计算是两个瓶颈”
作者用 o4-mini judge 将 trace 分成:
- planning:是否遵守 abduction -> intervention -> prediction;
- execution:程序模拟和数值计算是否正确。
Figure 5 中,大模型的 execution 往往提高,planning 却不随规模单调提高;SFT 的 planning 在 OOD 上下降;RLVR 的 planning 最稳定,但在 multi_r 和 while 上仍因计算错误失分。
这是有价值的诊断性证据,但比自动 ground-truth 分数弱:judge rubric 预先把目标策略写成“正确计划”,它证明输出文本更符合该计划,不等于证明模型内部以 SCM 形式执行,也没有排除模型生成一段合规 trace 后用别的计算得到答案。
综合客观评价
这篇论文最有说服力的贡献不是“RL 胜过 SFT”这句口号,而是它设计了一个很好的差分测量:同一程序、同一替代输入、近似相同的 forward computation,只改变隐藏状态是否已知。这个配对把许多 benchmark 中被措辞掩盖的 abduction 缺口直接暴露出来。
| 证据 | 它真正削弱的解释 | 仍然存在的替代解释 |
|---|---|---|
| paired counterfactual vs interventional gap | “模型只要会执行程序,就会做完整反事实” | 隐藏 r 只是额外 inverse-search / constraint-solving 难度;未必需要独立 causal faculty |
| template-held-out code OOD | 只记住一个具体函数即可 | 仍可能学习少量 template family 上的程序启发式,而不是开放式结构泛化 |
| code-to-GSM transfer | 收益完全依赖 Python surface form | 两域共享相似的合成 arithmetic graph 与隐藏量设计,离自然现实域仍远 |
| RLVR 优于 SFT | teacher-trace imitation 足以稳定迁移 | 两种训练的监督形态、优化轨迹和 compute 不同,不能推出 RL 普遍优于一切 SFT |
| trace planning score | 模型输出完全没有三阶段结构 | LLM judge 的 rubric adherence 不等于内部算法或因果表征 |
所以客观结论应是:论文很好地 operationalize 了“同一背景状态下改动作”这个反事实核心,并给出了 RLVR 在其合成 family 内更能保持该策略的证据;它还没有把“可执行的 inverse program solving”与“普遍的现实 causal cognition”唯一等同起来。
主要局限性
- 机制是已知代码,不是待发现的世界。 模型读到完整
f(x,r),无需从 observational/interventional data 识别 causal structure;它主要在做隐藏输入恢复与程序执行。 - OOD 仍位于小型生成器宇宙。 训练来自 8 个
if_elsetemplates,evaluation 每类只有 3-4 个 templates;while、多r与 GSM 是有意义的结构迁移,但不是任意程序或任意现实机制。 - 隐藏状态被简化成可枚举、可精确核对的值。 现实反事实常涉及连续 latent posterior、噪声、非识别、多种 cross-world coupling 和模型不确定性;这里主要用有限答案集合处理歧义。
- paired gap 不只增加“因果性”,也增加 inverse difficulty。 隐藏
r后,题目同时需要解约束、搜索可能值和维护集合;缺少一个计算量严格匹配但不具因果语义的 inverse-control task。 - RLVR 与 SFT 不是一项只改变学习算法的干净消融。 一个模仿 teacher traces,一个用 1,500-step outcome reward 优化;监督内容、训练动态与算力预算不同,不能据此断言 RL 天生比 SFT 更适合因果推理。
- 最难任务仍然很弱。 Qwen2.5-7B-RL 在
while上只有 11.2 F1 / 8.1 EM;GSM transfer 最高示例为 46.3 accuracy。策略改善和可靠能力之间还有明显距离。 - reasoning-trace 证据依赖单一 LLM judge。 planning rubric 明确规定目标步骤;论文正文所述流程没有给出独立 human agreement 或内部 mechanistic evidence。
- 合成题可能携带 generator artifacts。 templates 和 code blocks 的有限组合、Claude 辅助起草方式,都可能留下可利用的表面规律;deduplication 不能自动排除结构泄漏。
- 现实 high-stakes 外推没有被测试。 医疗例子只是说明图,实验没有患者数据、临床 mechanism uncertainty 或真实决策损失。
- 当前公开可复现面仍不完整。 官方 GitHub 在本次核验时只有 README 和数据链接,没有论文所需的 runnable training/evaluation code;本导读也没有声称复现任何表格。
什么实验会让结论更强
- 增加一个难度匹配的非因果 inverse-control benchmark:同样需要解隐藏量和集合搜索,但不要求 cross-world state persistence,用来分离 causal framing 与 generic inverse computation。
- 把
r扩展成连续、带噪 posterior,要求模型输出 calibrated distribution,而不是有限 exact-match set。 - 构造 observational/interventional marginals 相同、但 cross-world coupling 不同的程序世界;只有真正保持 unit-level background state 才能答对。
- 用独立作者、不同编程语言和非 template-based generators 创建完全新机制,并在变量数、递归、stateful objects、并发与长 horizon 上做 structured OOD。
- 在等训练 token、等 wall-clock、等 rollout compute 下比较 SFT、rejection-sampled SFT、DPO/RLVR 及混合训练,避免把 supervision budget 差异归因为算法差异。
- 对 planning/execution traces 做盲评 human validation,并加入 process intervention:修改模型中间表示或交换 abducted state,检查后续预测是否局部、一致地改变。
- 测试能调用 Python、symbolic solver 或 retrieval tool 的 agent:区分“模型内部算不出”和“系统能否可靠组织 abduction workflow”。
- 完整发布 generator、splits、training scripts、model checkpoints 与每题 predictions,让 paired gap 和 post-training 对比可以独立复核。
论文可以支持什么结论
它可以支持:
- 反事实 evaluation 若不要求 abduction,确实可能高估模型的 Level-3-like ability;
- 在受控 code/math family 中,隐藏状态恢复是比 forward execution 更明显的瓶颈;
- 5,500 个
if_else训练题上的 long-CoT SFT 主要改善 ID,跨 causal structure / control flow / domain 的迁移不稳定; - 本文的 RLVR 配置比相应 SFT 配置更稳定地诱导出可见的 backward-then-forward strategy;
- 正确的反事实计划和正确的程序计算可以异步发展,应该分开评估。
它不能支持:
- 所有被称为 counterfactual 的既有任务都无效;
- 会解 executable counterfactual 就等于发现或理解现实 SCM;
- RL 是改善 causal reasoning 的唯一或普遍最优路线;
- 更大模型不会改善 abduction,或 RLVR 已经解决 OOD counterfactual reasoning;
- code-to-synthetic-math transfer 会自然推广到医疗、科学或政策决策;
- 模型生成符合三步 rubric 的文字,就证明内部存在一个可识别的 causal model。
为什么它与当前研究有关
对当前 portfolio,D1 最有价值的不是把 P17 换成 code benchmark,而是强迫我们写清一个 operational counterfactual 的状态边界:
observed trace
-> abduce active runtime / source / tool / worktree / projection regime
-> apply one repair intervention
-> predict the trace under the same relevant background state
如果只把 repair 换掉、却重新假设了 source access、tool state 或 runtime regime,那仍然只是另开一个世界,不是“同一个事故如果换一种修复会怎样”。
它也为 DiscoSCM 留下一条更具体的后续问题:D1 的 r 把 unit identity、event noise 和 regime 压在一个隐藏量里。我们可以测试显式拆开这些对象后,agent 是否能更稳定地保持“同一个 unit / 同一事件背景”,并在 regime shift 或 noise-coupling 变化时给出 calibrated counterfactual。这个问题要靠新实验回答,不能把 D1 的结果直接当成 DiscoSCM 的证据。
推荐阅读顺序
- Figure 1 + Section 2:先看 code 例子,真正理解 counterfactual 与 interventional 只差在哪里。
- Section 3.1 + Figure 2:看 templates、三层 placeholders、modulo 为什么产生多个合法答案,以及四种 code structure 如何划分 ID/OOD。
- Section 3.2:看 GSM-style hidden fee 如何把同一结构移到自然语言数学题。
- Figure 3:先读 paired gap,不要先被训练方法吸走注意力;这是最核心的 benchmark evidence。
- Table 1 + Figure 4:逐列比较 base / SFT / RLVR;特别看
while的绝对低分和 GSM 上 SFT 的负迁移。 - Section 5 + Figure 5:区分 planning 与 execution,并把 LLM-judge evidence 放在正确层级。
- Appendix D:核对作者为何认为许多“counterfactual”会退化成 intervention。
- Appendices H-I:直接读 counterfactual/interventional prompts,确认两种任务实际给了模型哪些信息。
- Appendix K:最后核对 5,500 条训练数据、1,500 RL steps、测试集规模与 sampling protocol。
论文来源与相邻阅读
- arXiv abstract: https://arxiv.org/abs/2510.01539
- arXiv HTML: https://arxiv.org/html/2510.01539
- Paper PDF: https://arxiv.org/pdf/2510.01539
- OpenReview forum: https://openreview.net/forum?id=Lm46gJA0q8
- Official author repository: https://github.com/AniketVashishtha/Executable_Counterfactuals
- Released dataset surface: https://huggingface.co/datasets/Raidriar-Dai/executable-counterfactuals
- Source boundary: arXiv HTML/PDF, official repository and released dataset surface were checked on 2026-07-10; OpenReview body was challenge-gated in this environment; no experiment was rerun.