用 Claude Code 跑多日科学计算任务
大多数科学家目前使用 AI 智能体时,都采用对话循环的方式,对每个步骤进行紧密控制。随着模型在长周期任务上的能力显著提升,一种新的工作模式出现了:我们不再需要介入每个细节,而是指定高层目标,然后让一组智能体自主工作。这使得原本需要数天、数周甚至数月的项目,现在几小时就能完成。
某些类型的科学任务特别适合这种模式,比如重新实现数值求解器、将用旧 Fortran 方言编写的遗留科学软件转换为现代语言、以及针对参考实现调试大型代码库。这些任务的特点是工作范围明确,成功标准清晰,人类监督可以是偶尔的而非持续的。
Anthropic 的 C 编译器项目就展示了这种模式的一个版本,Claude 在大约 2000 个会话中构建了一个能够编译 Linux 内核的 C 编译器。本文描述如何为科学计算任务设置类似的模式,以典型的学术实验室为背景。
具体案例:可微分宇宙学玻尔兹曼求解器
作为一个具体例子,我将演示如何使用 Claude Opus 4.6 实现宇宙学玻尔兹曼求解器的可微分版本。这是预测宇宙微波背景(CMB)统计特性的数值代码,通过演化早期宇宙中光子、重子、中微子和暗物质的耦合方程来实现。
像 CLASS 和 CAMB 这样的玻尔兹曼求解器是宇宙学中的核心科学基础设施,让我们能够利用 Planck 和 Simons Observatory 等巡天的数据来约束宇宙学模型。可微分版本——能够通过整个求解器传播梯度——使得基于梯度的推理方法成为可能,大大加快了参数估计速度。用 JAX 编写很合适,因为它能免费提供自动微分和与加速器(如 GPU)的兼容性。
值得注意的是,这个任务并不在我的核心科学领域——我对工具和科学有高层次的熟悉度,但没有专业知识在合理时间内自己完成它。拥有这种专业知识的团队已经在 JAX 中构建了具有 CLASS 部分功能的可微分求解器,这些努力通常代表数月到数年的研究人员时间。这里的重点是看看智能体能否在非领域专家的最小指导下走得更远。
制定计划并在本地迭代
在转向管理自主研究智能体团队时,你应该花大部分时间(与 Claude 协商)制定一套清晰阐述项目交付成果和相关背景的指令。这些指令应该放在根目录的 CLAUDE.md 文件中。Claude 会特殊对待这个文件,将其保留在上下文中并参考整体计划。关键是,Claude 可以在工作时编辑这些指令,随着问题的解决更新它们以供未来工作使用。
这是宇宙学玻尔兹曼求解器项目的早期 CLAUDE.md,显示了在初步尝试编写求解器后编纂的整体计划和设计决策。为了达到这一点,我指定了项目的高层目标——在与参考 CLASS 实现完全功能对等的同时完全可微分,并且在主要科学交付成果上达到 0.1% 的精度目标——然后与 Claude 迭代直到计划看起来令人满意。考虑到 0.1% 是两个规范玻尔兹曼代码 CLASS 和 CAMB 之间的一致水平,这似乎是一个不错的科学目标。
跨会话记忆
进度文件(这里按惯例称为 CHANGELOG.md)是智能体的便携式长期记忆,充当一种实验室笔记。在 CLAUDE.md 中,Claude 被指示在这个文件中跟踪进度。
一个好的进度文件可能跟踪当前状态、已完成的任务、失败的方法及其原因、关键检查点的精度表以及已知限制。失败的方法很重要——没有它们,后续会话会重新尝试相同的死胡同。一个条目可能看起来像:“尝试使用 Tsit5 处理扰动 ODE,系统太僵硬。切换到 Kvaerno5。”这是运行示例的变更日志,显示了这些元素。
测试预言机
虽然通过智能体进行更开放式的科学发现肯定即将到来,但今天长期自主的科学工作关键取决于智能体是否有办法知道它是否在取得进展。对于科学代码,这可能是参考实现、清晰可量化的目标或现有的测试套件。指示智能体在工作时扩展测试套件并运行测试以防止回归也很有帮助。在我的示例任务中,Claude 被指示使用 CLASS C 源代码作为参考实现来构建并持续运行单元测试。
用 Git 协调
Git 可以是一种以不干涉的方式监控和协调智能体进度的好方法。智能体应该在每个有意义的工作单元后提交和推送。这为你提供了可恢复的历史记录,如果出现问题;使进度在本地可见;并防止工作丢失,例如,如果你的计算配额在会话中途用完。
实际上,这可能是 CLAUDE.md 中的一组指令,例如“在每个有意义的工作单元后提交和推送。每次提交前运行 pytest tests/ -x -q。永远不要提交破坏现有通过测试的代码。”
对于引导智能体,你总是可以 SSH 到集群并手动重新提示和/或更新其指令。通常更符合人体工程学的方法是简单地让本地 Claude Code 实例 SSH 进入并为你运行命令;这也适用于下面描述的所有内容。
执行循环
如上所述,通常首先在本地迭代计划直到你有一个看起来合理并编码在 CLAUDE.md 中的计划。从那里开始,在计算节点上的终端复用器(如 tmux)内启动 Claude Code 会话,告诉智能体在哪里找到你的代码库,然后让它运行。因为会话在 tmux 内运行,你可以分离、关闭笔记本电脑,并偶尔检查进度(在玻尔兹曼求解器的情况下,我会在手机上查看 GitHub,比如在排队买咖啡时)。
在 HPC 集群上,你可能通过 SLURM 调度器请求一个节点,启动 Claude Code 在 tmux 会话中的示例作业脚本可能如下所示:
#!/bin/bash
#SBATCH --job-name=claude-agent
#SBATCH --partition=GPU-shared
#SBATCH --gres=gpu:h100-32:1
#SBATCH --time=48:00:00
#SBATCH --output=agent_%j.log
cd $PROJECT/my-solver
source .venv/bin/activate
export TERM=xterm-256color
tmux new-session -d -s claude "claude; exec bash"
tmux wait-for claude
作业启动后,你附加到 tmux 会话,给 Claude Code 方向(例如,“读取 CHANGELOG.md 并开始下一个任务”),当你满意它在正确轨道上时分离。你可以随时重新附加以检查、引导或使用类似以下命令开始新任务:
srun --jobid=JOBID --overlap --pty tmux attach -t claude
Ralph 循环模式
随着模型变得更强大,它们需要更少的定制编排,如提示工程、RAG 或上下文填充。然而,在给定时间点,提供某种程度的脚手架作为能力提升可能是有用的。例如,当前模型可能遭受智能体懒惰——当被要求完成复杂的多部分任务时,它们有时会在完成整个任务前找借口停止(“天晚了,我们明天再继续?”)。
为了避免这种情况,一个有用的编排模式是 Ralph 循环,本质上是一个 for 循环,当智能体声称完成时将其踢回上下文,并询问是否真的完成了。这对于长期运行的任务很有用,因为智能体会承认任务不符合规范,并继续工作直到达到标准。其他类似模式包括 GSD(及其领域特定变体)以及 Claude Code 原生的 /loop 命令。
Ralph 可以通过 /plugin 安装。Claude Code 中的典型调用提示可能如下所示:
/ralph-loop:ralph-loop “请继续处理任务,直到在整个参数范围内达到 0.1% 精度的成功标准。” --max-iterations 20 --completion-promise “DONE”
在这里,Claude 将迭代最多 20 次,直到它保证任务完成并发出“DONE”咒语。
结果
Claude 在几天内从头开始处理这个项目,在其各种输出中与参考 CLASS 实现达到亚百分比一致。我让 Claude 重建代码一些主要输出(各种 CMB 角功率谱)在项目过程中的精度,并标记开发过程中的里程碑。它生成了下面的图表,说明了达到亚百分比精度的路径。

智能体的开发轨迹有些笨拙。例如,其测试覆盖存在明显空白——有一段时间它只在一个(基准)参数点测试代码,大大减少了其捕获错误的表面积。它也会犯基本错误,比如被规范约定绊倒,或者花几个小时追逐宇宙学家会立即发现的错误,但它持续朝着亚百分比精度的既定目标取得进展。
项目的一个副作用是,通过观察 git 提交历史,我学到了大量关于玻尔兹曼求解器和它们建模的物理知识。项目并非来自我的核心科学领域,但跟随 Claude 的增量进展并查找我不认识的内容,结果成为吸收科学知识的有效方式。提交日志读起来像来自一个快速、超字面义的博士后研究员的实验室笔记。
虽然最终的求解器不是生产级的(例如,它并非在每个机制中都达到可接受的精度匹配参考 CLASS 实现),但它表明智能体驱动的开发可以将数月甚至数年的研究人员工作压缩到几天内。
这种压缩改变了什么算作空闲时间。AI 研究中的一个普遍体验是启动一个实验(例如,训练运行)过夜,然后早上满意地看到结果。不运行实验有机会成本。如今,不运行智能体似乎也有成本。如果你有计算能力和具有明确定义成功标准的项目,每个晚上你没有智能体为你工作,就是潜在进展被搁置了。
觉得有用?分享给更多人