arXiv:2609.19134 · cs.CL · 提交于 2026-09-16 · 发布次日登上 Hugging Face Daily Papers 第一
科学软件是人类知识的另一种形态。流体力学求解器、等离子体动理学代码、海洋生物地球化学模型——它们把几十年的物理洞察固化成了可执行的代码,而且这些代码的正确性已经用真实算例验证过无数次。
但对智能体训练来说,这批资产几乎是封闭的。论文给这个困境起了个名字:科学经验瓶颈。原因是三重的——工具链彼此割裂、领域约定隐式存在、正确性标准高度专业化。普通代码仓库有测试就能跑,科学仓库往往需要专有算例、特定编译选项和一批只在论文里描述过的容差。
ScienceIDE 想做的事就是把这道墙拆掉:把全世界的科学代码变成智能体可以编程的环境。
一、基本单元的重新定义
大多数代码智能体环境以「文件」或「仓库」为基本单元。ScienceIDE 选择以科学模块为单位——它不是按目录切分,而是按「连贯的科学职责 + 可执行覆盖」来定义。
一个模块必须能被清晰地说出输入输出、算法阶段、实现路径、不承担的职责,以及支撑它的测试。这带来一个直接好处:一个仓库可以贡献多个环境,因为真正的科学职责往往和文件边界并不重合。
具体转换过程由智能体执行,但边界由人把关:
- 智能体检查固定版本的上游代码、依赖、许可证和构建假设,编译源码并运行官方测试与示例;
- 智能体提出模块划分方案;
- 领域专家审查分解方案与覆盖情况;
- 智能体实现环境专属的实验适配器,策展人持有模块边界与等效契约;
- 注册表与命令行工具强制结构并追踪来源。
批准后的模块被打包成三件套:可编辑工作区、检查单元、独立私有验证器。验证器与工作区分离是关键设计——智能体看不到答案,也看不到评分逻辑。
二、检查单元:把单元测试升级成科学检查
这是整篇论文最值得细读的部分。
一个检查单元由三要素构成:固定输入、分级输出、以及通过策略。通过策略有两种形式。
逐点比较,形式是:
|c - r| <= a + rho * |r|
其中 r 是参考值,a 是绝对容差,rho 是相对容差。精确相等只是 a = rho = 0 的特例。
但这里有一个非常内行的规定:逐点比较不适用于记账类信息——存储顺序、步数、时间戳、随机种子、特征向量相位都不比较。无序集合则通过输出自带的标识符对齐,比如粒子 ID。
不变量比较用于逐点边界无法覆盖运行间变异的场景。比较的是矩、分布、守恒量、积分范数。随机流和采样统计只能走这条路,因为它们每次运行的逐点结果本来就不同,但守恒量必须稳定。
校准证据的设计也很讲究:每个检查都有标称初始条件和变体初始条件,变体扰动的是「最小充分活跃输入集」,目的是揭示数值敏感性,而不是套用一条自动容差规则。标称与变体必须独立运行,两者都要复现参考值并拿到满分,才算自我验证通过。
最后,每个检查都要附一段白话写的 warrant:说明这个可观测量为什么和科学意义相关。这是把「数值对了」和「物理对了」缝在一起的那根线。
三、奖励:不看补丁,看数值
任务分七类——加速、修复、发现、复现、集成、校准、实现。其中修复和实现可以通过可逆变异与代码切除自动扩展候选量,其余类别留给专家指定目标。
发布出来的主体是修复类任务。做法是把一个语义缺陷注入固定版本的源码,智能体必须找到并修好,让代码的物理算例重新通过。参考修复就是这个注入的精确逆操作。
评分公式是:
reward_repair = max(0, (reward - floor) / (1 - floor))
floor 是未修复构建本身已经能拿到的分数。这个归一化的意义在于:一个原封不动的仓库得分恰好为零。 如果某个缺陷只影响部分算例,未修复构建可能已经拿到 0.6 分,那么只看绝对分数会严重高估智能体;除以 1 - floor 之后,奖励衡量的是「在剩余可争取的空间里拿到了多少」。
任务难度不用人工打标签,而是记录可测量属性:未修复分数、编辑点数量、验证成本、实测通过率。任务只有在三项验证都通过后才发布——官方修复在评分容器里得 1.0、未修复构建留有奖励余地、智能体镜像里不含任何答案材料。
四、规模与成绩单
数据规模:
| 项目 | 数量 |
|---|---|
| 科学代码库 | 27 个 |
| 环境 | 64 个 |
| 任务 | 2812 个(修复 2515、实现 295、加速 2) |
| 可执行检查 | 1076 个 |
| 困难集 ScienceIDE-Hard | 18 个环境、85 个任务(修复 52、实现 33) |
上游代码覆盖天体物理磁流体(Athena++)、海洋与大气建模(MITgcm)、等离子体动理学(Gkeyll)、材料描述符(DScribe)、量子多体(EDKit)、量子稳定子电路(Stim)等。仓库里公开了 64 个环境中的 15 个、85 个困难任务中的 30 个。
然后是智能体评估,结果是这一节里最有信息量的部分:
| 智能体 | 困难任务成功率 | 每任务成本 |
|---|---|---|
| Fable 5.1 | 67.1% | 7.90 美元 |
| Opus 5 | 64.6% | — |
| Astra | 63.1% | 3.56 美元 |
| Sol | 55.0% | — |
| 其余 11 个 | 低于 40% | — |
领先的智能体仍然有约三分之一的任务解不出来。 在 85 个需要真实科学推理的修复与实现任务上,这个数字比大多数代码基准上的饱和成绩更有说服力。
还有两个数字值得单独看。
第一是预算曲线。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。不同模型的「长尾能力」差异远大于它们在短预算下的差距。
第二是资源与正确性的解耦。成功率与运行时间的 Spearman 相关系数是负 0.22,与输出 token 量的相关系数是 0.01。有一个模型产出了 17.24 万 token 只拿到 36.0%。花更多算力不等于解得更对,这在科学任务上比在普通代码任务上更明显——因为方向错了的话,更多迭代只是在错误路径上走得更远。
五、训练侧:SFT 与 RL 都有效
监督微调用 GPT-5.6-sol 收集演示数据,再用数值等效验证器筛掉不合格轨迹,得到训练集 4567 段轨迹覆盖 564 个任务,验证集 544 段覆盖 81 个任务,任务 ID 不重叠。
基座是 Qwen3.5-4B、Qwen3.5-9B 和 Qwen2.5-72B-Instruct,全线性层 LoRA,训 3 个 epoch。留出的科学修复任务上:
- 4B 在 PLUTO-Particles-Dust 上从 0.0000 到 0.3333
- 9B 在 LAPS 上从 0.3125 到 0.5000
通用基准上出现了正迁移,但极不均匀:
| 模型 | 基准 | 初始 | 训练后 | 增益 |
|---|---|---|---|---|
| PhAI-IDE-4B | CodeXGLUE 缺陷检测 | 45.93 | 52.92 | +6.99 |
| PhAI-IDE-9B | BBH 单词排序 | 27.20 | 63.20 | +36.00 |
| PhAI-IDE-72B | CodeXGLUE 代码精化 | 1.63 | 2.40 | +0.77 |
36 个百分点的提升很扎眼,但论文同时报告了 9B 在 HumanEvalFix Python 上是下降的。这个诚实的负面结果比正面数字更有价值:它说明科学经验带来的迁移是任务相关的,不是普适的能力提升。
强化学习部分更有意思。它不经过 SFT,直接从 Qwen3.5-4B 起步,用多轮回合和定位提示训练。30 步之后:
- LAPS:0.357 到 0.857(2.4 倍)
- MITgcm-biogeo:0.286 到 0.571(2.0 倍)
六、RL 里两个可以直接抄的工程细节
细节一:截断掩码。
每个回合有 token 预算,超预算的轨迹会被截断。整条丢弃会让模型误以为预算无关;直接算进损失又会让模型学会用「早点收手」规避失败判定。作者的处理是折中:被截断的轨迹仍参与同组基线优势的计算,但在损失中被屏蔽。
效果是可见的:LAPS 的预算截断率从 39.5% 降到 6.6%,MITgcm 从 34.1% 降到 23.8%。更能说明问题的是,每回合 token 数不降反升——LAPS 从 1103 升到 1135,MITgcm 从 780 升到 914。策略学会的是把事情做完,而不是尽早停下。
细节二:去掉标准差除法。
优势估计用组相对形式,组大小 G 等于 8,但省略了标准差除法,遵循 Dr. GRPO 的做法,目的是避免在近双峰奖励分布下放大优势。裁剪用 PPO 风格的非对称区间,下界 0.2、上界 0.3。
训练栈值得一提:作者没有自己实现训练器,而是跑在 PSRL 上——一个把 rollout、奖励和训练解耦到参数服务器后面的 veRL 改版。接入一个外部黑盒智能体框架(在独立容器里运行、通过 OpenAI 兼容端点通信)不需要改动框架内部,只注册一个智能体循环和一个奖励函数即可。这是把「环境工程」和「训练工程」解耦的范例。
七、作者自己列出的局限
这篇论文的局限章节写得相当克制,值得完整记住:
- 范围窄:证据只覆盖可参考验证的软件任务,集中在计算物理与地球科学的修复与实现,不涉及开放发现。
- 覆盖假象:工厂生成的变体可能共享代码路径与假设,任务数量不等于独立的科学覆盖度。
- 评估上限:困难集只探测到 1 小时预算和两个耦合编辑点。
- 验证即建模选择:与选定可观测量和校准容差一致,不等于外部正确;合法替代方案可能不符合参考;缺少独立外部审计与对抗性奖励攻击评估。
- 专家依赖:工厂只是摊销了专家策展成本,没有消除它;上游分发权利、依赖变更和硬件变更都会让环境需要重新验证。
- 泛化未证:SFT 增益只限于选定公开基准,RL 增益只限于训练环境内的提示式留出任务,没有任何向未知代码库迁移的证据。
最后一条尤其重要。它把这篇工作的定位说清楚了:ScienceIDE 证明了「数值可验证的科学任务」可以成为智能体训练的可靠信号源,但它没有证明这种训练能泛化到没见过的科学代码。
不过即使只到这个程度,这批数字已经说明一件事:在需要真实科学推理的代码修改上,当前最强的智能体还有三分之一的题目解不开。 而这类代码比 Web 应用更值得修好——它的正确性直接对应物理世界的预测。