跳转至

SolidCoder: Bridging the Mental-Reality Gap in LLM Code Generation through Concrete Execution

会议: ACL 2026 Findings
arXiv: 2604.19825
代码: https://github.com/10kH/SolidCoder
领域: 代码生成 / LLM Agent
关键词: 代码生成, 心理模拟, 执行验证, 多智能体, 属性测试

一句话总结

SolidCoder 通过 S.O.L.I.D. 架构(Shift-left Planning、Oracle-based Assertions、Live Execution、Intermediate Simulation、Defensive Accumulation)将代码验证从 LLM 的"想象执行"转变为"真实执行",在 GPT-4o 上达到 HumanEval 95.7%、CodeContests 77.0%、APPS 26.7% 的 pass@1 性能。

研究背景与动机

领域现状:当前最先进的代码生成框架(如 MapCoder、CodeSIM)采用多智能体架构,其中 CodeSIM 通过"心理模拟"(Mental Simulation)让 LLM 在内部追踪代码执行来验证正确性,在多个基准上取得了领先结果。

现有痛点:心理模拟存在根本缺陷——LLM 会产生执行幻觉。在复杂的算法场景中,模型会"想象"出与实际程序行为不符的执行轨迹,自信地验证有 bug 的代码。这就像蒙眼下棋却宣布胜利一样。CodeSIM 团队曾尝试通过自一致性来增强测试用例,结果性能下降了 9.3%,因此放弃了执行验证。

核心矛盾:Mental-Reality Gap(心理-现实鸿沟)沿两个正交维度展开:(1) Specification Gap——在规划阶段忽视边界情况;(2) Verification Gap——在验证阶段幻觉出正确的执行轨迹。这两个问题独立存在,修复一个不能解决另一个。

本文目标:同时弥合两个维度的鸿沟,既让模型在规划阶段考虑边界情况,又用真实执行替代想象执行进行验证。

切入角度:作者观察到 CodeSIM 测试生成失败的原因不是测试生成本身,而是试图预测精确输出。验证不需要精确答案——通过检查属性(如"输出长度等于输入长度"、"结果是输入的排列")而非精确值,就可以在没有 oracle 的情况下判断正确性。

核心 idea:用基于属性的断言(property-based assertions)替代精确输出预测,结合沙盒执行,将验证从"想象"变为"执行"——don't imagine, execute。

方法详解

整体框架

SolidCoder 复用了 CodeSIM 的三智能体骨架(Planning、Coding、Debugging),但把 S.O.L.I.D. 五个组件嵌进流程,核心是把验证从 LLM 的"想象执行"换成沙盒里的"真实执行"。给定自然语言问题,Planning Agent 先在带边界意识的提示下产出鲁棒算法规划,Coding Agent 把规划翻译成代码并做一次轻量的内部追踪预筛,随后进入 Live Verification 循环——生成基于属性的断言、在沙盒中真实跑、把失败用例累积成回归测试集,反复 debug 直到所有累积测试通过才输出代码。

%%{init: {'flowchart': {'rankSpacing': 24, 'nodeSpacing': 28, 'padding': 6, 'wrappingWidth': 400, 'subGraphTitleMargin': {'top': 8, 'bottom': 16}}}}%%
flowchart TD
    Q["自然语言问题"] --> S["Shift-left Planning(S)<br/>边界情况左移注入规划 → 鲁棒算法规划"]
    S --> C["Coding Agent + Intermediate Simulation(I)<br/>翻译成代码并做样例追踪预筛(不终审)"]
    C --> LV
    subgraph LV["Live Verification 循环:真实执行替代心理模拟"]
        direction TB
        O["Oracle 属性断言(O)<br/>生成领域不变属性"] --> L["Live Execution(L)<br/>沙盒真实运行(5s 超时 / 文件隔离)"]
        L --> D["Defensive Accumulation(D)<br/>失败用例并入累积回归集"]
    end
    LV -->|断言失败 / 运行报错| DBG["Debugging Agent 修复"]
    DBG --> C
    LV -->|全部累积测试通过| OUT["输出代码"]

关键设计

1. Shift-left Planning(S):把边界情况从 debug 阶段左移到规划之前

传统多智能体框架要等代码跑挂了才在 debug 阶段反应式地补边界处理,但此时算法骨架往往已经写歪。SolidCoder 在规划开始前先抛给 LLM 一句"什么样的最坏输入会让一个朴素解法崩掉?",把模型答出的空输入、边界值、角落情况注入规划 prompt,逼它一上来就按鲁棒思路设计算法。消融里去掉这一步直接掉 23.7%p,是所有组件中最大的一块,说明在算法竞赛题上"边界情况盲区"才是首要失败模式,甚至超过执行幻觉本身。

2. Oracle 属性断言(O)+ Live Execution(L):用真实执行替代心理模拟

心理模拟的死穴是缺少 oracle——不知道正确答案就没法判对错,而精确预测输出又容易跟着幻觉一起翻车(CodeSIM 团队正是因此放弃了执行验证)。SolidCoder 的破法是把问题从"这个输出对不对?"换成"这个输出满不满足必要属性?":Oracle 组件生成领域不变的属性断言(排序应保长度、保有序、是输入的排列),这类断言无需精确答案就能验证。Live Execution 则把代码丢进受限沙盒(5 秒超时、文件系统隔离)真实运行,断言失败或运行时报错就路由回 debug。两者一起把"想象执行"换成"执行",消融中移除 O 掉 11.6%p、移除 L 掉 7.9%p,且 L 捕获的是心理模拟会自信放过的另一类 bug,无法靠改规范弥补。

3. Intermediate Simulation(I)+ Defensive Accumulation(D):低成本预筛 + 单调防回归

I 在代码刚生成时让 LLM 在样例输入上追踪一遍,但与 CodeSIM 不同,它只是廉价的预过滤器、不下终审,真正的裁决权交给 Live Execution,这避免了"想象裁决"重新引入幻觉。D 则维护一个持久测试套件:每次 Live Execution 发现新的失败用例就并入累积集,之后每轮代码修改都必须通过全部累积测试,从而给迭代 debug 提供单调性保证,防止"修好一个又改坏另一个"。两者分别贡献 13.0%p 和 6.7%p 的回归防护。三个迭代上限沿用 CodeSIM 设置:规划迭代 \(p=5\)、debug 迭代 \(d=5\)、假设打破迭代 \(a=3\);整个框架是推理时方法,不涉及模型训练。

实验关键数据

主实验

基准 模型 CodeSIM SolidCoder 提升
HumanEval GPT-4o 95.1% 95.7% +0.6%p
CodeContests GPT-4o 72.7% 77.0% +4.3%p
APPS GPT-4o 23.3% 26.7% +3.4%p
CodeContests GPT-OSS-120B 87.9% 92.1% +4.2%p
CodeContests Grok-4.1-Fast 95.2% 98.2% +3.0%p

消融实验(CodeContests, GPT-4o)

配置 Pass@1 Δ
Full SolidCoder 77.0%
w/o Shift-left Planning [S] 53.3% -23.7%p
w/o Intermediate Simulation [I] 64.0% -13.0%p
w/o Oracle-based Assertions [O] 65.4% -11.6%p
w/o Live Execution [L] 69.1% -7.9%p
w/o Defensive Accumulation [D] 70.3% -6.7%p
GPT-4o Direct 42.4% -34.6%p

关键发现

  • Shift-left Planning 贡献最大(-23.7%p),证明边界情况盲目性是算法任务的主要失败模式,而非执行幻觉
  • Live Execution 捕获的是分类上不同的错误,心理模拟会错误地验证这些 bug 代码。虽然绝对贡献小于 [S],但这类错误无法通过改善规范来解决
  • 改进与难度成正比:HumanEval(简单)仅 +0.6%p,CodeContests(中等)+4.3%p 增幅最大,APPS(困难)瓶颈从验证转移到生成本身
  • RL 后训练模型(GPT-OSS-120B、Grok-4.1-Fast)同样受益,说明即使模型生成能力提升,推理时仍依赖心理模拟做自我评估

亮点与洞察

  • 属性测试替代精确输出预测是核心创新:将不可解的 oracle 问题转化为可执行的属性验证问题,思路非常巧妙且具有广泛迁移价值
  • 两维度分解的分析框架(Specification Gap + Verification Gap)让问题分析更加清晰,消融实验完美地验证了两者独立且互补
  • Shift-left 思想源自软件工程,将测试左移到规划阶段的做法可以迁移到其他多智能体推理框架,如数学推理或科学推理任务中

局限与展望

  • Live Execution 目前仅支持 Python,扩展到其他语言需要语言特定的沙盒化
  • 评估聚焦于函数级基准,未在仓库级任务(如 SWE-bench)上验证
  • 当 LLM 同时生成代码、属性和验证测试时,系统性偏差可能传播
  • Token 开销显著:CodeContests 上 +50%,HumanEval 上 +97%;可考虑难度感知路由来优化效率
  • 消融实验仅覆盖 CodeContests + GPT-4o 一个组合

相关工作与启发

  • vs CodeSIM: CodeSIM 用心理模拟做终审判定,SolidCoder 用真实执行替代。核心区别在于 SolidCoder 的 [I] 只是预过滤器而非终审
  • vs LDB/MGDebugger: 这些执行式 debugger 在代码生成后作为二次修正,且需要真实测试用例。SolidCoder 将执行集成到生成循环中,用属性断言替代真实输出
  • vs Reflexion/LATS: 利用迭代自修正和树搜索,但验证仍依赖 LLM 内部推理

评分

  • 新颖性: ⭐⭐⭐⭐ Mental-Reality Gap 的二维分解和属性测试解决 oracle 问题是有意义的创新,但整体架构增量式
  • 实验充分度: ⭐⭐⭐⭐ 三个基准、三个模型、完整消融;但消融仅在一个组合上做
  • 写作质量: ⭐⭐⭐⭐⭐ 动机讲解清晰,"蒙眼下棋"的比喻生动,Figure 2 的对比示例直观有说服力
  • 价值: ⭐⭐⭐⭐ 属性测试思路具有广泛迁移价值,但 token 开销和 Python 限制降低实用性