从酝酿到解析:追踪LLM中代码推理的内部生命周期
摘要
本文介绍了一种双重诊断框架,用于追踪LLM中代码推理的内部生命周期,揭示了模型首先‘酝酿’答案,然后分化为四种解析结果,且跨架构的酝酿稳定性一致,但解析成功率不同。
查看缓存全文
缓存时间: 2026/06/17 05:37
# 从酝酿到解决:追踪大语言模型中代码推理的内部生命周期 **来源:** https://arxiv.org/html/2606.17648 陈思月¹∗,郭逸夫²∗,卢宇泉²,徐子珊⁴,林嘉烨³,林剑波⁵,张思雨⁶,杨成⁷,李俊鑫²,李雨佳⁸,霍雨⁶,王瑞轩²† ¹华南理工大学,²中山大学,³清华大学,⁴上海交通大学,⁵南京大学,⁶香港中文大学(深圳),⁷杭州电子科技大学,⁸广州工商学院 ∗共同第一作者 †通讯作者:[email protected] ###### 摘要 标准准确率指标无法解释为什么大语言模型能处理变量追踪任务,却在语义等价的循环任务上表现脆弱。我们研究了代码推理的内部生命周期:模型首先**酝酿**答案,使其在可自解码之前的许多层就变得线性可恢复,随后分歧为四种**解决结果**(已解决、过度处理、错误解决、未解决)。理解这一生命周期至关重要,因为相似的任务准确率可能掩盖根本不同的失败模式,而表层评估无法检测到这些模式。我们引入了一个双重诊断框架,将逐层线性探测与上下文剥离解码(CSD)配对,并将其应用于涵盖Qwen、Llama和DeepSeek架构的16个模型上的6个代码推理任务族。在所有任务族中,四种结果均占据显著比例:整体已解决率仅为41.5%,多个任务低于30%。对结构、深度和运算符的受控扫描揭示了特定于任务的失败瓶颈:当调用深度从1增加到3时,函数调用的已解决率从61.1%骤降至2.5%。跨架构和规模,酝酿支架保持稳定(所有16个模型的归一化酝酿持续时间为24-42%),而解决成功率随能力变化,这表明该支架是测试的解码器仅Transformer系列中的一个稳定经验规律,而解决成功与否随能力、规模和训练而变化。代码:https://github.com/euyis1019/llm-brewing。 ## 1 引言 大语言模型在处理代码时表现出令人费解的异质性:同一个模型可以毫不费力地追踪变量赋值,但一旦引入算术运算就变得脆弱;它能够处理显式循环,却在语义等价的展开序列上挣扎。在我们的实验中,值追踪实现了70.8%的已解决率,而循环展开(尽管只需要顺序算术)仅达到28.0%,这种差距是标准准确率指标所无法揭示的。任务级准确率本身无法揭示这些差异的来源(Liu等人,2024 (https://arxiv.org/html/2606.17648#bib.bib32); Gu等人,2024 (https://arxiv.org/html/2606.17648#bib.bib33); Chen等人,2025a (https://arxiv.org/html/2606.17648#bib.bib35));两个具有相似准确率的模型可能在内部以完全不同的方式失败。 ##### 从“编码了什么”到“是否解决了”。 大多数可解释性工作探究的是在给定层**编码**了哪些信息(Belinkov等人,2017 (https://arxiv.org/html/2606.17648#bib.bib10); Cunningham等人,2023 (https://arxiv.org/html/2606.17648#bib.bib11); nostalgebraist, 2020 (https://arxiv.org/html/2606.17648#bib.bib5); Belrose等人,2023 (https://arxiv.org/html/2606.17648#bib.bib6))。对于代码推理,更关键的问题是:在每一层,模型是否已经**解决**了问题?答案信息可能存在于隐藏状态中,但尚未组织成模型可以稳定利用的形式。这引出了两个操作性问题:答案何时可以被外部读取,以及何时可以被模型自身的解码管线使用?我们将第一个事件区分为**信息可用性**,第二个事件区分为**信息就绪性**,并利用这种区分来研究为什么不同的代码基元会触发不同的内部失败模式。 ##### 方法。 我们构建了一个包含六个合成代码任务族的基准测试,涵盖数据流、控制流及其组合(每个模型24,300个单数字输出样本),并引入了一个**双重诊断框架**,将逐层线性探测(可用性)与上下文剥离解码(Ghandeharioun等人,2024 (https://arxiv.org/html/2606.17648#bib.bib7))(就绪性)配对。 ##### 主要发现。 这种双重视角揭示了模型首先**酝酿**答案,使其在可自解码之前就变得线性可恢复,随后分歧为四种**解决结果**(已解决、过度处理、错误解决、未解决)。整体上只有41.5%的样本已解决;六个任务中有三个低于30%(计算、函数调用、循环展开)。受控扫描揭示了特定于任务的瓶颈:当调用深度从1增加到3时,函数调用的已解决率从61.1%骤降至2.5%。有针对性的因果干预,包括在联合正确层进行激活修补、对过度处理进行跳层操作以及对未解决进行再注入,表明这些结果对应于对干预敏感的计算状态,而非事后标签。跨16个模型,酝酿支架保持稳定(归一化持续时间为24-42%),而解决成功率各不相同;该支架是测试的解码器仅Transformer系列中的一个经验规律,而解决成功与否**随能力、规模和训练而变化**。 ##### 贡献。 - •一个**双重诊断框架**,将探测与CSD配对,并配有一个专门构建的基准测试,能够对代码推理进行逐层研究。 - •一个**从酝酿到解决的生命周期**:答案在可自解码之前变得外部可读;轨迹分歧为一个经过因果验证的四分类法。 - •**代码基元级别的机制多样性**:特定于任务的失败瓶颈(例如,函数调用已解决率随深度从61.1%变为2.5%),在16个模型中具有稳定的酝酿支架,但解决结果存在分歧。 这些对立的失败模式排除了任何单一的早期退出策略:过度处理受益于早期退出,而未解决则需要更多深度。这启发了结果感知推理策略。这也使该框架与深度自适应和循环Transformer设计互补,这些设计改变了token接收的计算量,但仍然需要信号来判断额外深度何时有帮助或开始有害(Raposo等人,2024 (https://arxiv.org/html/2606.17648#bib.bib50); Chen等人,2025b (https://arxiv.org/html/2606.17648#bib.bib51); Jeddi等人,2026 (https://arxiv.org/html/2606.17648#bib.bib52))。 ##### 相关工作。 我们的工作借鉴了三条研究线索(详细综述见附录A (https://arxiv.org/html/2606.17648#A1))。**逐层读取方法**,包括Logit Lens(nostalgebraist, 2020 (https://arxiv.org/html/2606.17648#bib.bib5))、Tuned Lens(Belrose等人,2023 (https://arxiv.org/html/2606.17648#bib.bib6))、Patchscopes(Ghandeharioun等人,2024 (https://arxiv.org/html/2606.17648#bib.bib7))和线性探测(Belinkov, 2022 (https://arxiv.org/html/2606.17648#bib.bib9); Hewitt and Liang, 2019 (https://arxiv.org/html/2606.17648#bib.bib8)),询问的是每层**编码了**什么;我们将其扩展为询问模型是否能对其**采取行动**,方法是配对探测(可用性)与CSD(就绪性)。**代码理解**基准测试和探测(Hooda等人,2024 (https://arxiv.org/html/2606.17648#bib.bib17); Liu等人,2024 (https://arxiv.org/html/2606.17648#bib.bib32); Gu等人,2024 (https://arxiv.org/html/2606.17648#bib.bib33); Chen等人,2025a (https://arxiv.org/html/2606.17648#bib.bib35); Ribeiro等人,2025 (https://arxiv.org/html/2606.17648#bib.bib20))评估外部行为或静态表示属性;我们转而追踪跨层的内部代码推理的**时间动态**,使用受控代码基元作为实验单元。**推理动态与因果结构**(Halawi等人,2024 (https://arxiv.org/html/2606.17648#bib.bib30); Meng等人,2022 (https://arxiv.org/html/2606.17648#bib.bib27); Geiger等人,2023 (https://arxiv.org/html/2606.17648#bib.bib28); Afzal等人,2025 (https://arxiv.org/html/2606.17648#bib.bib21)),特别是过度思考现象(Halawi等人,2024 (https://arxiv.org/html/2606.17648#bib.bib30); Schuster等人,2022 (https://arxiv.org/html/2606.17648#bib.bib29))和置信度估计(Guo等人,2017 (https://arxiv.org/html/2606.17648#bib.bib45); Kadavath等人,2022 (https://arxiv.org/html/2606.17648#bib.bib46)),为我们提供了需要扩展的干预工具包;我们的过度处理类别将过度思考细化为一个特定于任务、经过因果验证的失败模式,与未解决不同。 ## 2 方法 ##### 模型。 我们分析了16个解码器仅Transformer(0.5B–14B参数),涵盖六个系列:Qwen2.5-Coder(Hui等人,2024 (https://arxiv.org/html/2606.17648#bib.bib23))、Qwen2.5(Yang等人,2024 (https://arxiv.org/html/2606.17648#bib.bib26))、Qwen3(Qwen Team, 2025 (https://arxiv.org/html/2606.17648#bib.bib48))、DeepSeek-Coder(Guo等人,2024 (https://arxiv.org/html/2606.17648#bib.bib24))、CodeLlama(Rozière等人,2023 (https://arxiv.org/html/2606.17648#bib.bib25))和Llama-2(Touvron等人,2023 (https://arxiv.org/html/2606.17648#bib.bib47));完整的模型URL在附录B (https://arxiv.org/html/2606.17648#A2)中列出。在整个正文中,我们重点关注Qwen2.5-Coder-7B;除非另有说明,所有统计量均在所有六个任务族上计算,每个模型24,300个样本(每个任务4,050个,每个配置150个;即**锚定设置**)。 ##### 基准测试。 我们沿着程序分析的经典维度设计了六个任务族(Aho等人,2006 (https://arxiv.org/html/2606.17648#bib.bib1); Allen, 1970 (https://arxiv.org/html/2606.17648#bib.bib2); Kildall, 1973 (https://arxiv.org/html/2606.17648#bib.bib3); Nielson等人,1999 (https://arxiv.org/html/2606.17648#bib.bib4)):**数据流**(值追踪、计算)、**控制流**(条件)以及**数据+控制流**(函数调用、循环、循环展开)。每个实例将一段短代码片段C与一个问题后缀Q配对,形成源提示S=[C;Q];答案始终是一个数字t^*∈D={0,...,9},保证了在所有分词器中的单token目标,并实现了统一的11类诊断空间。代码片段保持简短,以便逐层信号反映推理基元而非长上下文效应。完整的设计细节见附录C (https://arxiv.org/html/2606.17648#A3)。 ### 2.1 双重诊断框架 给定一个具有L层的解码器仅Transformer M,令h^ℓ∈R^d表示模型处理源提示S时在层ℓ的最后一个token隐藏状态。由于最终位置关注完整的先前上下文,它充当了模型在该深度为止计算内容的紧凑表示。我们定义两个诊断函数Φ_P^ℓ, Φ_C^ℓ: R^d → Δ^{|T|},将h^ℓ映射到分类空间T=D⊔{d̄}上的概率单纯形,其中d̄将所有非数字token聚合到一个单一的残差类中(|T|=11)。我们在全文使用σ(·)≜softmax(·)。 ##### 线性探测。 对于每一层,我们训练一个逻辑回归分类器(Belinkov, 2022 (https://arxiv.org/html/2606.17648#bib.bib9))Φ_P^ℓ(h^ℓ)=σ(W^ℓ h^ℓ + b^ℓ), (1) 该分类器测试答案信息是否已经从隐藏状态中线性可恢复。这个诊断提出了一个必要条件问题:**答案是否已经以简单形式存在?**为了使探测器的输出空间与CSD(公式2)对齐,并防止探测器利用浅层分布线索,我们用在分布外(OOD)残差类及其对应的训练样本来扩充十个数字类(Hewitt and Liang, 2019 (https://arxiv.org/html/2606.17648#bib.bib8))(细节见章节D.1 (https://arxiv.org/html/2606.17648#A4.SS1))。 ##### 上下文剥离解码(CSD)。 信息的存在并不意味着模型可以对其进行操作。因此,我们构建了第二个受Patchscopes启发的诊断(Ghandeharioun等人,2024 (https://arxiv.org/html/2606.17648#bib.bib7))。我们提取源运行中的h^ℓ,并将其注入到一个目标提示T=Q中,该提示仅保留问题后缀,从而剥离了原始代码上下文C。然后,模型从层ℓ+1到L-1继续其前向传递,注意力上下文限制在T上。对结果logits的简单读取会混淆h^ℓ携带的信号与仅由T引起的语言先验。我们通过**基线logit减法**来解决这个问题:我们在T上运行一次干净的、没有任何修补的正向传递,以获得基线logit向量z_b,并在应用softmax之前将其从修补后的logit中减去。这抵消了先验并隔离了h^ℓ的贡献: Φ_C^ℓ(h^ℓ) = σ(W_u ∘ LN ∘ F_{L-1} ∘ ⋯ ∘ F_{ℓ+1}(h^ℓ |_T) - z_b) (2) 其中z_b是通过运行T而不进行任何修补获得的logit,代表语言先验;最终分布取数字类T。如果argmax Φ_C^ℓ(h^ℓ)=t^*,则h^ℓ是**自包含的**:模型自身的解码管线可以在不回头注视代码的情况下产生正确答案。 ##### 核心不对称性。 Φ_P^ℓ测量**信息可用性**,即外部线性读取器是否可以提取答案;Φ_C^ℓ测量**信息就绪性**,即模型本身在原始上下文被剥离后是否能解码答案。跨深度扫描这两个诊断并追踪它们一致或分歧之处,揭示了代码推理在模型内部如何展开。 ## 3 代码推理的内部生命周期 ### 3.1 酝酿:信息先于自解码 对于每个样本x(源提示S_x,真实答案t_x^*),一次前向传递产生跨层演变的隐藏状态{h_x^ℓ}_{ℓ=0}^{L-1};Φ_P^ℓ和Φ_C^ℓ在每一层都产生一个诊断分布,将代码推理转化为沿深度直接可观察的内部轨迹。图1 (https://arxiv.org/html/2606.17648#S3.F1)展示了锚定设置中的代表性轨迹:探测首先变得正确,而CSD在几层之后才赶上。答案信息以外部可读的形式出现,早于模型能够从其自身表示中解码它。逐层线性探测实现了80.09%的最佳层平均准确率(训练细节、逐层准确率分布及可靠性讨论见章节D.1 (https://arxiv.org/html/2606.17648#A4.SS1))。令t̂_P^ℓ、t̂_C^ℓ和t̂_out分别表示层ℓ处的探测argmax、CSD argmax和模型的最终输出(正式定义见附录)。
相似文章
Knowing When to Quit: Diagnosing and Training LLMs to Abort Futile Reasoning
This paper characterizes 'futile reasoning' in large language models, where models produce superficially valid but incorrect reasoning on tasks beyond their capability. They introduce CaRL, a capability-aligned reinforcement learning method that trains LLMs to abstain from futile reasoning while preserving performance.
ReasoningFlow: 用于理解LLM推理轨迹的篇章结构
介绍 ReasoningFlow,一个将大语言模型推理轨迹的篇章结构捕获为有向无环图的框架,从而能够细粒度分析推理行为(如自我反思和回溯)。基于对数千条轨迹的手动和自动标注,揭示了模型之间的结构相似性,并且大多数错误步骤并不贡献于最终答案。
揭示大语言模型中的数学推理:内部机制的方法学研究
本文通过早期解码分析大语言模型的内部机制,研究其如何执行算术运算。研究发现,能力强的模型在推理任务中,注意力模块和 MLP 模块之间呈现明确的分工。
LLM推理的周期表:推理范式、方法与失败模式的系统综述
一项综合分析超过300篇关于LLM推理的论文,提出了推理范式的分类体系,包括Chain-of-Thought、Multi-Hop、Mathematical、Commonsense等,并总结了常见的失败模式和研究空白。
学习如何让大语言模型进行推理
OpenAI 发布了一篇文章,通过密码破译示例探索大语言模型的推理技术,展示了语言模型的逐步问题求解和模式识别能力。