Summary

From Brewing to Resolution: Tracing the Internal Lifecycle of Code Reasoning in LLMs

  • 核心: LLM 做 code reasoning 时,答案先以「线性可读」的形式 brew(酝酿)出来,要再过约 38% 的网络深度才变成模型自己能 decode 的形式;这条 brewing→resolution 生命周期把「相同 accuracy」背后截然不同的失败模式区分开。
  • 方法: dual diagnostic——layer-wise linear probing(信息 availability)+ Context-Stripped Decoding / CSD(信息 readiness),两者交叉定义 FPCL/FJC 两个临界层,把每条轨迹归入 Resolved / Overprocessed / Misresolved / Unresolved 四类,再用三组因果干预坐实。
  • 结果: 6 个 code 任务族 × 16 个模型(0.5B–14B,Qwen/Llama/DeepSeek)。整体仅 41.5% Resolved,三个任务 <30%;Function Call 随调用深度 1→3 从 61.1% 崩到 2.5%。brewing scaffold 在所有 16 个模型稳定(归一化时长 24–42%),而 resolution 成功率随 capability/scale/训练变化
  • Sources: paper | github
  • Rating: 2 - Frontier (Owner 本人共同一作;新颖的「双诊断 + 生命周期 taxonomy」实证框架,scaling 实验仍在进行,是后续要继续 build 的 frontier 工作)

Key Takeaways:

  1. Availability ≠ Readiness(核心 asymmetry): 答案「能被外部线性读出」和「模型自己能用」是两件事,中间隔着 brewing 区间。这是全文的概念支点。
  2. 四类结局,不是事后贴标签: Resolved / Overprocessed / Misresolved / Unresolved 每一类都有匹配的因果干预(patching / layer-skip / re-injection)产生 outcome-specific 效应,证明它们对应真实计算状态。
  3. Mechanism 与 capability 解耦: 训练/规模/架构改变的是「resolution 成功率」(capability),几乎不改变「转变发生在哪」(mechanism)——scaffold 是稳定经验规律。
  4. 两种失败要相反的药: Overprocessed(晚层把对的算坏,26.4%)该早退;Unresolved(深度不够,23.7%)该加深。任何单一 early-exit 策略都必然顾此失彼。

Teaser. Figure 1——单样本的 brewing-to-resolution 轨迹。 probing 先变对(答案线性可读),CSD 隔几层才追上(模型自己能 decode),FPCL→FJC 之间就是 brewing 区间;到达 FJC 后轨迹再分叉成四种结局之一。


1. 问题:accuracy 掩盖了内部的异质性

同一个模型,能轻松 trace 变量赋值,一旦引入算术就变脆;能处理显式 loop,却在语义等价的 unrolled 序列上栽跟头。实验里 Value Tracking 有 70.8% Resolved,而只需顺序算术的 Loop-unrolled 只有 28.0%——这个 gap 在 task-level accuracy 上完全不可见。两个 accuracy 相近的模型,内部可能以完全不同的方式失败。

论文把 interpretability 的提问从「某层 编码了什么(what is encoded)」转向「该层 是否已经解出了问题(whether it is solved)」。信息可能已存在于 hidden state,却还没组织成模型能稳定利用的形式。于是拆成两个可操作的问题:

  • information availability:答案何时变得「外部可读」?
  • information readiness:答案何时变得「模型自己可用」?

2. 方法:双诊断框架

设 decoder-only transformer 有 层, 是处理源 prompt (代码片段 + 问题后缀 )时第 层最后一个 token 的 hidden state。答案恒为单个数字 ,保证跨 tokenizer 都是单 token,于是诊断空间统一为 11 类(10 个数字 + 1 个非数字 residual 类 )。

两个诊断函数都把 映到这 11 类的概率单纯形上:

Equation 1. Linear Probing(availability)

含义:逐层训一个 logistic 分类器,问的是「答案是否已经以简单(线性)形式存在于表征里」——这是一个 必要条件 式提问。为防止 probe 钻分布捷径,额外加了一个 near-OOD residual 类和对应训练样本(control task 思路)。

Equation 2. Context-Stripped Decoding / CSD(readiness)

含义:受 Patchscopes 启发——把源 run 的 注入到一个只保留问题后缀、抹掉代码上下文 的 target prompt 里,让模型从 层继续跑完。 单独 clean forward 的 baseline logit,减掉它来抵消语言先验、隔离出 自身携带的信号。若 ,说明该 hidden state 是 self-contained 的:模型自己的 decoding pipeline 不回看代码就能产出正确答案。

核心 asymmetry 测「外部线性读出能否提取答案」(availability), 测「模型自己抹掉上下文后能否 decode」(readiness)。两条诊断曲线沿深度扫描、看它们在哪里一致 / 分歧,就描出了 code reasoning 的内部展开过程。

❓ CSD 的关键假设是「注入到一个抹掉 的 prompt 后还能反映 的真实可用性」——但 本身是在有 的注意力上下文中算出来的,移植到无 的上下文里,后续层的 attention 模式已经变了。baseline 减法只抵消先验,不抵消这种 context-mismatch。这是 readiness 度量的一个内生张力(作者在 limitation 里部分触及)。

2.1 Brewing:信息先于自解码

每个样本一次 forward 就得到全部 ,两条诊断在每层各给一个分布,code reasoning 因此变成一条沿深度可观测的内部轨迹。定义两个临界层:

Equation 3. FPCL 与 FJC

含义:FPCL(First Probe-Correct Layer)= probe 第一次答对的层;FJC(First Joint-Correct Layer)= probe 和 CSD 同时答对的第一层。不存在则记为 。anchor 设定下 FPCL 平均在 14% 深度、FJC 在 50% 深度,且 在所有配置下都成立。

brewing 区间 :答案已在表征里,但还没转成模型自己能 decode 的形式。其长度 平均 10.7 层(38% 总深度)——code reasoning 不是 last-layer 事件,而是跨越三分之一网络的结构化过程。

2.2 四种 resolution 结局

到达(或到不了)FJC 之后,轨迹分叉。设 为尾窗 上 CSD 对数字 的平均概率:

Equation 4. 四类结局

  • Resolved / Overprocessed 共享「FJC 曾存在」的前提(模型一度联合确认了正确答案),区别在后续层是否把它保住。Overprocessed = 一个正确计算成形了、却被后面的处理毁掉
  • Misresolved / Unresolved 都从未到达 FJC:前者在尾窗收敛到一个稳定但错误的答案,后者在可用深度内根本没收敛。

anchor 设定(Qwen2.5-Coder-7B,剔除 2.7% no_brewing 后):Resolved 41.5% / Overprocessed 26.4% / Misresolved 8.5% / Unresolved 23.7%。四类都占可观质量,没有一类能当 edge case 忽略。(另:FJC 未定义的样本里仍有 17.7% 最终答对,高于 10% 随机基线——FJC 是 correctness 的强相关项,但非严格前提。)

3. 因果验证:taxonomy 不是事后叙事

三组干预各打 taxonomy 的不同分支,每组都产生与对应 outcome 一致、与其他 outcome 不一致的效应。

Figure 8. 因果验证三联图。 (a) FJC 处 activation patching:把含完整代码上下文的 注入中性 target prompt(”# The value of x is ”),flip rate 在 FJC0 出现清晰跃迁——FJC 处 20–44%,pre-brewing 层(FJC)仅 3–18%。说明 FJC 是因果上特殊的层。(b) Overprocessed 的 layer-skipping 救援:直接替换 final hidden state 只救回 2–29%,但这主要是 norm 失配 范数远小于深层);改用 alpha-blend 注入 平均救回 47.8%(vs. replace 10.4%)——这个巨大差距本身就证明 携带正确信息,只是几何形态与晚层不同。(c) Unresolved 的 re-injection:把 FPCL 层信息注回倒数 2–4 层,救回 22–38%,而 Resolved 对照组保持 84–100%——说明 Unresolved 很多是「没算完」而非「根本不会」。

rewrite 发生在哪:anchor 模型的晚段(28 层里的 22–27)是「决策区」。Overprocessed 样本里,正确数字在 FJC 附近领先、却在 L22 左右被错误数字反超;partial-sum 分解把这次 swing 定位到 last-token attention @ L22–23,投影掉该方向能救回 17–19% 的 attention-culprit OP 样本(MLP 方向 9.4%、随机方向 0%)。Loop vs. Loop-unrolled 的对照里则相反:两者到 L21 几乎相同,之后晚段 MLP(L25–26)为 loop 更用力地把正确数字写进 residual stream,把这次 MLP write 移植进 unrolled 孪生样本能补上 82.6% 的 readiness gap。跨 16 个模型 rewrite 都稳定存在,但负责的组件 family-specific(Qwen 是 attention,Llama/DeepSeek 是 MLP)——所以作者只报 empirical localization,不报单一 circuit。

4. 不同 code primitive 触发不同失败指纹

Figure 2. (a) Task→Outcome Sankey;(b) Resolved% vs. 难度。 6 个任务里 3 个(Computing / Function Call / Loop-unrolled)跌破 30% Resolved。整体 41.5% 的均值掩盖了巨大的任务间差异:

Table 1. 六任务族的四类结局(Qwen2.5-Coder-7B,anchor,%)

TaskResolvedOverprocessedMisresolvedUnresolved
Value Tracking70.813.85.49.9
Conditional59.222.710.18.0
Loop35.531.19.523.8
Loop-unrolled28.026.710.434.9
Function Call27.728.93.839.6
Computing26.235.611.526.7

每个任务有独特的失败机制:

  • Computing:OP 占比最高(35.6%,内部计算不稳)。steps 2→4 把 OP 从 25.4% 推到 47.5%;纯加法的 MR(17.5%)远高于混合 add_mul(6.4%)——简单算子反而更自信地答错。
  • Function Call:indirection 是观测到的最大瓶颈。depth 1→3 让 Resolved 从 61.1% 崩到 2.5%、Unresolved 从 19.1% 飙到 57.4%。normalized FPCL 从 0.074(Value Tracking)涨到 0.179(延后 2.4×)。
  • Conditional:boolean_flag 的 MR=18.5%(vs. numeric 6.5%)——Boolean 求值是独立于嵌套深度的潜在瓶颈,模型自信地选错分支。
  • Loop vs. Loop-unrolled(最干净的因果对照):底层算术完全相同、只差语法。dual-variable 追踪的 UR 从 Loop 的 23.5% 翻倍到 Loop-unrolled 的 53.6%——loop 语法提供了结构脚手架,一旦 unroll 这些结构线索消失

❓ 「Computing 的 (33%)比 Value Tracking(49%)更短」被作者诚实地归因于 survivorship bias(Computing 只有 61.8% 样本有定义的 FJC,进入统计的是相对简单的子集)。这点很关键——它提醒任何基于 brewing 区间长度的横向比较都要先控住 FJC 存在率,否则会被幸存者偏差污染。

5. 跨模型 / 跨规模:mechanism 与 capability 解耦

Figure 3. (a) 16 个模型的归一化 FJC 分布(KDE);(b) 各模型平均归一化 brewing 时长。 尽管 family 间有差异,所有 16 个 model-level 均值都落在 24–42% 这一条带内

Figure 7. 跨模型全景。 (a) Resolved 随规模从 0.5B 的 ~19% 升到 14B 的 50.3%,而 Overprocessed 顽固地停在 22–34%(Llama-2-7B 最高 41.1%)。(b) Qwen2.5-Coder scaling series 的 per-task Resolved%:Value Tracking 有天花板效应(62–79%),Conditional / Function Call 增益最大,Loop 在 7B→14B 反常下跌。

三条解耦证据:

  • Coder vs. Base(同架构):code 训练改善 outcome 分布,但 task-level FJC 位置在两模型间强相关(Pearson ),平均只移 0.67 层(2.4% 深度)。训练改变「解得多好」远多于改变「在哪解」
  • Scaling:更大模型把质量从 Unresolved/Misresolved 搬向 Resolved(Unresolved 降得最猛——深度提供了收敛 headroom),但归一化 brewing 时长仍守在 24–42%。Scaling 不创造新机制,只是 sharpen 已有机制:brewing 在 0.5B 就已存在(NO_BREWING ~10%, Resolved 18%),到 14B 变锐(NO_BREWING ~1%, Resolved 50.3%)。
  • Cross-architecture:Llama-2 / CodeLlama / DeepSeek-Coder 上 brewing 与指纹结构同样稳健。CodeLlama/Llama-2 在 Computing 上极低(7.6%/8.3%)的瓶颈在 CSD 弱(max acc 仅 17–20%)而非 probing;同架构的 DeepSeek-Coder 显著更好(21.3%)——关键差异是 code 预训练数据质量,不是架构。外部 CRUXEval-O 上模型排序重现(DeepSeek-Coder > CodeLlama > Llama-2),佐证 capability 轴非合成 benchmark 的产物。

6. Ground-Truth-Free 检测

Figure 9. GT-free 检测。 从 CSD 的 10 类 softmax 导出两个不需 ground truth 的信号:熵 与 MaxConf 。其中 entropy-rise(尾层熵持续上升)是 Overprocessed 的最强单一检测器(AUC 0.71–0.86)——overprocessing 的签名是「不确定性上升」而非单纯「置信度下降」。熵+置信组合在不看答案的情况下与真 label 达 64.3% 一致、OP 检测 AUC 0.69–0.85。附录里一个仅用端点统计的闭式 Resolution Functional 做到 Resolved-vs-Rest AUC 0.850。这个判别力是真正 dual 的:去掉任一诊断重新拟合,四类 balanced acc 从 0.62 塌到 ~0.40,因为最强特征(probe–CSD argmax 的一致 / 分歧)单凭一条诊断算不出来。


关联工作

基于

  • Patchscopes (Ghandeharioun et al. 2024): CSD 的直接来源——把 hidden state 注入另一 prompt 来「审问」它。本文的 context-stripping + baseline 减法是其 code-reasoning 特化。
  • Logit Lens / Tuned Lens (nostalgebraist 2020; Belrose et al. 2023): layer-wise readout 传统,问「每层编码了什么」;本文把它从 availability 扩展到 readiness。
  • Linear probing / control tasks (Belinkov 2022; Hewitt & Liang 2019): probe + near-OOD residual 类的方法学根基。
  • Activation patching / causal abstraction (Meng et al. 2022 ROME; Geiger et al. 2023): 第 3 节因果干预的工具来源。

对比 / 区分

  • Overthinking (Halawi et al. 2024; Schuster et al. 2022): 本文把粗糙的「overthinking」细化为 task-specific、因果验证过的 Overprocessed,并与 Unresolved 区分——两者需要相反的干预。
  • Code reasoning benchmarks (CRUXEval, CodeMind 等): 它们评外部行为 / 静态表征属性;本文追踪的是跨层 时间动态,用受控 code primitive 作实验单元。

方法相关 / 下游

  • Adaptive-depth 架构: Mixture-of-Depths (Raposo et al. 2024)、Inner Thinking Transformer (Chen et al. 2025b)、LoopFormer (Jeddi et al. 2026)——它们改变 token 获得多少计算,但需要「何时该加深 / 何时反而有害」的信号,本框架正好互补。

论文点评

这是 Owner(Yifu Guo)本人共同一作的工作。按 research 原则,对自己的 idea 与对他人论文施加 同等 审视。

Strengths

  1. Problem formulation 选得好:把「what is encoded」换成「whether it is solved」,并进一步拆成 availability / readiness 的二元——这个区分简单、可操作、且直接解释了「accuracy 相同但内部失败方式不同」的现象。属于「问对问题」而非「+0.3% SOTA」。
  2. 诊断便宜、可 scale:probing + CSD 都只需一次 forward 采集 hidden state,没有反复 intervention 的开销(对比 CircuitLasso 想解决的也是 intervention 太贵的问题,但路线不同——这里是用诊断而非重述 discovery)。因此能轻松铺到 16 个模型 × 6 任务。
  3. 因果验证是真做了,不是叙事:三组干预(patching / layer-skip / re-injection)各打不同分支、且都设了对照(replace vs. alpha-blend、MLP/random direction、Resolved control),用「干预产生 outcome-specific 效应」来支撑 taxonomy 的实在性。这比纯观测的可解释性工作扎实。
  4. 诚实度高:主动报告 survivorship bias(Computing 的 反而更短)、明确把 scaffold 稳定性限定为「empirical regularity within tested families」而非 circuit-level universality、承认 rewrite 组件 family-specific 只能报 localization。这些自我设限正是 evidence-driven 的体现。

Weaknesses

  1. 层粒度,定位不到 head/MLP 子单元:诊断在 layer 级,说不清具体哪个 attention head / MLP 驱动转变(作者列为 limitation,path patching 是自然下一步)。晚段 rewrite 的组件归因也只到「attention vs. MLP」的粗粒度。
  2. CSD 的 context-mismatch 内生张力(见正文 ❓): 在有 的上下文里算出,移植到无 的 prompt 后,后续层 attention 已变;baseline 减法只消先验不消这种失配。readiness 的度量因此可能系统性低估「模型其实能用、只是依赖 的注意力」的情形。
  3. 任务是短的单 primitive 合成程序:单数字输出、片段刻意短。是否在 compositional、多语句真实代码上保持同样动态,作者明说是 open question。合成 benchmark 的干净 = 外部效度的代价。
  4. 「brewing 14% / FJC 50% / 38%」是 anchor 模型的数:虽然 24–42% band 跨 16 模型成立,但具体百分比强依赖于 probe/CSD 的阈值与训练设定(附录有 threshold sweep,但深度的归一化本身对 敏感)。
  5. 两个核心机制问题仍开放为什么 晚层会破坏正确答案(Overprocessed 的成因)、availability-before-readiness 的次序是 residual-stream 几何的必然还是当前训练范式的偶然——作者诚实标注未解。这恰恰是把这篇从「现象描述」推向「机制解释」的关键,也是后续工作的最大增量空间。

可信评估

Artifact 可获取性

  • 代码: 已开源(实验代码在 paper_experiment 分支,main 仅 landing page)。README 标注仍在 active refactor,并在跑更大模型的 scaling 实验,建议想 build-on 的人等更干净的 release。
  • 模型权重: 不涉及——全部用公开 open-weight 模型(Qwen2.5-Coder / Qwen2.5 / Qwen3 / DeepSeek-Coder / CodeLlama / Llama-2,0.5B–14B,附录 B 列全 URL)。
  • 训练细节: probe 超参在附录 D(Table 5);诊断/干预的 layer sweep、阈值、failure case 在附录 F。基本完整。
  • 数据集: 自建 CUE-Bench(6 任务族,每模型 24,300 样本 = 4,050/任务 × 150/配置),设计细节附录 C;合成、可复现。

Claim 可验证性

  • 可信brewing scaffold 跨 16 模型稳定在 24–42%:有 Figure 3 + 附录 bootstrap CI(Table 6)支撑,是全文最硬的实证 claim。
  • 可信四类 outcome 对应 intervention-sensitive 状态:三组带对照的因果干预支撑,grounding 扎实。
  • 存疑「mechanism 与 capability 解耦」:基于 Coder/Base 的 (但 任务、,样本极小)+ scaling 趋势。方向可信,但「解耦」是较强的措辞,统计功效有限。
  • 存疑CSD 度量的就是 readiness:依赖 CSD 能忠实反映「模型自己能否用」这一构念效度,受 context-mismatch 影响(见 Weakness 2)。
  • 存疑晚段 rewrite 的组件归因(Qwen=attn, Llama/DeepSeek=MLP):作者已自降为 empirical localization 而非 circuit;当作启发而非定论。

Notes

  • CircuitLasso 形成有趣对照:两篇都想绕开「昂贵的 intervention」,但 CircuitLasso 是把 circuit discovery 重述成观测回归(牺牲因果换便宜),本文是用 便宜的诊断 + 少量精准干预 去刻画动态(诊断便宜、但关键结论仍靠真干预坐实)。本文在「便宜 vs. 因果硬度」的取舍上比 CircuitLasso 更稳。
  • 对 Owner 自己方向的 hook:Overprocessed/Unresolved 需相反干预 → 与 adaptive-depth / looped transformer 的「何时该加算力」问题天然耦合,是把可解释性诊断接到推理效率的潜在入口。

Rating

Metrics (as of 2026-06-27): citation=N/A(Semantic Scholar 未收录,arXiv 2606.17648 发布约 10 天), influential=N/A; HF upvotes=N/A(无 paper 页); github 4⭐ / forks=1 / open_issues=0 / pushed 1d ago(Owner 本人新仓,active refactor,非 stale)

分数: 2 - Frontier 理由: 作为 Owner 本人共同一作的工作,这是要持续 build 的活跃 frontier,不该归入 1(Archived,预期不再主动翻)——README 明确还在跑更大模型的 scaling 实验。方法上提供了一个新颖、可 scale、因果验证扎实的「双诊断 + 生命周期 taxonomy」实证框架,但它是 code-reasoning 可解释性的一个具体切口、尚未成为某方向 de facto 必引的奠基工作,也未达到 3(Foundation)所要求的社区级影响力与「只读它就能理解方向脉络」的门槛。故定 2,而非相邻的 1 或 3。