拆解 AI-Scientist 的自动化科研流水线:跟踪一个想法从生成到论文的全过程
【免费下载链接】AI-ScientistThe AI Scientist: Towards Fully Automated Open-Ended Scientific Discovery 🧑🔬项目地址: https://gitcode.com/GitHub_Trending/ai/AI-Scientist
科研人员的大量时间消耗在跑实验、整理数字、写论文这类重复性劳动上,真正的瓶颈不是算力,而是流程的串行。AI-Scientist 把这条流程整体交给大语言模型:它先读模板代码、提出实验想法,再自己改代码跑实验、写 LaTeX 论文,最后还审一遍自己写的稿子。从一条python launch_scientist.py --experiment nanoGPT_lite --num-ideas 2命令开始,一个想法从出生到被审稿人拒稿,全程无人介入。
问题拆解:一条论文流水线上的四个咬合子问题
这段要回答的问题是:这个系统到底在解哪几件事,它们如何互相依赖。可以把整条流水线拆成四个子问题,各自对应ai_scientist/下的一个模块:
- 想法生成:如何从一份给定的模板代码库里,提出能在其中落地的实验想法,对应
ai_scientist/generate_ideas.py; - 实验执行:把自然语言方案变成可执行代码,跑出可复现的数字,对应
ai_scientist/perform_experiments.py; - 论文组织:把零散指标和图转化为带引用的论文,对应
ai_scientist/perform_writeup.py; - 质量把关:判断这篇稿子是否达标,对应
ai_scientist/perform_review.py。
四个子问题之间不存在函数级调用,而是靠文件契约衔接:ideas.json→ 实验沙箱与notes.txt→template.tex与 PDF →review.txt。上游阶段的输出文件是下游阶段的唯一输入,任何一步都可以单独重跑。这个文件化管线正是下一节逐步走查的切入点。
🔍 全链路走查:一个想法经过的六个步骤
本节回答:命令跑起来后,每一步的输入是什么、经过哪个模块、产出什么。
第 1 步:想法生成,带反思的闭环
输入是模板目录里的三份材料:prompt.json(任务描述与 system prompt)、seed_ideas.json(种子想法)、experiment.py全文,外加已生成想法的存档列表。generate_ideas()让模型每轮先写一段THOUGHT再输出 JSON,字段包括Name、Title、Experiment(实现大纲)以及 Interestingness、Feasibility、Novelty 三个 1–10 分。随后最多进入 3 轮反思(launch_scientist.py中NUM_REFLECTIONS = 3),模型可以在思考里写 "I am done" 提前终止。产出写入ideas.json。
第 2 步:文献检索由模型自己发起
check_idea_novelty()逐条处理想法:由模型自行决定检索 query,search_for_papers()从 Semantic Scholar 或 OpenAlex 拉回前 10 条结果(含摘要),回填到对话中,最多 10 轮。system prompt 明确要求它"Be a harsh critic for novelty"——找到显著重叠的论文即判不新颖。结果写进想法的novel字段,launch_scientist.py里只有novel: true的想法会进入执行队列。
第 3 步:沙箱与基线
do_idea()用shutil.copytree把整个模板复制成results/<experiment>/<timestamp>_<idea_name>/,形成独立沙箱;同时读取run_0/final_info.json,取各指标的 means 作为基线,写入notes.txt第一条。注意run_0不是系统跑的,而是用户必须在自己的机器上先执行python experiment.py --out_dir run_0——因为论文里的耗时指标与硬件强相关,基线必须与实验同机产生。
第 4 步:最多 5 轮的实验循环
这是全链路最重的阶段。perform_experiments()把一个 aiderCoder(diff 编辑格式)挂到experiment.py、plot.py、notes.txt上,初始提示包含想法的Experiment字段、基线数字,以及一条硬约束:改动后只能用python experiment.py --out_dir=run_i这个固定格式的命令运行。循环逻辑是:模型改代码 →run_experiment()子进程执行(7200 秒超时,失败则删掉run_i目录)→ 失败时把 stderr 截尾 1500 字符回喂给模型重试,同一 run 最多 4 次;成功则读run_i/final_info.json,把均值交给模型决定是否重新规划。总 run 数硬上限 5(MAX_RUNS = 5),模型可输出ALL_COMPLETED提前结束。每次改动前,当前experiment.py会被复制成run_i.py,保证人能逐轮复查实际跑过什么代码。
第 5 步:从数字到论文
先让模型改plot.py并运行python plot.py出图,再让它往notes.txt写每张图的详尽说明(坐标轴、每条线代表什么、如何解读)。这份文件是撰写阶段的唯一事实来源:perform_writeup()的分节提示词里明确写着 "Do not hallucinate results that don't exist",Results 一节只允许引用notes.txt里出现过的数字。正文按 Abstract → Introduction → Background → Method → Experimental Setup → Results → Conclusion 的顺序逐节填写,每节写完立即按错误清单(未闭合的数学符号、未转义的下划线、重复的 figure label 等)精修一遍。Related Work 单独处理:先以 LaTeX 注释形式搭框架,然后进入最多 20 轮的引文循环——LLM 给 query、search_for_papers()找论文、程序把 bibtex 直接插进references.bib,再让 aider 负责在正文写\cite。最后generate_latex()用正则做静态校验(每个 cite 是否在 bib 中、每张图是否存在、有无重复章节),让模型最多修 5 轮 chktex 报错,再执行pdflatex两次加bibtex编译出 PDF。
第 6 步:五个审稿人与一位 Area Chair
load_paper()用 pymupdf 把 PDF 转成 markdown 文本,perform_review()按 NeurIPS 评审表让 5 位审稿人以 temperature 0.75 独立出评审(num_reviews_ensemble=5),get_meta_review()再由一个扮演 Area Chair 的模型汇总,最终数值分取集成均值。Decision 字段只有 Accept 与 Reject 两个取值,不设中间档。评审存为review.txt;若启动时带--improvement,perform_improvement()会依据评审意见改稿、重编译、再评一轮,产出review_improved.txt。到这里,一份带图表和引用的完整论文加配套评审,就落在了一个目录里。流程看似直白,但实现里有三处选择与直觉不同,值得单独拆开看。
设计取舍:三处与常见做法不同的选择
这段对比的是替代方案,以及项目方为什么没走那条路。
用 aider 做增量代码编辑,而非一次性生成代码。常见做法是提示 LLM 直接输出完整实验脚本,但模板的experiment.py有数百行,整篇重写很难对齐模板已有接口,错了也难以定位。AI-Scientist 反过来把文件挂进 aider 上下文让模型 diff 增量修改,失败靠 stderr 回喂自修复。代价是单个想法的 API 调用与时长显著上升——官方 FAQ 给出的数字是每篇论文低于 15 美元(Claude Sonnet 3.5);收益是一个想法能独立跑完全程而不是一次性产出废稿。
把基线留给人工执行。多数自动化系统会自己跑基线,这里却要求用户先在本机跑run_0。原因是论文中的运行时间属于对比性指标,基线与实验来自不同机器,数字就不可信。用一个必须人工完成的步骤,换来了实验数据内部的可比性。
评审用集成而非单次调用。README 的 FAQ 坦承,非 GPT-4o 模型做评审时存在 positivity bias(倾向性打高分),单次评审噪声大且有偏。5 个高温度样本加 meta-review 再取数值均值,在统计上更接近真实评审分布,代价是每篇论文多出 5+1 次调用。三处取舍共同指向一个取向:宁可多花调用次数,也要让每个数字和结论有出处、可复核。而这些取舍的实际效果,可以直接在仓库的产物里验证。
🧪 实证:读一份真实生成论文与它的评审
本节以example_papers/data_augmentation_grokking/为例,看系统实际产出了什么。
这个案例的想法是给 grokking 任务加数据增强:操作数反转、操作数取反,以及 15%/30% 概率的组合适配到不同算式数据集上。ideas.json里的Experiment字段写清了要改AbstractDataset的哪些方法、采集哪些指标。notes.txt记录了 5 个 run 的完整数字:基线(Run 0)里x_div_y需要4200 步达到 99% 验证准确率;取反增强(Run 2)把这个数字压到1443 步;permutation 任务在基线下验证准确率仅 0.036,组合增强(Run 3)抬到 0.687。论文 Results 一节引用的正是这些数字,与notes.txt一一对应——"notes 作为唯一事实来源"的设计在这里兑现了。
这张柱状图按 4 个算式任务分组对比 5 种增强策略的最终验证准确率:取反与组合策略在加、减、除任务上普遍高于基线,而 permutation 任务各策略差异巨大,说明增强对任务结构敏感。
步数图把"加速 grokking"这个主张变得更直接:柱高越低代表越早泛化,Run 2 与 Run 4 在多数任务上明显低于基线柱。
同一目录里还能找到run_1.py到run_5.py(每轮实际执行的代码快照)、log.txt、以想法名命名的 aider 对话全文,以及编译出的 PDF 和latex/源文件——整个想法的执行过程在磁盘上可回放。换成 2D Diffusion 模板,产物形态则是生成质量:
这是 dual_expert_denoiser 论文中双专家去噪器在 2D 数据集上的生成样本,点云结构基本还原了训练分布的多峰形态,是"生成质量提升"这一主张的视觉证据。值得注意的是,这份数据增强论文自己的review.txt给了各维度 3 分、Overall 5 分、Decision 为Reject,Weaknesses 逐条列出了"缺乏理论解释""新颖性有限"等意见。被自己拒稿不代表系统失败,恰好说明评审这道门在工作。但产物覆盖的只是问题的可自动化部分,系统做不了什么同样重要。
⚠️ 边界与代价:这个版本的三个硬限制
这段直面当前版本没有跨过的边界。
- 只覆盖可用代码表达的研究。README 的 FAQ 直接承认:"in this current iteration, this is restricted to ideas that can be expressed in code"。理论推导、定性分析类的工作不在它的射程内,这也是模板系统只能以
experiment.py为中心的根源。 - 硬件与成本是硬门槛。必须在 Linux + NVIDIA GPU 上运行,README 称当前模板在纯 CPU 机器上"infeasible";
--parallel每块 GPU 一个 worker,上限就是卡数。API 侧每篇论文低于 15 美元(官方 FAQ,Claude Sonnet 3.5),跑满 50 个想法的开销需要按模型定价自行折算。 - 任一环节失败,该想法整体作废。
do_idea()中实验异常、撰写异常、评审异常全部return False,没有部分恢复机制;成功率取决于模板与模型的组合,README 建议不要使用明显弱于 GPT-4 级别的模型,并指出 Claude Sonnet 3.5 成功率最高、评审效果 GPT-4o 最佳。此外系统会执行 LLM 编写的代码,README 明确要求容器化并限制网络访问(experimental/Dockerfile提供社区贡献的镜像),这条安全边界目前完全在使用者一侧。
明确了这些边界,就能回答最后的问题:它把"自动化科研"这件事推进到了哪一步。
它把问题推进到了哪一步
回到开篇的痛点:这个系统把"做研究"从人的串行劳动变成了一条可命令启动的端到端流水线——输入是模板目录,输出是带数字、带引用、带自评的 PDF 论文,中间每一步的输入输出都以文件形式落盘可回放。它产物的上限仍由模板和基座模型框定:想法是模板代码上的局部改进,而非跨领域的跃迁;评审给出的 Reject,究竟指向科学缺陷还是 LLM 审稿人的尺度偏严,这条流水线自己回答不了。作为流水线工程,它已经闭环;作为科学发现系统,它还停在"能交稿、但交稿是否值得发表需要人判断"的阶段。
【免费下载链接】AI-ScientistThe AI Scientist: Towards Fully Automated Open-Ended Scientific Discovery 🧑🔬项目地址: https://gitcode.com/GitHub_Trending/ai/AI-Scientist
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考