论文里那个基础集合坍缩成一个基的bug,AI把论文变代码时在偷懒 Оригинал на китайском

你有没有想过一个问题:AI 现在写代码这么厉害,能不能直接把一篇学术论文变成一个能跑起来的代码仓库?

听起来像是科幻片里的情节,但这件事已经有人在做了。而且做出来的结果,有点一言难尽。

2024 年有一篇论文叫《Universal Neural Functionals》,讲的是怎么处理神经网络权重空间里的某种复杂结构。论文里有个算法,需要把一组索引按照所有可能的方式做分割组合,数学上叫"划分",然后对每一种划分方式都构造出一个对应的基向量,最后把这些基向量拼起来,形成一个完整的表示空间。

假设你有三个东西要分组,编号 1、2、3。按数学上的规则,它们能分成 5 种不同的划分方式:各自单独一组、两个一组一个单独、或者三个全放一组。原始算法要求每一种划分方式都要生成对应的基向量,一个都不能少,最后拼出来的才是完整的基础集合。

有一个专门做"论文转代码"的系统叫 PaperCoder,它是这个领域里目前公认比较强的一个方案。研究团队让它去实现这篇论文,结果生成的代码里,这个关键的划分枚举逻辑被简化成了"只返回第一个划分候选"或者"只处理存在的平凡划分",本该是 5 个基向量的完整集合,变成了 1 个。

这不是代码写错了导致跑不起来的那种 bug,恰恰相反,这段代码语法完全正确,能顺利运行,输出的形状看起来也没毛病。它悄悄把算法的核心逻辑阉割了,而且没有任何报错提示你出了问题。

这就是这篇论文《PaperCompiler》要解决的事。

AI 写论文代码,难在哪

先说说为什么这件事本身就难。

一篇论文,尤其是顶会论文,写作的目的是给同行读的,不是给编译器读的。作者会说"我们采用了类似 X 的初始化方式","评估遵循标准协议",这些话对人类读者来说足够了,因为读者的脑子里已经有一堆背景知识可以自动补全。但对负责生成代码的 AI 来说,这些话全是坑,数据怎么预处理没写清楚、模型参数具体怎么初始化没写清楚、评估到底用什么指标算法没写清楚。

现在市面上已经有几套专门干这个的系统。

PaperCoder*:将论文转代码任务拆成"规划-分析-编码"三个阶段依次进行的系统,是目前这个领域比较有代表性的方案。

AutoP2C*:能处理论文里图表等多模态信息,并带自动调试功能的论文转代码系统。

AutoReproduce*:会去挖论文引用的上下游文献里隐藏的实现细节,并用生成的测试代码反复修正结果的系统。

这些系统的思路都差不多:先让 AI 通读论文,生成一份计划或者摘要,再把这份计划交给下一个 AI 去写代码。问题就出在这个"交接"环节。

这个计划或摘要,几乎无一例外都是自由格式的文本,类似人写的会议纪要,大概说"这里要实现一个损失函数,包含几个部分",具体到损失函数的每一项怎么写、和哪个模块对接、边界条件是什么,全靠下游负责写代码的那个 AI 自己去猜。

这就好比你要装修房子,找了个设计师做完整体方案,方案里写着"客厅要有暖色调灯光,厨房要方便做饭"。这份方案本身没问题,但如果直接把这句话甩给一个不懂设计的施工队,让他们自己去理解"暖色调"具体是几瓦的灯泡、装在哪个位置、"方便做饭"意味着操作台要留多宽,施工队大概率会按自己最省事的理解去做,做出来的东西和设计师脑子里那个画面完全对不上。真正靠谱的装修流程,是设计师要出一份带精确尺寸、材质型号、点位标注的施工图纸,施工队照图施工,才能保证最后的成果和设计意图一致。

自由格式的计划,就是那份写着"暖色调""方便做饭"的粗糙方案。而 PaperCompiler 想做的,就是把这份方案变成有精确坐标和材质标注的施工图纸。

核心思路:把论文炼成"合同"而不是"总结"

PaperCompiler 这个名字里的 Compiler,指的就是编译器。编译器是干嘛的?把人写的高级语言代码,一步步翻译成机器能精确执行的底层指令,中间不能有半点模糊。作者把这个思路搬过来,论文里模糊的方法描述,要经过层层"编译",最后变成对代码仓库里每一个文件都有精确约束的规范。

整个流程分成三个阶段。

**第一阶段:论文落地(Paper Grounding)**

这一步做两件事。第一件事是构建一个"实现蓝图",把论文里所有和实现相关的细节抽取出来,做成一条一条的记录。每条记录会标注四样东西:这个细节说的是什么、它在论文里的出处在哪一节哪个公式、这个信息的可信程度如何、它在最终代码里应该扮演什么角色。

可信程度这个标注特别关键,论文把信息分成四类。

paper_fact*:论文原文明确写出来的,证据确凿。

external_contract*:论文说"这部分按某个外部协议/某篇前作的方法来做",相当于把细节外包给别处了。

implementation_choice*:论文没提,但写代码必须要有个说法,只能靠推断。

unresolved*:论文里模糊到没法安全推断的地方,得留着当悬而未决的问题,不能瞎猜。

这个分类的意义在于,它逼着系统诚实。以前 AI 遇到论文没写清楚的地方,要么悄悄用一个"看起来合理"的默认值糊弄过去,要么干脆漏掉这部分。现在每一条信息都要贴上"这是论文说的"还是"这是我猜的"的标签,后续所有环节都能看到这个标签,知道哪些地方是铁板钉钉、哪些地方是可以商量的。

第二件事叫"引用提取",专门处理那些又长又格式敏感、不能被压缩概括的材料,比如论文附录里的一整套 prompt 模板,或者一个具体的 JSON 输出格式定义。这些东西如果被 AI"总结"一遍再传下去,细节大概率会丢,所以干脆原样封存进一个叫"引用注册表"的地方,谁需要谁去查原文,不经过转述。

**第二阶段:规范编译(Specification Compilation)**

这是整个框架的核心。第一阶段收集来的那堆零散证据,在这一步被整理成三样东西:一份"防退化需求清单"、一张"文件归属地图"、每个文件各自的"施工合同"。

先说防退化需求。每一条需求会记录清楚:这个行为该怎么实现才算合格、有没有运行时的边界条件要注意、什么样的简化写法是绝对不允许的。前面提到的那个划分坍缩成一个基的例子,如果当初有一条防退化需求写着"禁止只返回单个划分,必须枚举全部有效划分",这个坑本可以避免。

然后是文件归属地图。这一步要回答:论文里的每一个需求,到底该由代码仓库里的哪个文件负责实现?哪些文件之间有数据要互相传递?这就好比一个团队接了个项目,项目经理得先明确谁负责前端谁负责后端谁负责数据库,而不是把整个需求文档扔进一个群里,让几个人自己商量着分工,分工模糊的地方,活儿要么没人干,要么两个人做重复了。

最后是每个文件的施工合同,英文叫 File-Level Contracting。这一步把前面两层信息,过滤压缩成某一个具体文件真正需要的那部分:这个文件要对外提供哪些接口、内部该怎么实现、它要消费谁产出的数据、它产出的数据谁要用、还有哪些约束不能违反。

**第三阶段:约束引导下的仓库生成(Constraint-Guided Repository Generation)**

前面两个阶段像是把整栋楼的图纸画完了,这一步才真正开始砌砖。系统按照文件间的依赖关系排好顺序,一个一个生成。生成某个文件时,手里同时握着三样东西:这个文件自己的施工合同、前面已经生成好的代码(这部分是既成事实,不能改)、后面文件对这个接口的期待(不能生成一个后面用不上的接口)。

如果碰到某个地方规范里写着"这里悬而未决",系统不会自己瞎补,而是老老实实把这个限制暴露出来,保留接口但明确标注这是没解决的问题。

数据说话:提升有多大

理论讲完了,来看实测效果。研究团队在 Paper2CodeBench 这个基准上做了测试,选了 ICLR、ICML、NeurIPS 2024 三个会议各 30 篇论文,一共 90 篇。

评估分三种协议。

Reference-free*:只看论文本身,不参考原作者代码,评判生成的仓库对不对。

P2C-Ex*:一种更细粒度的无参照评测方式。

Reference-based*:直接拿生成的仓库去对照论文作者自己发布的真实代码仓库,看有没有实现出关键差异。

三种协议里,Reference-based 最狠,因为它是唯一一个能真正戳穿"表面看起来完整、实际方法被简化"这种问题的评测方式。

| 评测协议 | PaperCoder | PaperCompiler | 提升幅度 |

|---|---|---|---|

| Reference-free | 4.562 | **4.777** | +4.7% |

| P2C-Ex | 4.535 | **4.728** | +4.3% |

| Reference-based | 3.647 | **4.152** | +13.8% |

看到没有,提升幅度最大的恰恰是最能揭穿假象的那个协议,Reference-based 提升了 13.8%,远超另外两个协议的提升幅度。这说明什么?说明 PaperCompiler 真正改善的不是"看起来像不像论文",而是"和作者原始实现的方法逻辑是不是一致"。

研究团队还统计了逐篇论文的胜率对比,在 ICLR、ICML、NeurIPS 三个子集里,PaperCompiler 在 Reference-based 协议下的胜率分别达到 82.1%、92.6%、88.9%,几乎是碾压级的优势。

再看和其他专门做论文转代码的系统对比,包括 AutoP2C 和 AutoReproduce:

| 方法 | Reference-free | P2C-Ex | Reference-based |

|---|---|---|---|

| AutoP2C | 2.700 | 2.700 | 2.088 |

| AutoReproduce | 3.375 | 3.013 | 2.650 |

| PaperCoder | 4.450 | 4.513 | 3.825 |

| PaperCompiler | **4.813** | **4.850** | **4.263** |

有意思的是,AutoP2C 用的 token 数量(1.68M)和 PaperCompiler(1.71M)几乎一样,但分数却差了一大截。这说明多花计算量不代表效果好,关键不在于"想得多久",而在于"想的方式对不对"。PaperCompiler 比 PaperCoder 多花了约 74% 的 token(1.71M 对 0.98M),换算成美元大概是每个仓库多花 1.88 到 7.51 美元,相对于精度提升,这个成本相当划算。

失败案例的诊断:错误到底减少在哪

光看总分不够过瘾,研究团队还专门统计了评审给出的具体批评意见,总共分析了两千多条,归类成几种典型失败模式。

| 失败类型 | PaperCoder | PaperCompiler |

|---|---|---|

| 算法退化 | 28.0% | 24.6% |

| 核心组件缺失 | 12.3% | **6.8%** |

| 评估协议不匹配 | 13.4% | **8.4%** |

| 高严重性问题 | 13.2% | **6.1%** |

"核心组件缺失"从 12.3% 降到 6.8%,几乎腰斩。"高严重性问题"从 13.2% 降到 6.1%,也是接近减半。这两个数字最能说明问题,因为它们对应的正是文章开头讲的那种坑,方法核心逻辑被偷懒简化掉,而且不报错、不提示。

不过也有一个指标反而上升了:API/接口不匹配问题从 2.3% 涨到 4.0%。这说明分模块、分文件生成虽然保住了算法逻辑的完整性,但代价是各文件之间的接口对接偶尔会出岔子,这是研究团队自己也承认的未解决问题。

消融实验:哪个组件才是真正的功臣

研究团队还做了个"拆积木"实验,把框架里三个关键组件依次拿掉,看少了哪个影响最大。

拿掉需求整理(Reconciliation),也就是不再提前提炼防退化清单,直接进行架构设计。结果 Reference-based 分数从 4.38 掉到 3.86,掉了 0.51 分,是三个组件里影响最大的。

拿掉文件合同(Contracting),也就是不给每个文件生成专属的局部规范。结果掉到 3.92,掉了 0.46 分,紧随其后。

拿掉上下文切片(Context Slicing),也就是让每个文件都能看到全部信息而不是精简过的相关部分。结果只掉到 4.11,掉了 0.26 分,影响相对最小。

有个具体案例很说明问题。有一篇论文叫 VDC,涉及多模态推理,原本需要接一个叫 Instruct-BLIP 的视觉语言模型接口。拿掉上下文切片之后,这个多模态推理模块直接变成了一个占位符,前向传播逻辑压根没实现,遇到实际调用就退化成生成几个通用的、和图片内容毫无关系的问题。而完整版的 PaperCompiler 保留了真正能跑的 Instruct-BLIP 接口,两者的 Reference-based 分数相差 2.25 分,这是消融实验里差距最悬殊的一个案例。

这个案例其实揭示了一个更深的道理:上下文切片这个设计,表面上看是在"减少"给模型看的信息,但它的真实作用是防止关键依赖被信息海洋淹没。如果你让一个人在一份 200 页的产品需求文档里去找某个按钮该长什么颜色,他很可能翻着翻着就漏看了。但如果你专门为他截取出和这个按钮相关的那两段,他反而更不容易漏掉。信息多不代表理解得深,有时候信息太多反而会把真正重要的细节淹没在无关内容里。

承认自己没做到的地方

论文很老实地列出了几条限制。

现在系统主要依赖文本解析后的论文内容,对论文里的架构图、复杂示意图这类非文本信息,处理能力有限。遇到这种情况,系统可能会退化成依赖 AI 自身预训练时学到的知识去猜,而不是真正从这篇论文里学到东西。

评估目前聚焦在"方法逻辑对不对",并没有验证生成出来的代码能不能真正跑通、跑出论文里报的那些具体实验数字。换句话说,这套系统证明了自己更懂论文在说什么,但离"完全自动复现一篇论文的实验结果"还有距离。

另外,规范和文件合同目前起的作用是生成时的指导,不是形式化的正确性保证。也就是说,即便有了这套约束体系,最终生成出来的代码依然可能有 bug,只是这类 bug 更多是常规工程问题,而不是方法层面被悄悄简化的问题。

写在后面

看完这篇论文,最触动我的其实不是那 13.8% 的提升数字,而是那个划分坍缩成一个基的案例。

这个 bug 之所以危险,恰恰是因为它太"正常"了。代码能跑,不报错,输出的张量形状也对,如果你不去对照原论文的算法描述,根本发现不了任何异常。这种"看起来对但实际错了"的情况,比直接报错要可怕得多,因为它会一直潜伏在那,直到某天你拿这个复现出来的模型去做后续实验,发现结果对不上,才会去回头排查,而排查的成本远比当初写对要高得多。

这也让我想起一个更普遍的问题:很多时候我们对 AI 生成内容的信任,建立在"它看起来很完整"这个表面判断上。一份 PPT 排版精美,一段代码运行不报错,一篇总结逻辑通顺,这些都容易让人放松警惕。但完整性和正确性根本是两回事,前者是形式上的,后者需要真正回到源头去核对。这篇论文提出的三段式编译流程,本质上是在用工程手段强迫每一步都带着"出处"往下走,谁说的、从哪来的、有没有被验证过,这套溯源机制,或许比单纯提高模型能力更值得被重视。

还有一点值得琢磨:论文里提到,拿掉上下文切片这个组件后,某些论文的分数反而变好了。这说明"给更多信息"不总是好事,有时候恰到好处的"遗忘"和"聚焦",比全知全能更管用。这个道理放在人身上似乎也成立,信息过载的人未必比信息精简的人做出更好的判断。

那么下一个问题来了:如果一篇论文本身写得就很模糊,连人类专家看了都需要猜,这套编译系统还能救得回来吗?

Q&A

Q1:PaperCompiler是什么?

A:PaperCompiler是一个把学术论文转换成代码仓库的AI框架,核心做法是先把论文里的实现细节编译成带出处、带约束的详细规范,再按这份规范逐文件生成代码,避免算法逻辑在转译过程中被悄悄简化。

Q2:PaperCompiler和PaperCoder相比提升有多大?

A:在最能识别方法逻辑是否被简化的Reference-based评测协议下,PaperCompiler比PaperCoder提升了13.8%(3.647分升到4.152分),高严重性错误比例从13.2%降到6.1%。

Q3:PaperCompiler为什么要区分论文事实和推断内容?

A:因为论文里很多细节是模糊或省略的,如果不区分清楚哪些是论文明确写的、哪些是AI自己猜的,代码生成时容易把猜测当成事实,导致方法核心逻辑被悄悄简化却毫无察觉。

作者声明:作品含AI生成内容
举报/反馈
Поделиться: Weibo Qzone
Хотите сотрудничество по этому материалу?
Мы свяжемся с вами в течение 1 рабочего дня
Оставить заявку