允中 发自 凹非寺
量子位 | 公众号 QbitAI
科研里常见的情形是:写一个能算准振荡积分的程序,把一段数值代码调快十倍,从一张数字表里反推出背后的方程——第一版实现通常都不够好。
主要工作量不在实现第一版,而在其后的几十到上百次试错。
这类工作的形式是搜索,不是单次执行。
openJiuwen社区的ScienceDiscovery把这段试错交给程序自己完成:被演进的是科研代码本身,模型不训练、搜索规则也不改,每一轮变的只有产物
通过树搜索实现科研场景产物RSI
搜索展开的形状是一棵树。每一版产物是树上的一个节点,可以被再次选中、改写并长出新的分支,也可以暂时搁置,几十版之后再被选中继续修改;得分较高的分支会获得更多改写机会。
每一轮迭代包括四步:选择一个父版本,交给模型改写,进沙箱评分并挂成新节点,最后把这次访问记账到它的全部祖先上。运行失败的版本同样入树,标记为失败。
沙箱由ScienceDiscovery的底座提供,运行失败、死循环和超时都会被隔离,因此不必对模型生成的代码预设限制。有了分数,程序才知道哪一版更好、下一轮该从哪里接着改。当这棵树能够持续生长、不需要人工逐轮介入时,产物就在自行迭代。
这就是RSI的一种形态:目标给定之后,往哪个方向走、退回哪一版、在哪里深入,都由程序自己决定。
案例一:半无穷区间上的振荡积分
半无穷区间上的振荡积分,是物理计算里绕不开的一类量。通用积分器在这里失灵:它靠局部误差估计决定往哪里加密采样,而这些函数振荡一直不停,这套方法给不出可靠的收敛判断。
取38道这样的积分,题面和答案AI全程看不到,唯一的反馈是精度分——0分代表全部算准,越低误差越大。直接调用scipy.integrate.quad得−3.40:19道里只有3道进入3%容差,最差一道与真值差了约24亿倍。
搜索到第119个版本时,得分是−0.0007:用于打分的19道全部算准,平均相对误差0.07%。这类积分此前没有可用的通用工具,现在有了一个可以直接调用的求解器。

最终那份247行的程序,会先判断被积函数在何处发散、振荡有多快,再分情况选算法——不是把38道题各写一个分支,而是一套通用规则,因此在未参与打分的19道题上同样有效。
整场搜索历时2小时、产生236个版本,全程无人干预。
同一类任务换对象:₂F₁的双精度求值
高斯超几何函数 ₂F₁(a,b;c;z)的双精度求值是特殊函数体系的枢纽,公认没有单一算法能覆盖全参数域。基线scipy.special.hyp2f1沿用数十年,在我们测试的参数分布上,约三分之一的点正确有效数字不足10位。
用glm-5.2跑48次扩展、598秒,产出一份199行的程序。在1000个从未见过的点上,平均正确位数从9.836升至11.771,能算到10位以上的点从659增至965,原先不足10位的那部分点大多被修正。
拆开程序可以看到它找到了什么:z小于 −1时标准算法不收敛,搜索找出一条经典恒等式,把z换成1/z避开这一段,并自行确定了切换的条件。

案例二:AlgoTune上的代码加速
AlgoTune收录了154个来自numpy、scipy、networkx、cvxpy的真实数值计算任务,交出的代码必须产生相同结果,得分是相对参考实现的加速比。
基准论文自身的结论是:现有模型「倾向于表层优化,而未能发现算法层面的创新」。
按AlgoTune自己的评分规则,ScienceDiscovery用同一套配置跑两个种子,平均加速2.279倍,同样的结果耗时降到原来的四成多。提示词里没有点名任何加速技术,改动由搜索自行找出。
作为对照,官方榜最高的是claude-opus-4.6的1.837,需要先用RL训一个模型的MetaEvolve是2.045;而这里用的是现成模型,没有做任何训练。

案例三:从观测数据反推方程
第三个案例属于科学发现本身:仅给出观测数据,反推背后的解析表达式。历史上不少物理定律正是这样得到的,例如开普勒从第谷的行星位置表中归纳出周期平方与半长轴三次方成正比。
LLM-SRBench的LSR-Transform子集给出的是一张纯数字表:4000行采样点、一列目标值。树上的每个节点是一段完整的Python程序,返回一个解析表达式。

通过树搜索,111道题里有41.4%写出了正确的方程,其中包括玻尔能级反解主量子数、普朗克分布反解温度、相对论多普勒,每题平均只有16.5次模型调用,采用deepseek-v4-flash费用开销不足3元。

成本:模型、调用次数与耗时
三个案例用的都是现成模型,deepseek-v4-flash和glm-5.2,权重未作调整,提示词里也不点名任何技术路线。
同一批对照里,MetaEvolve要先用强化学习专门训一个模型,符号回归里数值最准的LaSR靠的是数百万次遗传变异。
调用次数的差距同样明显:符号回归每题平均16.5次模型调用,表里其他方法在250次上下;积分这一场2小时产生236个版本,最好成绩出现在第119个,ERA的最后一次有效改进出现在第961个节点;2F1的程序来自48次扩展、598秒。
一次搜索几十到两百多个版本,单机耗时几十分钟到两小时,中途无需人工干预。
选择规则:深挖与铺开之间的分配
什么时候沿着一条路径继续改,什么时候转去动别的分支,不由人来判断,而是由同一个打分规则分配。
它不从根往下逐层走,而是把全树所有节点放在一起比较一次,每个节点算一个分数。
名次越靠前越容易被选中,预算因此向效果好的版本集中,这是深挖的一侧;同一个节点每被选中一次,权重衰减一次,一条路径改上几轮之后,选择会转向别处,这是铺开的一侧。
两项合起来,树一边沿当前最好的版本继续改写,一边回到早先被搁置的分支上。
积分这一例就是这样走出来的:最终版本的父节点是第116版,而第116版由第65版改写而来——一个得分仅−2.22、早已被超越的版本。
它被重新选中时,当时的最优版本是第95版(−0.99),已经被连续改写5次都没有更好的结果,这一侧不再有产出,预算随之转向别处。

如果选择规则只改写当前最优版本,这条路径不会出现。
搜索结束时的树的形状
积分问题上长出的236个版本摊开来看:前6轮全部花在根节点上,长出6条一级分支;随后迅速收敛,229个节点挂在其中一条下面;最宽的一个版本被反复改写了7次,最深的一条路径15层。

同一套搜索跑不同的题,长出的树形状也不同。

ScienceDiscovery的科研RSI底座
树搜索跑在openJiuwen社区开源的AI科研工作台ScienceDiscovery上,做成平台能力的是下面这层底座:并发地产生候选、在沙箱里评估、把结果合并进产物库、按治理规则决定谁能提交——所有「让产物自己迭代」的任务都要这一套,和用什么算法无关。
底座把演进循环固定成四个插槽:改什么、从哪个候选出发、怎么跑怎么打分、怎么合并提交。循环本身不动,换算法只是更换插进去的对象。
本文这棵树是往选择这一格里放了一套打分规则;换成遗传式的交叉变异、只留一条最优链的爬山、或者按不同特点各留一版的存档策略,其余三格一行都不用改。
换任务也是同理。上面三个案例——积分、代码加速、符号回归,跑的是同一套底座、同一套并发方式和治理规则,换掉的只有评分函数和根节点。

异步也是底座自带的:n个worker各取一份产物快照、各产生一个候选,评估完成后交给合并层,不必等待同一轮里的其他worker。Google ERA的参考实现是串行的,一次扩展一个节点;换到这个底座上就能n个同时扩展。
展望:验证的速度与可信度
三个案例有一个共同前提:结果能被机器判定。积分算得准不准、代码快了几倍、方程写没写对,跑一遍就有答案,几秒到几十秒。
正因为如此,236个版本能在2小时内跑完,全程无需人工干预
科研里的大多数问题不是这样。验证一个想法要合成一批样品、跑一次风洞实验、等一批细胞长起来,周期以天甚至月计,每错一次的成本都不低。
在这些领域,卡住搜索的往往不是改不改得出更好的版本,而是要等多久才知道这一版到底好不好——验证慢一个数量级,整个循环就慢一个数量级。
代码、算法、数值计算这几类之所以能先跑起来,正是因为它们的验证成本天然很低:一次评分几秒到几十秒。
要把同一套循环推到别的领域,要补的就是这一环:
- 一头是把验证做快、做便宜,用仿真替掉一部分真实实验,用代理模型先筛掉明显不行的方案,用自动化实验室把「跑一次」从几天压到几小时;
- 另一头是把分数做可信,通过更严的验证,让它和真实的目标不脱钩。
这一环每往前推一步,能交给搜索自己走完的任务就多一类。人负责定义目标和判断标准,剩下的几十上百次改写由搜索自己完成。
社区贡献
欢迎每一位开发者、科研人员以及领域专家参与共建,通过issue提出反馈或贡献内容,我们会持续迭代优化。
ScienceDiscovery代码仓:
https://atomgit.com/openJiuwen/sciencediscovery
https://github.com/openJiuwen-ai/sciencediscovery
openJiuwen官网:
https://www.openjiuwen.com
*本文系量子位获授权刊载,观点仅为原作者所有。