给科学家用的 Claude Code:本地跑、可追溯、能换引擎的 Open-Science 实测
1. 缘起:科研 AI 闭源,他们选择开源
6 月 30 日,Anthropic 发布了 Claude Science,说是给科学家用的 AI 工作台。
它能连六十多个科学数据库和工具包,跑出来的图、表、报告都留着可以查证的记录。
但它只支持 Claude 自家的模型,只对 Pro、Max、Team、Enterprise 这几档付费订阅用户开放。
三天后,新加坡一个叫 AIPOCH 的团队在 GitHub 上公开了一个新项目,名字就叫 Open-Science。
公开当天,他们往项目首页的说明里加了一张和 Claude Science 的对比表。
对方闭源,他们开源;对方只支持 Claude,他们不绑定任何一家模型;对方的数据放在云端服务器上,他们装在你自己的电脑里;对方要订阅,他们免费。
表格最后一行写的是:如果你今天就需要一个能用的 AI 科研助手,Claude Science 更强。
我们的优势不是功能,是结构上的天花板。
一个开源项目在第一天先承认对手更强,这种写法不多见。
两个月后,这个项目拿到 5517 星、2981 次提交,其中 2530 次来自同一个人。
一个人写愿景文档,另一个人两个月把代码写完,5973 个 TypeScript 文件,测试文件和源文件一比一配着。
仓库首页的横幅上写着一句 Science, Open to All。
他们想开的不只是代码,还有研究过程本身:一项分析是怎么做出来的,能不能换个人、换台电脑打开,接着跑。
程序员看到这个时间线大概就明白他们要做什么了:不绑定任何一家的模型和产品,自己做一个开源的科研 AI 工作台。
问题是,做到了什么程度。
2. 痛点:引文献、数据、图,三个绕不过的坎
先说科学家为什么不能直接用 Claude Code。
Claude Code 是 Anthropic 出的 AI 编程助手:你用一句话说清楚要做什么,它自己写代码、跑代码、把结果交给你。
假设一个博士生小李,手上有一篇论文要复现,也就是照着论文写的方法重做一遍,看能不能得出同样的结果。
他打开 Claude Code,让它帮忙分析数据。
跑是能跑,但三个地方会卡住。
第一,引文献不能编。
他让 Claude 找几篇相关论文,Claude 给了一批引用,标题作者期刊都像模像样,里面却可能混着根本不存在、查不到的条目。
审稿人一查就穿帮。
程序员写代码时也会碰到 AI 编一个不存在的函数名,但编译器一秒钟就会报错。
文献没有编译器,没人替你一秒钟查出来。
第二,数据不能出电脑。
他手上的病人数据有伦理审批,条款写明不能上传第三方服务。
Claude Code 虽然装在本地电脑上,但它干活时要不断联网,哪些东西发出去了、发到了哪里,科研流程管不到,数据边界说不清。
第三,三个月后审稿人问:这张图怎么来的?
他翻聊天记录,找到了当时的对话,但那段代码后来改过三次,环境也重装过,哪一版生成了最终那张图,说不清。
代码有 git,图没有。
这三件事,程序员写代码时也会遇到,但没那么要命。
代码跑错了重跑就是。
论文的图跑错了,可能是撤稿。
Open-Science 要解决的就是这三件事。
第二件最直接:它把项目、跑出来的图表报告(它统称为“产物”)、代码运行的中间文件,全放在你自己指定的本地文件夹里,设置里能看到位置和每一项各占多少空间,一个按钮换地方。
我这台机器上总占用 5.2 GB,其中几乎全部是它自己下载的 Python 和 R 运行环境,产物只有 2.7 MB,Notebook 6.0 MB,执行证据 1.7 MB。
它需要联网的只有三种情况:让 AI 模型思考、查公共数据库、下载软件包。
如果模型换成跑在自己机器上的开源模型,服务端也搭在自己单位里,连这三种联网都能收进内网。
图 1:设置里的存储页,数据位置在本地,分项占用,可更改位置
3. 拆解:引擎、模型,和它自己做的三件事
它到底是什么?一句话:Claude Code 当引擎,外面套了一层科研专用的壳。
它不自己造 agent,直接用现成的:Claude Code 本身就是一个 agent,你装好它,第一次启动的引导会扫描你机器上有没有 Claude Code,有就直接用。
我机器上装着,它识别出来了,路径都对。
设置里有一页叫“智能体框架”,四张卡片并排:Claude Agent、Codex、OpenCode、腾讯的 CodeBuddy,点一张就切。
连接走的是 ACP,一个 agent 之间互相通信的开放协议,所以换引擎不用改代码,接一个新适配器就行。
图 2:智能体框架页,四个引擎并排,Claude Agent 使用中
我真切了一次。
把引擎从 Claude 换成 Codex,加一个 Codex 订阅的模型服务商,主模型选 gpt-5.5,然后给它一个小任务:查一篇论文的元数据,再用 Python 画张分组示意图。
它跑完的总结第一句是:“我运行在 OpenAI Codex / GPT-5 系列模型上”。
调的是同一个 PubMed 连接器,同一套装包工具,同一个 Notebook,弹的是同样的审批卡片,产物存的是同一个地方。
壳没变,只是换了发动机。
图 3:Codex 引擎跑完的会话,自述引擎和模型,右下角 gpt-5.5
模型这层它也不管。
这里要分清两层:引擎是干活的那套程序,模型是引擎背后的大脑,两层都能换。
服务商类型下拉里有 27 种:Claude 订阅和 ChatGPT 订阅直接登录,不用另买 key;
官方接口有 OpenAI、Anthropic、xAI、DeepSeek;
国内的智谱、Kimi、MiniMax、阶跃、小米、商汤、火山方舟、阿里百炼、腾讯全在;
还有 OpenRouter 这类聚合网关和自定义网关。
派出去干子任务的 agent 和负责检查结果的审查员,还能各自单独指定模型,主 agent 跑 Claude,子任务跑 DeepSeek,都行。
那它自己干了什么?
三件事,正好对着前面小李卡住的三个地方。
第一,给 agent 塞科研专用的工具,对的是“文献不能编”。
36 个内置的科学数据连接器,PubMed、GEO、ChEMBL、ClinVar、PDB、AlphaFold 数据库这些,分别管着医学文献、基因表达数据、药物分子、致病变异、蛋白结构等公共数据库,包装成 300 多个可调用的工具,每个都能单独设权限。
AI 查文献、查数据,是真的去数据库里拿,不是凭记忆编。
23 个内置科研技能(加上 marketplace 里的 525 个,总共 548 个技能),技能就是写好的一整套操作流程,从文献综述到用 AlphaFold2 跑蛋白结构。
Python 和 R 的运行环境,它自己下载自己管,国内会自动走清华镜像。
第二,把 agent 的每一步录下来,对的是“这张图怎么来的”。
agent 生成一张图,它拦下来存成一个不能再修改的版本,附一串校验和,记录是哪段代码、哪个输入、哪个环境跑出来的。
这是它和通用编码工具最大的区别,后者一般没有这个概念。
第三,管边界,对的是“数据不能出电脑”。
Notebook 有网络沙箱和域名白名单,agent 每次要调工具、装软件包、切换环境、访问新网站,都弹一张审批卡片让你点允许还是拒绝,同一类操作批一次,这个会话里就不再问。
装包时它确实拦下过一个不在名单里的下载地址。
这层壳和 Claude Code 的关系,就像 VS Code 和编译器:编译器是别人的,但你的体验是 IDE 决定的。
4. 实测:跑一遍,再回头查账
说得再多不如跑一遍。
我给它一个真实任务:复现一篇 2014 年发在 PLoS ONE(一个综合性科学期刊)上的论文。
这篇论文研究的是:给气道平滑肌细胞用上地塞米松(一种常用的激素类药物)之后,细胞里哪些基因的活跃程度变了。
数据在 GEO(美国的公共基因数据库)上公开,编号 GSE52778,一共 16 个样本。
论文的核心结论是:一个叫 CRISPLD2 的基因在用药后显著上调,也就是活跃度明显升高。
我的要求分四步:先核实论文和数据集的基本信息;
再用 DESeq2(一个很常用的基因统计分析工具)做差异表达分析,就是把用药组和不用药组放在一起比,找出哪些基因变了;
然后出一张火山图和前 20 个变化最大的基因的表;
最后告诉我,CRISPLD2 在你的结果里是不是显著上调。
任务发出去,它第一步做的不是跑代码,而是先去核实论文。
它在一个 JavaScript 沙盒里写了一段代码,调 PubMed 和 GEO 两个连接器,把论文的 PMID、DOI(论文的两个身份证号)、期刊,以及 16 个样本各自是什么条件、用药没用药,全拉下来,整理成一张样本表。
右侧的 Notebook 面板实时显示它写的代码和返回的数据。
前面说的“文献不能编”,在这一步就体现出来了:信息是从数据库里拉的,不是它自己想的。
然后是装环境。
它自己建了一个 R 环境,装 DESeq2 和几个它依赖的软件包。
这一步我手动帮了一次忙,有一个数据包在沙箱里装不上,我在外面装好了。
其余全是它自己做的。
分析跑完,火山图出来了。
火山图是这类研究的标配图:每个点是一个基因,越往左右两边,变化幅度越大;越往上,结果越可信。
CRISPLD2 显著上调,log2 倍数变化 +2.63,约 6.2 倍,校正 p 值 4.7e-46,在一万八千个检验基因里排第 54。和论文结论一致。
翻译一下:用药后这个基因的表达量涨到了原来的 6 倍多,而且这个结果几乎不可能是偶然,校正 p 值就是衡量“偶然性”的那个数,越小越可信,4.7e-46 小到可以忽略。
图 4:它跑出来的火山图,CRISPLD2 已标注
它还给了一个我没要求的对比:它找到了 3994 个差异基因,论文报告的是 316 个。
差这么多,不是谁算错了。
它自己解释了原因:论文用的是另一个更早的工具 Cuffdiff,统计的粒度不同,还多加了两道筛选门槛(变化幅度要够大、表达量要够高),标准比 DESeq2 严得多。
同一份数据,筛子孔的大小不一样,筛出来的数量自然不同。
它自己加上变化幅度门槛之后,数量收敛到 1011 个。
跑完之后我点开溯源面板。
溯源就是顺着一张图往回查:它是哪段代码生成的,读了哪份数据,在什么环境里跑的。
面板上有六个标签。
代码标签是生成火山图的完整代码,读中间结果、标注 CRISPLD2、配色、阈值线,一行不少,顶上还有个按钮能导出成独立脚本,拿到别的电脑也能跑。
执行日志是每一段代码和它当时的真实输出,能整个下载成 Notebook。
环境标签记录了 R 版本、68 个软件包,还有一个可以下载的锁文件,就是把这 68 个软件包的精确版本号全部记死的清单,别人照着装就能得到一模一样的环境。
可复现性标签画了一张血缘图,也就是“谁生成了谁”的关系图:第 22 次运行产出中间结果,第 23 次运行读取它画出火山图。
它还写明这张图只依赖 23 次运行里的 2 次,其余 21 次无关,以后要重新跑一遍验证的时候,那 21 次可以直接跳过。
图 5:溯源面板的代码标签
图 6:溯源面板的血缘图
我又打开了它的审查员功能。
审查员是一个独立的 AI,不参与干活,只负责挑错,相当于给主 agent 配了一个审稿人。
它只能看到对话记录、执行日志和产物,看不到别的,还可以单独指定用哪个模型。
我让主 agent 再跑一轮复核,把三个核心数字从磁盘上重新读一遍,而不是凭记忆复述。
审查员给了五项检查,全部通过,每一项都附证据:引用被审的那次运行的编号和终端里的原文,逐个数字比对,连 2 的 2.63 次方等于 6.196 都自己验算了一遍。
图 7:审查员的检查卡片,每条附运行编号和终端原文
更有意思的在后面。
复核那一轮之后审查员又跑了一次,这回提了三条意见:报告开头一句被截断了;“300 字以内”这个要求没实际量过长度;跨轮次的一致性只靠记忆复述,没有用代码实际验证过。
主 agent 自动进入修正:补全开头句,写代码实测长度,从原始数据重新算一遍 DESeq2,把新结果和保存的结果逐项比对,允许的误差只有 1e-12,结果五项全同。
然后审查员重审,四项检查通过,每张卡片标着“处置结果:已解决”。
图 8:复核报告的综述标签,审查员四项检查、已解决
还有一条是主 agent 自己认的错。
复核数字的时候它发现上一轮算排名的那行代码写错了,打印出来的数字是无意义的,正确排名是 54。
它主动把这条标出来。
审查员专门去核了这一条,结论是:自述属实,错误只影响那一行打印,没有污染任何交付的数字。
这就是“每一张图都能追溯到生成它的那行代码”的实际样子。
小李三个月后被审稿人问起,点开溯源面板就行。
但审稿人不在小李的电脑前。
溯源面板再全,也只在这一台机器上。
5. 交接:一个 .science 文件,把整个研究过程带走
溯源面板解决的是“我自己能查账”。
审稿人、合作者、隔壁实验室想复现,需要的是把整个过程搬走。
Open-Science 给这件事定了一个文件格式:.science。
我把第四节那个会话导出了一次。
桌面窗口里,会话菜单 → 导出 → 导出会话包。
对话框只让你选一件事:精简导出,只带研究历史和必需证据;完整导出,再把所有可用文件都带上。
它预估了大小,21.7 MiB,下面一行提醒:分享前检查隐私数据。
我选完整导出,进度条走了四段,复制文件、验证包、压缩包、保存包,九秒,落盘一个 16.4 MiB 的文件。
图 9:会话菜单里的“导出会话包”,旁边就是“创建副本”
图 10:导出对话框:精简与完整两档,预估大小,分享前检查隐私数据
程序员会想拆开看看。
它是一个 gzip 压缩的 tar 包,解开是五样东西:manifest.json 是清单,每个文件的路径、类型、大小、SHA-256;
session.json 是对话,records.json 是 Notebook 的执行记录;
objects/ 目录下 85 个以哈希命名的文件,产物、中间结果、Notebook 缓存都在里面;
最后是 ro-crate-metadata.json,354 KB。
这最后一个文件值得多说两句。
RO-Crate 是科研数据打包的开放标准,用 JSON-LD 描述一个数据集里有什么、谁做的、怎么做的,Galaxy、WorkflowHub 这些平台都在用。
Open-Science 从 0.33 版起把整个会话的溯源写成 RO-Crate 1.1。
我这个包里有 425 个实体:88 个文件;
79 个 CreateAction,是 31 次 Notebook 运行按产物各记了一遍;
3 段 SoftwareSourceCode,火山图、Top20 表、复核报告各自的生成代码;
3 份环境快照,R 4.5.3、macOS arm64、68 个软件包的版本;
还有 4 个 AssessAction 和 16 条 Review,就是审查员那几轮检查,13 条 pass,3 条 warn,warn 的那三条正是第四节里它提的三条意见,连“pass: 三个核心数字与执行输出一致”这样的原文都在。
生成产物的 Claude Code、做审查的 claude-fable-5-1,都以 SoftwareAgent 的身份写在里面。
换句话说,不装 Open-Science,随便一个能读 JSON-LD 的工具也能把这个研究过程翻出来。
清单里还有一行 omissions:账号凭据、权限授权、模型服务商的续接标识,一律不打包。
包里自带的 README 只有三句话,最后一句是:校验和只验证字节,不验证科学结论,也不验证发送者身份。
然后我扮演接收方。
新建一个项目,项目菜单 → 导入 Session 包,选中那个文件。
它先解包检查,给出预览:1 个分支、51 条消息、85 个文件,未压缩 22.1 MiB,“未包含”那一栏列的就是上面那三样。
对话框顶上一句:导入会创建新的只读会话,不会自动运行代码。
点导入,五秒。
图 11:导入预览:1 个分支、51 条消息、85 个文件,未包含凭据
导入进来的会话,侧栏带一把锁。
对话、火山图、Top20 表、复核报告全在,点开火山图的溯源面板,代码、执行日志、环境、血缘图,和发送方那边一样。
只有一处不一样:可复现性标签顶上多了一行“这些记录由导入包提供,当前环境尚未重新执行检查”,验证状态是“尚未验证”。
也就是说,包里带的检查记录是发送方的记录,接收方的 App 不替它背书,你要它变成“已验证”,得在自己的机器上重跑一遍。
这个边界划得对。
图 12:导入后的只读会话:侧栏带锁,底部“已导入的研究记录”,火山图和产物都在
图 13:导入侧的可复现性标签:记录由导入包提供,尚未验证,血缘图完整
只读会话下面有一个按钮:创建副本以继续。
点了之后它复制所有分支和研究数据,十六秒,生成一个可编辑的新会话,历史、文件、溯源全部继承,只有模型要你自己选,因为包里不带服务商身份。
从这里开始,接收方可以接着问、接着跑、接着改。
图 14:创建副本之后:一个可编辑的新会话,原件仍然只读
小李把这个文件发给审稿人,审稿人在自己的电脑上导入、创建副本、重跑第 22 和 23 次运行,火山图就在他自己的机器上长出来了。
这就是“研究过程开源”落到实处的样子:开源的不是一份代码,是从提问到出图的整条链。
6. 深挖:它为什么禁掉 Claude Code 的原生工具
给程序员讲一个细节。
Claude Code 原本自带几只“手”,能自己派帮手、执行命令、翻文件,Open-Science 把它们全捆了,换成自己的手,这样每一步才能记账。
下面是它怎么捆的。
Open-Science 启动 Claude Code 的时候,传给它的启动参数里有这么一段:
--disallowedTools Agent,Task,Workflow,SendMessage,TeamCreate,TeamDelete,Bash,Glob,Grep
--permission-prompt-tool stdio
第一行是一张禁用清单。
Agent、Task、Workflow,是 Claude Code 自带的“派帮手”功能,全禁了。
Bash、Glob、Grep,是 Claude Code 最基本的三个工具,也禁了。
为什么?
因为它要自己接管。
代码里有一道检查,确认 Claude Code 原生的派帮手功能全部关闭,才允许开启它自己的委派功能。
主 agent 想派子任务,只能走 Open-Science 自己提供的接口,由它另起一个新的 agent 进程当专项帮手,跑完把结果和产物交回来。
子任务有持久化记录,中断了能接着跑,可以中途向用户提问,最多 4 个同时进行。
Bash 也一样。
agent 想跑任何命令,只能走它自己的 Notebook 工具。
这条路上有网络沙箱,有审批卡片,有执行记录。
而 Claude Code 自带的命令执行没有这些约束,一旦绕开 Notebook,溯源链就会断一环。
第二行参数是另一半。
Claude Code 每次要权限,不是在自己的终端里问你,而是通过标准输入输出回传给 Open-Science,由它弹审批卡片。
你在界面上点的每一个“允许”,都经过它的手。
换句话说,它把 Claude Code 的手全换成了自己的手。派帮手、执行命令、翻文件、要权限,全部收编。
这样每一步才能记账,溯源面板里的那些东西才有来源。
代价是灵活性。
子 agent 和主会话绑死同一个引擎,主会话用 Claude Code,子 agent 也是 Claude Code,不能像有些人搭的多 agent 系统那样让 Claude 指挥 Codex。
这是一个明确的取舍:牺牲灵活性,换可控和可追溯。对科研这个场景来说,选对了。
7. 边界:现在还做不到的事
它有几处短板,写在这里,读者装了去试不会觉得被骗。
内置的 23 个科研技能,大头是蛋白质结构和单细胞分析:AlphaFold2、Boltz、ESMFold、scGPT、scvi-tools。
项目公开的路线图里写得很清楚,今天的领域范围是生命科学。
别的学科要自己写技能,它有一个技能创建器,用自然语言描述就能生成,但没现成的。
可复现性做到了“能查账”,“能重跑”刚起步。
这是两回事:查账是拿出证据证明这张图当时是怎么来的;重跑是照着当时的配方再做一次,看能不能得到一模一样的结果。
最近的版本加了重跑验证,按封存下来的代码、数据和环境配方,在一个干净的隔离环境里再跑一遍,然后一个文件一个文件地比对。
但这个功能目前只在桌面窗口模式下可用,网页和无头模式里那个按钮是灰的,.science 的导出、导入和创建副本也是桌面窗口的功能。
包里带的检查记录只是发送方的记录,接收方那边会标成“尚未验证”,要自己重跑一遍才算数。
它的路线图自己也承认:能保留能证明的证据,还不能保证重跑得到完全相同的输出。
装完要配五步:环境检查、数据位置、选引擎、选模型、装 Python 和 R。
说“新手也能上手”有点勉强,但对会用 Claude Code 的人来说不是问题。
国内网络环境下,运行环境的下载走的是海外 CDN,挂了代理的机器可能要调一下。
换 Codex 引擎要走 ChatGPT 的设备码登录,账号安全设置里那个开关默认是关的,得先打开。
这些它自己都写在文档里了。
一个项目肯主动列自己的边界,前面那些话反而更可信。
8. 补充:远程算力、命令行与下载
还有两样东西我没跑,但程序员会感兴趣。
一是算力能甩到远程。
预测蛋白结构这类重活,普通电脑跑不动,得用带显卡的机器。
设置里注册一台带 GPU 的机器,或者一个 Slurm 集群,agent 自己把任务提交过去,跑完自动把结果拿回来分析,不用你写轮询。
AlphaFold2 那些技能本来就是给这个准备的。
二是有 headless 模式和命令行。
它能不开窗口只跑后台服务,所有操作走一个 open-science 命令,或者一个零依赖的 Node.js SDK。
我这次测试后半段就是用命令行发的任务,跑完直接把产物下载下来:
open-science run --project <项目> --prompt-file task.md --wait --json
open-science artifacts download <产物 id> --output volcano.png
塞进脚本里批量跑,或者接进 CI,都行。
最后说数据。
项目首页挂着一张成绩表:在项目方自供的 BiomniBench-DA Public-50 对比中,录得 79.05 分,用的是 gpt-5.6-sol 这个模型,不是 Claude。
这是一套公开的生物医学数据分析测试题,让 AI 做题,由两个模型当评委打分取平均。
需要说明的是,这个分数是项目方自己跑、自己汇总的对比,数据集官方页面上没有公开排行榜,引用可以,但要清楚它是自报的。
它是 Apache-2.0 开源,macOS、Windows、Linux 三个平台都有安装包,macOS 一条命令:
brew install --cask open-science
仓库在 github.com/aipoch/open-science,官网 aipoch.com/open-science,推特 @aipoch_ai。
它的用户也不只是实验室里的人。
一个本科生想复现一篇论文,不用先学会配 R 环境和调 DESeq2 的参数:装上它,把论文和数据集编号给它,过程它跑,账它记,跑完导出一个 .science 文件交给导师看。
任何对研究感兴趣的人都能这样从一篇论文开始。
这大概就是 Science, Open to All 的意思:科学不只是结论对所有人公开,做出结论的过程也是。
如果你手上有 Claude Code 订阅,又有实验室的朋友总问你“能不能帮我跑个分析”,装上它,把电脑推过去就行。