ScienceIDE:把全世界的科学代码,炼成 Agent 的可训练环境

你有没有想过一个挺拧巴的事:人类几十年攒下来的科学代码——等离子体模拟、海洋环流、天体流体求解器——里面沉淀的都是真金白银的领域知识,可大模型 Agent 想学这些东西,门都没有。代码能跑,但"跑对"的标准写在领域专家的脑子里;测试在,但容差是多少、哪个物理量该对齐、本征向量的相位算不算数,全是不成文的规矩。

SWE-bench 那套"给个 issue、跑个单测、对答案"的玩法,在通用软件工程上已经把 Agent 训练得风生水起。可到了科学计算这块,同样的路走不通——不是代码不够多,是"经验"没法兑现。这篇论文(arXiv: 2609.19134)管这个叫科学经验瓶颈,然后干脆修了一条生产线,把科学代码库批量"编译"成 Agent 可学习的环境。

核心摘要:ScienceIDE 是一套基础设施,由专家定边界、Agent 干体力活,把科学代码仓库变成带私有验证器的可执行环境。目前已经从 27 个科学代码库构建了 64 个环境、2812 个任务和 1076 个数值检查。在这套环境上,15 个前沿模型在一小时预算下最高只解出 67.1% 的难题;用环境产出的轨迹做 SFT 训出 PhAI-IDE-72B/9B/4B 三个模型,科学代码修复奖励和通用代码/推理/知识基准双双上涨;RL 实验里一个"截断轨迹屏蔽"的修复,让 4B 模型在 held-out 科学任务上的奖励翻了 2 倍多。我的判断:这不是又一个 benchmark,而是一套"经验制造流水线",真正值钱的是它把科学判断力变成了可复用的工程资产。


论文信息

  • 标题:ScienceIDE: Turning World's Scientific Codebase into Agent Learnable Environments
  • arXiv:https://arxiv.org/abs/2609.19134 (2026 年 9 月 16 日提交,cs.CL / cs.CY)
  • 作者:Hejia Geng、Zesen Huang(共同一作)等 50+ 位作者,通讯作者 Zhenfei Yin、Yingcheng Wu、Ling Yang
  • 机构:AItonomy Foundation、Oxford、UCLA、Princeton、UC Berkeley、Stanford、Caltech 等 25 家机构联合
  • 代码:https://github.com/aitofound/ScienceIDE

🎯 问题:科学代码是座金矿,但没有冶炼厂

先讲清楚这篇论文到底在解决什么。

编程 Agent 这几年进步快,一个重要原因是软件工程天然带"可验证反馈":仓库、编译器、测试,让模型的每个动作都能被观察、每个结果都能被判定对错。这就是 RLVR 能吃到的红利。

科学计算其实更有矿——代码背后是经过验证的数值模型,跑出来的结果有物理意义,天然是外部可检验的训练信号。但三个现实问题把它堵死了:

  1. 工具链碎片化。科学代码动不动是 Fortran + MPI + 一堆特定版本的依赖,复现都难,更别说批量跑。
  2. 正确性标准是隐性的。一个等离子体模拟,什么算"对"?某个物理量在容差内?守恒量守住了?这些规矩不写进 README。
  3. 能跑 ≠ 能学。就算代码跑起来了,还得变成有意义的任务:有行为验证、有分级反馈、有轨迹记录,才能喂给训练。

论文里有个说法我很喜欢:把科学代码搬到加速器上,到今天还是"一次手写一个 port",每个 port 绑定特定厂商工具链,双精度是默认而非推导出来的需求。瓶颈最尖的地方,恰恰是回报最大的地方。

顺带说句背景:同期不是没有科学方向的评测集。SciCode 有 80 道题,ScienceAgentBench 102 个任务,SWE-bench Science 有 119 个任务覆盖 98 个仓库,AInsteinBench 从 6 个科学仓库的 maintainer PR 出题。但这些都是评测资源,不是生产基础设施——题出完就出完了,不会源源不断地长出新任务。ScienceIDE 的定位差异就在这:它是个工厂,不是一张考卷。


🏗️ 方法:把专家判断"编译"成可执行契约

ScienceIDE 的核心设计一句话能说清:专家只做一次科学判断,这个判断被固化成可执行的检查,然后机器围着它批量造任务。

整个流水线分成几步。

第一步,圈定科学模块。 构造单元不是"一堆相关文件",而是代码库里一个拥有明确科学职责和可执行覆盖的模块。Agent 先检查上游固定版本的依赖、许可证、构建假设,把源码编译起来跑官方测试和示例,摸清输出格式、数值波动性、昂贵路径。然后 Agent 提议模块划分,领域专家审核边界——一个仓库可以贡献多个环境。

第二步,从官方测试到科学检查。 这是我觉得全文最有工程含金量的一段。奖励的最小单位是 check:固定输入 + 分级输出 + 通过策略。通过策略分两种:

  • 逐点策略(pointwise):每个被评值满足 \(|c - r| \le a + \rho|r|\),精确相等是 \(a=\rho=0\) 的特例。注意它只对物理可观测量评分,不管记账细节——粒子的属性跟着粒子 ID 走而不是数组槽位,存储顺序、自适应步数、耗时、随机抽样、本征向量相位都不算可观测量。
  • 不变量策略(invariants):当逐点容差既包不住运行间波动又挡不住真实错误时,改比矩、分布、守恒量或积分范数。

容差怎么定?用 nominal 和 variant 两组初始条件做扰动实验测数值敏感性,条件允许再跑一个 altbuild 测跨构建差异。每个 check 附带一份大白话的担保书:它识别哪个可观测量、这个界能区分哪种科学上相关的偏差、为什么合法实现能满足它。说实话,这套流程读下来,与其说是"造数据集",不如说是把计算物理里师徒相传的验收经验写成了代码契约。

第三步,任务工厂批量出题。 工厂 = 可复用的出题程序 + 环境特定的科学上下文。出题分七大类:加速、修复、发现、复现、集成、校准、实现。其中修复和实现可以靠可逆变异和代码切除自动化扩展,其余几类给专家留接口。

第四步,可执行证据验证任务有效性。 AI 提议不算数,证据才算数。以注入缺陷的修复任务为例:已知正确的 witness 必须能修好,未修复的基线必须留出改进空间,缺陷必须产生一个能被参考修复消除的检查失败。歧义规格、不可达分支、harness 故障一律判无效或不评分。修复分数归一化到缺陷起点:

\[r_{\mathrm{repair}} = \max\left(0, \frac{r - f}{1 - f}\right), \qquad 0 \le f \lt 1\]

其中 \(r\) 是科学一致性得分,\(f\) 是未修复构建的得分。这个归一化很实在——不同缺陷起点的任务可以直接比。

第五步,统一 episode 接口对接学习。 Agent 拿到可编辑工作区,改代码、跑实验、把产物交给私有验证器。harness 记录动作、观测、检查奖励、执行状态和资源消耗,区分科学分歧、交付不完整和基础设施故障。同一套接口,SFT 消费轨迹,RL 消费验证器奖励,评测消费固定任务集——科学内容本身跨模型、跨训练器复用。

目前的家底:64 个环境,来自 27 个科学代码库,2812 个任务(2515 个修复、295 个实现、2 个加速),外加 1076 个可执行数值检查。加速任务只有 2 个这个数,说明这块还是早期。


📊 实验一:15 个前沿 Agent,一小时能修多少科学代码?

公开评测集 ScienceIDE-Hard:85 个难任务,来自 18 个环境,覆盖 PLUTO、Athena++、MITgcm、LAPS、PHANTOM 五个代码库——天体流体、等离子体、海洋大气建模、粒子模拟。52 个修复 + 33 个实现,代码库规模在 \(10^4\)\(10^5\) 行。成功标准是严格的科学一致性(\(r_{\mathrm{repair}} = 1\)),不是"跑通了"。

15 个模型、8 家厂商,通过 Codex、Claude Code、Gemini CLI 三种 harness 跑,统一容器、统一指令、一小时预算。论文用了化名(Fable、Opus、Astra、Sol 等),老实说这种匿名处理在大模型横评里越来越常见,数据本身还是可信的:

排名 Agent 严格成功率
1 Fable 5.1 67.1%
2 Opus 5 64.6%
3 Astra 63.1%
4 Sol 55.0%
5–15 其余 11 个 全部低于 40%

头部 Agent 也留了近三分之一的任务解不出来。论文自己也很谨慎:Fable 只测了单次,Opus 和 Astra 的重复区间互相重叠,前三名不构成统计意义上的排序。这个态度我喜欢。

更有意思的是预算维度。10 分钟时 Astra 已经 49.6%,Fable 才 25.9%;Fable 到 31 分钟左右才反超。20 到 60 分钟这个区间,Astra 只涨了 2.0 个点,Fable 涨 11.8,Opus 涨 16.0,Qwen3.8 Max 涨 30.2——最终分数相近的 Agent,时间需求可能天差地别

成本账更刺眼:Fable 67.1% 的成功率代价是每任务约 7.90 美元,Astra 63.1% 只要 3.56 美元;Astra 平均每任务 9.4 分钟、13.9k 输出 token,Fable 是 16.8 分钟、85.7k token。DeepSeek V4.1 Flash 每任务吐 172.4k 输出 token,成功率 36.0%。成功率和运行时间的 Spearman 相关是 −0.22,和输出 token 量是 0.01——花得多和做得对,基本是两回事。这对做 Agent 产品定价的人是直接的警示:token 消耗不是能力的代理指标。

失败分析(附录 10.3)也值得一说。对 Fable 和 Astra 的轨迹审计发现:参考惯例不匹配分别占两者任务均衡失败的 71.4% 和 64.9%——比如 LAPS 的一个 timestep 任务里,两个模型都写出了能跑的代码,但都漏掉了"保留上一时间步"这条代码库自己的规矩。另有 10.7% / 17.0% 是修错目标:九个失败尝试在三个不同的 PLUTO 冷却任务上做了同一个非目标的对数底数修改。还有个隐蔽陷阱:本地自测通过不代表任务完成,只有通过私有参考评估才算数。这些失败模式在通用 SWE 任务里不太典型,是科学代码特有的坑。


🧪 实验二:科学轨迹 SFT,居然还能反哺通用能力

接下来回答一个更关键的问题:这些环境产出的轨迹,拿来训练管用吗?

作者用 GPT-5.6-sol 收集演示轨迹,用数值等价验证器筛选:训练集 4567 个片段、564 个任务,验证集 544 个片段、81 个任务,任务 ID 不重叠。然后在 Qwen3.5-4B、Qwen3.5-9B、Qwen2.5-72B-Instruct 上 LoRA 微调(ms-swift,全线性层,3 个 epoch),产出 PhAI-IDE 系列。

held-out 科学修复任务上的提升(数值见下图 a 区):4B 在 PLUTO-Particles-Dust 上从 0.0000 涨到 0.3333(+33.33 个点);9B 在 PLUTO-RMHD 上 0 → 0.2857,LAPS 上 0.3125 → 0.5000,MITgcm-Biogeo 上 0.0625 → 0.1250。

图:科学轨迹 SFT 的基准迁移效果

图:SFT 前后对比。(a) held-out 科学修复任务的验证器奖励;(b) 15 个提升至少 3 个点的公开基准对比;(c) 在独立题目上的确认实验,含 95% 置信区间。

通用基准上的迁移(b 区)有点出乎意料。4B 的 HumanEvalFix JavaScript 涨 10.98 个点,QuixBugs Java 涨 10.00,CodeXGLUE 缺陷检测涨 7.03(不过最终准确率仍低于 0.5,作者如实标了)。9B 的 BBH Word Sorting 从 0.240 跳到 0.576,涨 33.60 个点,GSM8K 也涨了 3.13。72B 在 ARC-Easy、HumanEval 上都有小幅提升。

更难得的是(c 区)的确认实验:在不相交的独立题目上重测,CodeXGLUE 缺陷检测 +6.99(95% CI [4.03, 9.87]),BBH Word Sorting +36.00([26.40, 46.40]),但也如实报告了一个下降——HumanEvalFix Python 上 9B 跌了 8.33 个点([−19.44, 2.78],区间跨零)。把阴性结果摆出来,这比很多只报喜的论文强。

我的解读:科学修复轨迹里那种"读代码→形成假设→跑实验→对照物理量修正"的循环,可能天然是一种高质量的多轮推理数据。它逼模型围绕可检验的证据行动,这比单纯的代码补全数据信息密度高。当然,这些涨幅不构成"全面提升",样本筛选也是挑涨得多的报(screening gains ≥ 3pp),这点要看清楚。


🔬 实验三:RL 部分藏着全文最实用的一颗珍珠

RL 实验在 LAPS(3D 伪谱 Hall-MHD 求解器,99 个修复任务)和 MITgcm-biogeo(海洋生物地球化学,87 个任务)两个环境上训 Qwen3.5-4B。奖励就是验证器原生输出:编译改过的代码、跑底层科学模拟、按检查打分。没有用学习出来的代理奖励,这点很干净。

训练栈是 vLLM 做生成、PSRL(基于 veRL 定制)做优化、harbor 跑 episode,rollout 和训练各占独立 GPU 异步跑。一个代表性 step 里优化占 2069 秒、rollout 751 秒——科学 episode 又长又贵,同步循环会被最慢的 episode 拖死,异步是必须的。优势函数用 Dr. GRPO 的写法,去掉组标准差除法:

\[\hat{A}_i = R_i - \frac{1}{G}\sum_{j=1}^{G} R_j\]

配合非对称裁剪(\(\varepsilon_{\mathrm{low}} = 0.2\)\(\varepsilon_{\mathrm{high}} = 0.3\))。

然后是全文我最想单独拿出来讲的一段:预算截断不是修复失败

长程科学任务里,episode 结束有三种原因:修完了、轮到顶了、响应预算耗尽了。只有第一种能说明成败,但 outcome-only 奖励对三者一视同仁。问题来了:一个预算截断的轨迹拿了零奖励,如果组内平均奖励为正,公式会给它负优势,把它生成的所有 token 往下压。而被截断的恰恰往往是 token 最多、尝试最难修复的轨迹。这就造出一个邪恶的捷径——策略只要让轨迹变短就能得分

作者在未屏蔽的对照跑里亲眼看到了崩溃:奖励先涨后跌破起点,每轮 token 数缩到三分之一不到;变短又导致更多轨迹撞轮次上限,截断更多,病理信号自我强化。死循环。

修复方案干净漂亮:截断轨迹留在组基线里(它的奖励信息有用),但从损失里屏蔽掉(它生成的 token 不该背锅)。同理关掉了 DAPO 的长度惩罚——这里的长度反映的是定位和修复缺陷的难度,不是该罚的东西。

效果:30 步后,held-out 奖励 LAPS 从 0.357 到 0.857(2.4 倍),MITgcm-biogeo 从 0.286 到 0.571(2.0 倍)。训练侧 LAPS 平均奖励 0.427 → 0.828,预算截断率 39.5% → 6.6%;MITgcm 奖励 0.381 → 0.597,截断率 34.1% → 23.8%。关键是每轮 token 数没降反升(1103 → 1135,780 → 914)——截断率下降不是因为模型学会了偷懒变短,而是真的把以前会死在预算上的长尝试跑完了。

这个坑和修法,对任何做长程 Agent RL 的人都直接可搬。说实话,这可能是全文 ROI 最高的一个技术点。


🤔 我的判断

亮点:这篇论文最值钱的不是某个数字,是把"科学判断力"变成了可复用工程资产的方法论。专家审核一次模块边界和容差契约,机器就能围着它量产任务——这个分工设计让专家精力集中在科学边界而非每个生成的任务上。对比 SWE-Gym(2438 个真实任务)、R2E-Gym(8.7k 程序合成任务)、SWE-smith(50k 合成实例)这条代码环境 scaling 的路线,ScienceIDE 把同样的逻辑推进到了科学计算,但加了科学计算独有的东西:容差标定、不变量检查、私有参考验证。RL 部分的截断屏蔽分析,独立看也是一篇扎实的技术报告。

疑虑也得说。第一,任务构成严重偏科:2812 个任务里 2515 个是修复,发现、复现、加速基本还没铺开,"发现导向"这个科学智能体最核心的能力其实没被覆盖到,作者自己在 Limitations 里也承认了。第二,数据污染防线有缝:作者明说遗留镜像保留了文件时间戳线索,难度选择先于完整的检索隔离,无法证明选择过程无污染。第三,RL 增益只在训练环境内的 hinted held-out 任务上验证,跨代码库迁移没测——2.4 倍这个数字别外推得太远。第四,加速任务只有 2 个,而引言里恰恰拿"科学代码移植加速器"当最大动机,这个落差有点大。

工程启发:如果你在做长程 Agent 的 RL,预算截断轨迹的处理方式值得立刻检查一遍——留在基线、屏蔽出损失,这个分离原则大概率能救你于无形。如果你手里有领域代码库(不一定是科学计算,金融引擎、工业仿真同理),这套"专家定契约、Agent 造任务、验证器给奖励"的流水线是可复用的模板。还有一个产品层面的提醒:准确率、耗时、token 成本是三个独立维度,排行榜上一个数字谁高谁低,可能掩盖了三倍的价格差。


📚 收尾

ScienceIDE 的愿景是个双向循环:科学给 AI 提供有根据的经验,更强的 Agent 回头扩展科学工作,新工作又产出新经验。这个飞轮能不能转起来,取决于 1000 个环境的目标能不能兑现、任务家族能不能跳出"修复"这个舒适区。但基础设施这东西,先有人修第一段路,后面才有车跑。这篇论文修的就是第一段。

觉得有启发的话,欢迎点赞、在看、转发。跟进最新AI前沿,关注我