跳转至

CTE-Bench: Counterfactual Trace Evaluation for Stateful Software Simulators

会议: NeurIPS2026(笔记归档;所读版本为 arXiv v1,不据此确认录用)
arXiv: 2609.36647
领域: 代码智能 / LLM 评测
关键词: 有状态软件、反事实轨迹、执行真值、影响步骤、自由滚动

一句话总结

CTE-Bench 用真实执行生成软件干预前后的响应轨迹,在固定未来调用上评测模型能否持续预测干预效果:正确历史答案可见时影响步骤准确率为 54.3%–61.5%,自由滚动时降至 24.8%–33.2%,整条轨迹完全正确的比例最高仅 1.2%。

研究背景与动机

代码智能体修改的常常不是一个从空状态启动的函数,而是已经运行了一段时间的服务。银行账本、过期令牌、购物车、文件系统或限流器都保留历史状态;改动一处判断条件,可能先改变某次请求是否被接受,再通过没有发生的状态更新影响更晚的调用。因此,能看懂代码差异,或能判断一次请求成功与否,并不等于能预见修补后的服务会返回什么。

现有评测分别覆盖了这个问题的邻近部分。CRUXEval、REval 等关注函数或程序执行,Executable Counterfactuals 引入可执行的干预,ToolSandbox 等则考察有状态环境中的智能体行为。但当智能体自己选动作时,最终失败可能来自规划、参数选择或环境预测,难以单独衡量对软件动态的理解。本文把动作选择拿掉:未来调用提前固定,模型只预测响应,再由确定性 Python 服务执行判定。

这个设置还有一个容易被忽视的评估漏洞:多数未来调用可能根本不受干预影响,忽略修改、照常重放就能得到很高的总体准确率。作者因此既保留无干预轨迹作为对照,又控制模型是否得到此前未来调用的正确答案。核心 idea:用执行得到的双轨迹定位真正受干预影响的调用,并把正确答案辅助下的一步预测与依赖自身预测的连续模拟分开报告。

方法详解

整体框架

每个场景提供服务源代码、干预前已经观察到的调用及响应、一次源码修改或状态覆盖,以及预先固定的 40 个未来调用。模型每次接收一个待预测调用,输出完整 JSON 响应;它不执行代码、不选择下一步动作,也不能改变环境。源代码修改场景展示修改后的完整源码及改动的行和 token。

评测端的新服务实例先执行观察历史,得到干预时刻的真实状态,再施加干预并执行未来调用,产生目标轨迹。另一个无干预执行分支从相同历史状态出发,执行相同的未来调用。两条轨迹用于判分和定位影响步骤,不是模型可调用的工具;只有“答案揭示”协议会把较早的目标响应作为后续预测的上下文。

这是一套基准与评测协议,而非新神经网络。核心设计依次是历史后干预、双轨迹判分、三种记忆协议,以及可审计的场景与统计边界;不把它画成训练模块或虚构预测网络。理解其流程的关键是区分三个角色:模型进行文本预测,执行器维护真实服务状态,判分器比较二者的 JSON。

关键设计

1. 历史后干预:改变运行规则,但不改写已经发生的过去

源码干预不是“从一开始就运行修改后的程序”。观察历史必须先用原始程序执行,它生成的状态被保留;之后才替换代码中的一个 token,例如反转比较或改变数值阈值。只有能够装载现有状态并确定性重放的修改才被接受。这一约束模拟的是对正在运行的服务打补丁,而不是对整个历史做重新解释。

状态干预则保留源码,在同一时刻直接修改已有状态。Core-v1 中具体是移动服务时钟或覆盖限流计数器;作者不声称这些是开发者最常见的改动。时钟变化可能使既有令牌过期,计数器覆盖可能改变后续限流判断,因此仅知道编辑内容还不够,必须结合观察历史推断干预时的状态。

这里的预测目标是未来可见响应,不要求模型输出每一步内部状态。内部状态即使发生变化,只要所存轨迹中没有任何响应变化,该候选就不会进入 Core-v1。这样的筛选保证主体集合包含可观察的干预效果,但也意味着它不是覆盖所有可能修改的自然分布。

2. 双轨迹判分:只在真正改变的响应上衡量干预理解

如果一次改动只影响少数调用,整体准确率会奖励“当改动不存在”。作者执行同样的未来调用两次,得到干预轨迹与无干预轨迹;响应不同的位置才叫影响步骤(effect steps)。位置不局限于直接执行了修改行的调用:某次请求被拒绝而没有更新计数器,之后读取计数器的调用也可能成为影响步骤。

下式是对原文指标定义的记号化表达,而非新增训练目标。令 \(y_{s,t}^{\xi}\) 和 \(y_{s,t}^{0}\) 分别为场景 \(s\) 在第 \(t\) 个未来调用上的干预与无干预响应,\(\hat y_{s,t}\) 为解析后的模型预测,则主体评分为:

\[ \mathcal E=\{(s,t):y_{s,t}^{\xi}\ne y_{s,t}^{0}\},\qquad \mathrm{VM}_{\mathrm{effect}}=\frac{1}{|\mathcal E|}\sum_{(s,t)\in\mathcal E}\mathbf 1[\hat y_{s,t}=y_{s,t}^{\xi}]. \]

分母是评分窗口中的全部影响步骤,Core-v1 为 2,476;JSON 解析失败不计为正确。VM 要求解析后的响应整体相等,不是字符级比较输出排版。所有调用上的 VM 则使用全部 10,200 次预测作为分母,因此它和影响步骤 VM 回答的是不同问题。

另外两个诊断指标保留了不同粒度:状态匹配(SM)只比较成功或错误,字段匹配把真实响应展开到标量字段后给部分正确信用。前者可能掩盖余额、计数、路径或到期时间错误,后者可以揭示完整响应只差部分字段的近似命中。它们辅助解释 VM,但不能替代干预效果主指标。

3. 三种记忆协议:把外部正确反馈与自身预测分开

“答案揭示”(answers revealed)让提示包含最近 20 次调用,包括观察调用和此前未来调用;此前未来调用附带执行器的正确响应。一次预测错误不会污染下一次提示,因此分数测的是正确近期历史条件下的一步预测能力,不能解释为模型独立模拟整个服务的能力。

“无反馈”(no feedback)包含全部观察历史,却省略此前未来调用。每个响应只能从观察历史、干预和当前待预测调用出发预测。这里不仅缺少正确响应,也缺少此前未来调用的上下文;所以它不是简单地把答案揭示提示中的响应遮住,也不是模型获得完整调用前缀、只需自行维护状态的等价实验。

“自由滚动”(free rollout)使用与答案揭示相同的 20 次调用窗口,但把此前未来调用的响应换成模型自己的预测。真实执行器仍沿固定调用序列产生目标响应,错误预测不会改变判分真值;错误改变的是模型后续看到的历史。这使协议能够观察错误预期如何延续,但与真实智能体会根据结果重新选择动作的交互仍有区别。

三种协议每个未来调用都发起一次请求,不是一次生成整条轨迹。作者建议把协议名与每个分数绑定;自由滚动更贴近智能体依赖自身预期的情形,而答案揭示适合比较有正确近期反馈时的下一步预测。协议之间的差异同时包含记忆内容和反馈来源,不能由分数差直接归因出某个独立认知模块。

4. 可审计的场景与统计边界:保留真值,也保留评分覆盖范围

六个服务分别处理认证、银行账本、购物车、内存文件系统、限流和预约配额。255 个场景中,210 个是源码干预:150 个分支反转、60 个阈值变化,来自 49 个不同补丁;45 个是状态干预:30 个时钟跳变、15 个计数覆盖。每个服务贡献 30 个场景,限流器因覆盖四个干预单元而贡献 105 个,不能把整体平均理解为服务均匀加权。

观察历史长 5–56 次调用,每个场景只评分前 40 个未来调用。保存的执行轨迹更长,场景筛选要求长轨迹中至少发生一次响应变化;247 个场景的变化落入评分窗口,另 8 个的首次变化在窗口之后。这 8 个仍贡献整体 VM,却不贡献影响步骤 VM,不能误读为主体集合里有 8 个永远无效果的干预。

释放数据同时保存两条轨迹和最终服务状态,允许离线重新判分,不需要 LLM 裁判。置信区间以场景为单位进行 2,000 次 bootstrap,而不是把同一场景的 40 个响应当独立样本。服务及干预类型分组是描述性失败画像,不是模块消融,也没有单独识别状态推断、规则应用、执行模拟或输出格式各自的因果贡献。

实验关键数据

主实验

四个配置均通过托管 API 评测:DeepSeek V4-Flash 使用 deepseek-chat 兼容别名及非思考模式;Kimi K2.5 关闭 thinking;Qwen3.6-35B-A3B 请求关闭 reasoning 并审计用量;Claude Sonnet 4.6 采用 Bedrock 默认设置,未显式请求 thinking。下表来自原文表 2,单位为百分比,\(\pm\) 表示以场景重采样的 95% bootstrap 区间半宽,不是标准差。

模型 答案揭示:影响步骤 VM 无反馈:影响步骤 VM 自由滚动:影响步骤 VM 答案揭示:整体 VM
DeepSeek V4-Flash 60.7 ± 3.2 24.6 ± 3.5 27.1 ± 4.0 74.1 ± 1.8
Kimi K2.5 61.5 ± 3.1 28.9 ± 3.8 33.2 ± 3.7 71.8 ± 1.4
Qwen3.6-35B-A3B 54.3 ± 2.8 23.2 ± 3.2 24.8 ± 3.4 65.6 ± 1.4
Claude Sonnet 4.6 58.4 ± 3.7 25.0 ± 3.5 27.3 ± 4.0 61.8 ± 2.3

答案揭示下最高与最低影响步骤 VM 点估计相差 7.2 个百分点,而撤去正确反馈后下降约 28–36 个百分点。DeepSeek、Kimi 与 Sonnet 的答案揭示区间重叠,Qwen 与 Sonnet 也重叠,因此不据点估计宣称确定的模型排名。

消融实验

论文没有训练模块的删除消融;协议对比属于评估条件变化。下面两张表分别选取表 1 的无模型对照与表 3 的滚动分析,检验评分是否识别干预以及错误何时开始累积。

无模型预测器 整体 VM(%) 影响步骤 VM(%) 整体 SM(%) 含义
无干预重放 75.7 0.0 91.6 总体分数高,但没有预测任何改变的响应
复制最后一次观察响应 1.5 1.1 72.3 状态正确不等于载荷正确
预测观察历史最常见状态 0.0 0.0 76.8 只预测成功或错误也能取得较高 SM
模型 40 步整轨迹完全正确(%) 首次错误位置中位数 第 1–10 步整体 VM(%) 第 21–40 步整体 VM(%)
DeepSeek V4-Flash 1.2 3 66.9 53.6
Kimi K2.5 0.0 2 61.3 47.5
Qwen3.6-35B-A3B 0.0 2 53.3 39.2
Claude Sonnet 4.6 0.0 2 40.4 24.4

滚动表仅限自由滚动;首次错误从未来调用 1 开始计数,包含解析失败。DeepSeek 的 3 个完全正确场景只从首次错误位置的均值与中位数计算中排除,不从整轨迹正确率中排除。

关键发现

  • 无干预重放的整体 VM 比四个模型在答案揭示下都高,却在影响步骤得零分。这不是基线真正理解了补丁,而是 10,200 次调用中仅 2,476 次受到干预影响。
  • 依赖自身预测可以比完全没有此前未来调用上下文更好,但远不及正确反馈。自由滚动的首次错误通常在第 2–3 步,后段准确率继续下降,整轨迹正确率单独作为排行榜会几乎没有区分度。
  • 格式问题不足以解释全部协议差距:前三个模型在任一协议下解析失败率最高为 1.4%;Sonnet 三种协议分别为 14.3%、13.5%、16.7%,绝对分数受格式明显拖累,不能把所有失败都解释为状态推理错误。
  • 原文存在统计冲突:正文称 DeepSeek 无反馈有 33/10,200 个不可解析响应,附录 H 表 12 却写解析失败 0.0%、可解析 100.0%。33/10,200 约为 0.32%,不能由一位小数舍入解释;本笔记保留冲突,不自行修正。

亮点与洞察

  • 用“改没改”对照拆穿评分捷径。 影响步骤并不等于修改行被执行的位置,而是执行后响应真正不同的位置。这个定义能捕捉拒绝更新后在更晚读取中出现的间接影响。
  • 把正确反馈当评测条件,而不是默认能力的一部分。 同一模型有正确近期历史时和靠自身预期时差距很大。工具使用评测也应明确成功来自外部状态回传,还是来自模型内部维护。
  • 严格响应匹配配合诊断指标。 主分数不放过错误余额或计数,SM 与字段匹配则帮助解释失败层次。这样既避免只判成功/失败过于宽松,也避免把所有非精确命中混成一种错误。

局限与展望

  • 覆盖范围有限且不均衡。 六个确定性 Python 服务没有并发、随机性或真实分布式系统复杂度,限流器占 105/255 个场景;等服务加权只是敏感性检查,不能替代更丰富的采样。
  • 协议不是纯单变量消融。 无反馈同时省略此前未来调用,自由滚动和答案揭示采用固定 20 次窗口;窗口大小及提示措辞的敏感性尚未测量,不能把差距全部归因于反馈真假。
  • 影响步骤 VM 无法惩罚所有虚构变化。 独立的 106 场景无效果探针中,答案揭示 VM 为 DeepSeek 81.6%、Kimi 83.0%、Sonnet 82.3%,而无干预重放应为 100%;该探针覆盖不匹配 Core-v1,未报告 Qwen,不能合并成主体排行榜。
  • 错误来源没有被分离。 揭示干预时真实状态、允许受控代码执行、记录首次状态分歧,可以进一步区分历史状态推断与执行模拟;这些是待验证的后续实验,不是本文已经证明的机制。
  • 不支持生产部署保证。 主体只测四个 API 配置及一个提示格式,24 场景思考模式探针也不足以证明一般优势;高分不意味着智能体修改安全,不代表其他语言或真实动作策略上的泛化。

相关工作与启发

  • vs CRUXEval / REval:它们研究程序执行相关预测,本文强调跨调用持久状态与历史之后的干预。迁移时应保留运行时状态,而不是把服务简化成独立函数题。
  • vs Executable Counterfactuals:两者都用可执行程序固定反事实语义,本文的关键增量是既有状态不回滚、修改只影响未来,并在多次调用中测量响应变化。
  • vs ToolSandbox / Agent-Diff / TRAJECT-Bench:这些基准评估动作、工具调用或最终状态,本文固定未来动作以隔离响应预测;它是互补诊断,不能替代端到端智能体成功率。
  • 研究启发:构造覆盖匹配的有效果与无效果场景对,同时测量漏预测变化与虚构变化;再与真实状态揭示条件交叉,检验模型究竟缺少状态恢复还是规则执行。该方向由本文局限直接引出,尚不是已验证的方法。
  • 资源:CTE-Bench-Core-v1 数据集;论文说明释放场景、执行服务、判分器、参考输出及评估卡,本笔记未联网验证其可用性。

评分

  • 新颖性: 4/5 — 历史后干预、固定未来调用与影响步骤评分形成清晰的组合任务。
  • 实验充分度: 3/5 — 三协议和无模型对照有解释力,但服务覆盖、提示敏感性及错误归因仍有限。
  • 写作质量: 4/5 — 评估卡明确区分支持与不支持的结论,解析统计冲突需要澄清。
  • 价值: 4/5 — 适合诊断代码智能体的软件状态预测能力,不是部署安全认证。