薛定谔的代码仓库:用评估时仓库变换检验 LLM 是学会了 SWE-bench 还是背会了它 Schrödinger's Code Repository: Have LLMs Learned SWE-bench or Memorized It?
四级语义保持变换使仓库成为评估时才实例化的潜变量,揭示 SWE-bench 高分部分源于记忆
前置知识
SWE-bench 与仓库级代码基准
SWE-bench 把真实 GitHub issue 变成可执行任务:智能体需要在完整仓库里定位并修复 bug,改动必须让「fail-to-pass」测试由红转绿且不破坏「pass-to-pass」测试,指标为 $Pass@1$(单次运行解决比例)。其人工核验的 500 实例子集 SWE-bench Verified 是当前编码智能体的标准考场,常用 mini-swe-agent 等 scaffold 驱动模型通过命令行与仓库交互。
全文都在追问这个基准的高分是否可信,必须先理解「解决一个实例」意味着什么、测试如何判定,才能看懂作者为何能用 $\text{Pass-to-Pass}(V)=1$ 这类标准来证明变换没有破坏任务。
数据污染与记忆效应
基准所用的开源仓库在预训练语料中反复出现,模型可能记住命名规范、文件布局甚至 gold patch,而非学会仓库推理,这就是数据污染导致的记忆效应。SWE-Bench Illusion 等工作已表明模型会利用 issue 描述与代码位置的稳定关联,OpenAI 也据此公开说明 SWE-bench Verified 不再可靠衡量前沿能力。
本文的动机实验就是要把这种记忆定量化(65% 以上实例有泄漏证据),而 SchrodingerRepo 的设计目标正是系统性地侵蚀这些可被记忆的仓库侧线索。
语义保持程序变换与 AST
把源码解析为抽象语法树(AST)后,可以在不改变程序行为的前提下改写它:遍历符号节点做标识符重命名、对互不依赖的定义做重排、生成行为等价的重写。Level 3 用定义期依赖图 $G$ 加随机拓扑排序保证任何合法顺序都维持导入期与类构造语义,变换后仓库须通过原测试套件才算有效。
Level 2/3/4 全部建立在 AST 变换之上,而「语义等价 + 测试通过」的有效性检查是把性能下降干净归因于记忆侵蚀而非任务破损的关键前提。
智能体轨迹与动作分类
编码智能体通过一串动作(命令行操作)与仓库交互,论文把动作分为 navigate(导航)、search(搜索)、read(阅读)、probe(运行时探测)、edit(编辑)、test(测试)六类,用平均动作数、平均输入/输出 token 衡量交互成本。不同模型的探索风格差异很大:有的偏好静态阅读检索,有的偏好执行探测。
RQ2 的核心结论「81.6–83.6% 的新增动作花在探索定位上」完全建立在这套动作分类上,不理解六类划分就无法解读性能下降背后的行为机制。
研究动机
SWE-bench Verified 用 500 个人工核验的真实 GitHub issue 成为编码智能体的标准考场,但它建立在 Django 等被广泛使用的开源仓库上,这些仓库连同 issue、代码、测试、讨论反复出现在训练语料中,且每个 issue 只以一种固定的「经典」仓库呈现被训练、开发和评估反复遇到。于是高分可能来自对命名规范、API、文件布局甚至补丁内容的记忆,而非真实的仓库级推理。作者先做了动机实验:人类专家把问题陈述从完整 issue 中分解为从粗到细的语义单元,逐轮透露给只能看到 instance ID、无法访问仓库文件和 gold patch 的被测 LLM,每轮由专家判断其输出是否含任务特定内容,分为无有效回忆、文件/符号级、修复逻辑级、补丁/测试级四类证据。结果显示每个被测模型都有超过 65% 的实例呈现明确泄漏证据,超过 18% 的实例能被回忆到补丁/测试级。SWE-bench Live、SWE-rebench、SWE-bench Pro 等时效性基准虽然用模型发布后的新实例降低污染,但规模和 issue 类型覆盖有限。
本文的目标是本文的目标是把「仓库表示」本身变成一个可控的实验变量:在不改变底层 bug、可执行行为和测试判定标准的前提下,系统性地侵蚀模型可能在训练中记住的仓库侧线索(措辞、命名、布局、实现模式),然后测量同一个智能体在「熟悉呈现」与「陌生呈现」下的性能与行为差异,从而回答一个根本问题——SWE-bench 上的高分究竟反映稳健的仓库级推理,还是对经典表示的熟悉度。研究围绕四个问题展开:RQ1 量化四级变换对成绩的影响并定位哪级贡献最大;RQ2 分析变换如何把智能体的动作预算重新分配;RQ3 检验效应能否迁移到仓库级问答任务;RQ4 在时间上 held-out 的新实例上判断变换是否让任务本质上变难。
与已有工作不同的是,已有对策分两路且各有短板。其一是持续更新实例的时效性基准(SWE-bench Live、SWE-rebench、SWE-bench Pro),靠换题防污染,但牺牲了大规模成熟仓库中长尾失败模式的多样性;其二是静态扰动(SWE-Bench Illusion 的混淆、Saving SWE-bench 的实例变异、RepoMirage 的结构扰动等),但实例一旦变换完就固定下来,仍会进入未来训练语料被再次记忆。本文的独特切入是把仓库看作评估时才实例化的潜变量:随机种子决定每次运行实例化出哪个语义等价视图,映射可逆且执行始终锚定在真实 SWE-bench 环境中。这既保留了原基准全部实例与错误模式覆盖,又让「提前背答案」无从下手——你背的永远是上一个种子下的仓库。
核心方法
直觉很简单:如果智能体真的具备仓库级推理能力,那么面对一个语义完全等价、只是名字和排版不同的仓库,成绩不应明显变化;如果成绩大跌,说明它原来靠的是对经典呈现的熟悉感。技术上,SchrodingerRepo 为每个实例建立种子化、可逆的「原始仓库与智能体可见视图」之间的映射,在观测层(问题陈述、命名空间)和工作仓库层(文件内布局、实现形式)施加四级语义保持变换:Level 1 重构问题陈述,Level 2 重映射命名空间,Level 3 重排文件内布局,Level 4 做功能保持重写。工具执行仍在真实环境中进行,最终补丁通过 $\bigsqcup_{f \in C_B}\mathrm{Diff}(b_f, r'_f)$ 从最终仓库状态还原回原始坐标评估。在 SWE-bench Verified 上,全量变换使四个被测模型的 $Pass@1$ 下降 6.0–14.4 个百分点,平均动作数上升 61.5%–116%,且执行环境与判定标准完全未变——下降只能归因于熟悉线索被侵蚀。
核心创新是「评估时实例化的潜变量」这一形式化:仓库表示不再是固定的基准工件,而是由种子决定的、每次运行才确定下来的一个实现。与时效性基准不同,它不靠换题防污染,而是让同一道题以无限多个语义等价外观出现;与静态扰动不同,变换在智能体进入环境那一刻才发生,无法被提前背下。另一个关键设计是可逆性与执行锚定:Level 2 不改物理仓库,只在观测层把代码上下文、问题陈述和执行轨迹译入虚拟命名空间,并用会话笔记本记录实际发生的虚拟到真实替换,反向翻译仅限这些已观测映射;Level 3/4 产物须经官方测试套件验证 $\text{Pass-to-Pass}(V)=1$ 且 $\text{Fail-to-Pass}(V)=0$。这些保障保证工具执行、测试判定与原实例完全一致,使性能下降可以干净地归因于线索被侵蚀而非任务被改坏。
方法步骤详情
Level 1 用生成器 LLM 对问题陈述做信息重排、改写并删除非必要细节,再由验证器 LLM 检查任务定义约束是否完整,缺失则触发补全。Level 2 离线用 AST 遍历收集仓库内标识符(类、函数、模块变量、导入引用),过滤内置函数、保留字与第三方符号后,把标识符拆成子词映射为语义合理的替身(如 QuerySet 分解为 Query+Set 再映射为 Ledger+Suite),保持 CamelCase、snake_case、UPPER_CASE 与点分路径约定且共享子词翻译一致;在线由双向翻译器把观测译入虚拟命名空间、把动作译回真实坐标。Level 3 在文件级和类级识别可重排定义块,构建定义期依赖图 $G$(边编码装饰器、默认参数、类型注解、基类等名字可用性约束),用随机拓扑排序均匀采样合法顺序,非重排语句作锚点不动。Level 4 仅对 gold patch 相关区域调用受限重写智能体,生成行为等价但形式迥异的 unified diff,验证后作为工作环境。每级人工审查 100 个随机实例;每级用 3 个种子视图独立评测后取平均。
技术新颖性
新颖性有四点。第一,把防污染从数据侧(换题、删题)搬到表示侧,提出潜变量式仓库实例化,理论上支持无限多个等价视图,而静态扰动方法做一版就固定一版。第二,侵蚀线索的同时严格保持可执行性与可评估性:命名重映射刻意保留命名风格约定、翻译接口只改命名空间参数不改 bash 命令语义、重排尊重依赖图、重写只动 gold 相关区域,因此下降能归因于记忆依赖而非任务破损或可读性下降(与 PoorCodeSumEval 的降低可读性路线本质不同)。第三,四层变换可联合也可单独启用,首次把「仓库表示敏感性」分解到问题陈述、命名、布局、实现四个可分离维度,并实验发现 Level 2(命名)贡献最大降幅而 Level 1(措辞)几乎无效。第四,从最终仓库状态而非智能体原始补丁文本恢复提交,统一了各级变换下的评测口径,使虚拟空间中的操作能落回真实基准打分。
实验结果
RQ1(SWE-bench Verified,500 实例):全量变换使 $Pass@1$ 下降 6.0–14.4pp($p<0.05$):GPT 5.1 44.6%→36.2%、GPT-5.4-mini 46.8%→35.6%、DeepSeek-v4-Flash 72.8%→66.8%、Gemini-3.1-Flash-Lite 56.7%→42.3%。分级看 Level 1 几乎无效,Level 2 降幅最大(6.0–7.4pp,$p<0.01$),Level 3/4 仅降 0.8–3.4pp;成本同步暴涨,GPT-5.4-mini 输入 token +255.4%、DeepSeek 动作 +116.0%。RQ2:新增动作中 81.6–83.6% 花在探索类操作,仅 16.5% 用于编辑与测试;DeepSeek 偏好运行时探测(31.4%),GPT-5.4-mini 依赖阅读(41.8%)与搜索(33.1%),揭示探索强度与鲁棒性的权衡。RQ3(SWE-QA,144 实例):GPT-5.4-mini 降 4.64 分、DeepSeek 降 0.75 分,动作 +18.15%/+43.02%。RQ4(110 个发布后实例):$Pass@1$ 持平于 17.27%,动作 +8.15%、输入 token +22.01%,证明变换不增加任务固有难度。案例 django__django-11999 动作 37→217 而补丁相同。
查看结构化数据
| 任务 | 指标 | 本文 | 基线 | 提升 |
|---|---|---|---|---|
| SWE-bench Verified 仓库级 issue 解决(500 实例,全量四级变换) | Pass@1 (%) | GPT 5.1: 44.6→36.2;GPT-5.4-mini: 46.8→35.6;DeepSeek-v4-Flash: 72.8→66.8;Gemini-3.1-Flash-Lite: 56.7→42.3 | 各模型在经典(未变换)仓库呈现下的基线 Pass@1 | 下降 6.0–14.4 个百分点(p<0.05);平均动作 +61.5%~+116%,输入 token 最高 +255.4% |
| SWE-bench Verified 分级消融(每级单独启用,3 种子平均) | Pass@1 变化 (pp) | Level 1: 0~−2.0;Level 2: −6.0~−7.4;Level 3: −0.8~−3.4;Level 4: −1.2~−2.8 | 各自未变换基线 | Level 2(命名空间重映射)贡献最大降幅且 p<0.01;Level 1 几乎无效说明措辞不是主要泄漏通道 |
| SWE-QA 仓库级问答(Conan/Reflex/Streamlink,144 实例) | Average Score | GPT-5.4-mini: 70.35→65.71;DeepSeek-v4-Flash: 72.97→72.42 | 经典仓库呈现下的同名模型 | 下降 0.75–4.64 分;动作 +18.15%/+43.02%,输入 token +34.65%/+59.10%,效应成功迁移到问答任务 |
| SWE-rebench 2026 年 3 月 leaderboard split(110 个 GPT-5.4-mini 发布后实例) | Pass@1 (%) 与交互成本 | 全量变换后 Pass@1 保持 17.27%;动作 15.82→17.11(+8.15%),输入 token +22.01%,输出 token +15.58% | 经典呈现:Pass@1 17.27%,动作 15.82 | 准确率零变化——证明 SchrodingerRepo 不增加任务固有难度,只增加探索成本,且老牌热门仓库中成本上升更明显 |
局限与改进
作者承认两点:一是外部效度,实验限于 Python 开源仓库和 SWE-bench 式命令行交互,其他语言生态或装备 IDE API、语言服务器查询等富工具的智能体是否同样受影响仍是开放问题;二是内部效度,当前实现主要覆盖命令行式仓库交互。我自己的观察还有:动机实验依赖人类专家逐轮判断「是否回忆出任务特定内容」,主观性较强且没有自动化指标;Gemini-3.1-Flash-Lite 只在动机实验筛出的 300 个泄漏证据最强实例上评估,存在选择偏倚,其 14.4pp 的最大降幅无法与全量 500 实例结果直接比较;Level 1/3/4 的轻微降幅(0–3.4pp)与随机波动的区分只报了部分显著性;变换管线本身需要 LLM 重写、三轮种子评估和测试套件验证,评估成本约为基线的 3 倍以上;此外框架只能诊断而不能治疗记忆依赖,论文未给出让智能体变得表示鲁棒的方案。
独立分析的弱点
第一,Level 1(问题陈述重构)几乎不影响成绩(GPT 5.1 与 5.4-mini 持平),说明自然语言措辞不是主要泄漏通道,也暴露框架对题目文本污染的防御有限——若 issue 原文被背下,改写后模型仍可凭语义匹配回忆;改进方向是引入更强的语义层扰动并配合检索式污染检测。第二,Level 3/4 只作用于 gold patch 相关区域,仓库其余部分的布局与实现线索未被侵蚀,智能体仍可依赖通往目标文件的熟悉导航路径;可扩展为全仓库范围变换并配套分布式验证管线。第三,RQ2 的动作分布分析只深入两个模型,GPT 5.1 靠一句「分布相似」带过,结论的跨模型普适性证据偏薄,应至少覆盖全部四个模型。第四,变换视图只用于测量脆弱性而未用于训练,错失了把它作为数据增广或 RL 环境来训练表示鲁棒智能体的机会。第五,输入 token 成本上升 2.5 倍以上意味着即便承认记忆存在,用此框架做日常评估的性价比也需要论证,可研究只对高泄漏风险实例启用变换的预算分配策略。
未来方向
作者明确提出未来要支持 IDE API、语言服务器查询等更丰富的仓库感知工具接口,保证变换后的表示在各种工具界面上保持一致。在此基础上可以延伸几个方向:把 SchrodingerRepo 接入公开排行榜作为标准防污染评测协议,每次评测动态抽取种子,让「背仓库」永久失效;把变换视图作为训练时数据增广,系统检验能否训练出对表示变化鲁棒的智能体,并量化训练后脆弱性下降幅度;将四级变换推广到多语言(Java/Go/Rust)与多模态基准(SWE-bench Multimodal);用探针方法测量模型对虚拟命名的困惑度,做「哪些线索最容易被记忆」的可解释性分析;以及利用种子化等价视图构造对照实验,把记忆贡献与推理贡献做定量分解,为下一代抗泄漏基准提供理论框架。
复现评估
代码与数据已在 GitHub 开源(cslsolow/Schrodinger-Repo),实验基于公开的 mini-swe-agent 默认配置(温度 0、每实例最多 250 步动作),SWE-bench Verified、SWE-QA、SWE-rebench 均为公开基准,变换有效性靠官方执行环境测试套件判定($\text{Pass-to-Pass}(V)=1$、$\text{Fail-to-Pass}(V)=0$),并给出了动机实验的四类泄漏证据判定标准供人工对齐,可复现性设计良好。主要门槛在算力与费用:仅 SWE-bench Verified 全量变换下 DeepSeek-v4-Flash 就消耗约 370 万输入 token(基线约 105 万),每个变换级需 3 个种子独立评测再取平均,变换管线本身还要调用 LLM 做问题陈述重写、受限代码重写与验证器检查,总体评估成本约为基线的 3–4 倍;动机实验需要人类专家逐轮判断,难以完全自动化。综合属于中高难度复现:有 API 预算和 SWE-bench docker 环境的团队可以复现主表,动机实验则只能近似。
论文图表
动机实验流程与结果:人类专家把每个实例的问题陈述分解为从粗到细的语义单元,逐轮透露给只能看到 instance ID、无法访问仓库文件、gold patch 和测试信息的被测 LLM,每轮将其输出与隐藏参考信息对比,判断是否包含任务特定内容,证据分为无有效回忆、文件/符号级回忆、修复逻辑级回忆、补丁/测试级回忆四类。结果显示每个被测模型超过 65% 的实例存在明确泄漏证据,超过 18% 的实例能被回忆到补丁/测试级。
这是全文立论的动机证据:它直接量化了模型在与仓库交互之前就已经「记得」任务答案的程度,为后文所有仓库变换实验提供了问题合法性的实证基础。
主实验表:四个模型(GPT 5.1、GPT-5.4-mini、DeepSeek-v4-Flash、Gemini-3.1-Flash-Lite)在基线、Level 1–4 单独启用和全量 SchrodingerRepo 六种设置下的 Pass@1、平均动作数、平均输入/输出 token,附显著性标记(* p<0.05,** p<0.01)。核心数据:全量变换使 Pass@1 下降 6.0–14.4pp;Level 2 单独造成最大降幅(6.0–7.4pp);GPT-5.4-mini 输入 token +255.4%,DeepSeek 动作 +116.0%。
论文最重要的结果表:RQ1 的全部定量结论(性能降幅、分级归因、成本上升、统计显著性)都来自这张表,是评估「SWE-bench 是否被记忆」这一核心主张的一手证据。
SWE-QA 仓库级问答结果(Conan、Reflex、Streamlink 三个仓库各 48 实例):GPT-5.4-mini 全量变换下从 70.35 降至 65.71(−4.64),动作 6.28→7.42(+18.15%),输入 token +34.65%;DeepSeek-v4-Flash 从 72.97 降至 72.42(−0.75),动作 24.49→35.02(+43.02%),输入 token +59.10%。Level 2 仍是影响最大的变换,Level 1 几乎无影响。
RQ3 的证据表:它证明对经典仓库呈现的依赖不限于 issue 解决任务,而是泛化到更广的仓库级理解任务,支撑了框架结论的外部效度。
在 110 个 GPT-5.4-mini 发布之后创建的 SWE-rebench held-out 实例上的结果:全量变换下 Pass@1 与基线完全持平(17.27% vs 17.27%),但平均动作从 15.82 升至 17.11(+8.15%),输入 token +22.01%,输出 token +15.58%。
RQ4 的关键对照:在直接接触被评实例可能性极低的数据上成绩不降,证明 SchrodingerRepo 侵蚀的是记忆线索而非任务难度,排除了「变换让题变难」这一最重要的替代解释。