用 Claude Code 做长期科学计算项目

前提
目前,用编程智能体做科研通常遵循对话模式:提问、获取回答、迭代。但有些科学计算任务不太适合这种模式,比如重写数值求解器、将旧版 Fortran 科学软件移植到 Rust 等现代语言,或者对照参考实现调试大型代码库。这些任务目标明确,成功标准清晰,只需要偶尔而非持续的人工监督来指导整体方向,可能需要数天甚至数周的挂钟时间。
之前的 C 编译器项目 展示了这种模式的一个版本:Claude 在大约 2000 次会话中构建了一个能编译 Linux 内核的 C 编译器。通过一组测试、进度跟踪和自主执行循环,一个并行的 Claude 团队能够在许多独立会话中持续推进大型技术项目,直到满足所有成功标准。
本教程描述了如何为科学计算设置类似模式,使用 Claude Code,并以典型的学术实验室为背景。我们将以运行 SLURM 作业调度器的 HPC 集群为例,但核心思想——进度文件、测试基准、带有明确规则的智能体提示——无论你在哪里运行 Claude Code 都适用。撰写本文时,根据任务范围,5x 或 20x Max 计划订阅对于大多数此类工作流应该足够了。
本地迭代计划
在这种新工作方式中,你应该花大部分时间精心设计项目简报,清晰阐述项目交付成果和相关背景。在转移到集群之前,最好在本地迭代这份简报,与 Claude 一起完善它。将结果保存为项目根目录下的 CLAUDE.md 文件;Claude 会自动将其保留在上下文中。
一个好的项目提示还应该有一个引导协议,告诉智能体在新会话开始时,在编写任何代码之前首先做什么,例如:“阅读 CHANGELOG.md——特别是‘当前状态’和‘后续步骤’。从优先级列表中选择影响最大的任务。” 这可以防止智能体在不了解已完成工作或重新尝试已失败方法的情况下直接开始编码的失败模式。
项目的初始部分也可以在 Claude Code 网页版 上完成,然后在需要时使用 /teleport 命令将会话及其上下文传输到本地终端或计算集群。
跨会话记忆
进度文件(这里约定称为 CHANGELOG.md)是智能体的便携式长期记忆,类似于实验笔记。一个好的进度文件可能记录:(1) 当前状态,(2) 已完成任务,(3) 失败的方法及其原因,(4) 关键检查点的准确度表格,(5) 已知限制。失败的方法最为重要——没有它们,后续会话会重新尝试相同的死胡同。一个条目可能看起来像:“尝试使用 Tsit5 处理扰动 ODE,系统刚性太强。切换到 Kvaerno5。” 你的 CLAUDE.md 应该指示智能体持续更新 CHANGELOG.md。
测试基准
长期自主工作依赖于智能体有办法知道是否在取得进展。对于科学代码,这可以是一个参考实现、一个可量化的明确目标,或一个现有的测试套件。指示智能体在工作时扩展测试套件并运行测试,以防止回归,这通常很有帮助。
用 Git 协调
Git 和 GitHub 是监控和协调智能体进度的好方法,无需过多干预。智能体应该在每个有意义的单元工作后提交并推送。这为你在出现问题时提供了可恢复的历史记录,使进度在本地可见,并防止工作丢失(例如,如果你的计算配额在会话中途耗尽)。
实际上,这可以是 CLAUDE.md 中的一组指令,例如:“在每个有意义的单元工作后提交并推送。每次提交前运行 pytest tests/ -x -q。绝不提交破坏现有通过测试的代码。”
为了引导智能体,你随时可以 SSH 到集群并手动重新提示和/或更新其指令。你也可以使用 Claude Code 钩子(Hooks)来实现协作引导,而无需直接附加到会话。例如,一个 PostToolUse 钩子可以定期从远程仓库拉取并检查指定文件(如 STEERING.md)中是否有来自协作者的新指令。当新指令出现时,钩子将其注入 Claude 的上下文,让你或协作者在任务中途重定向智能体。这让多个人只需将文件推送到仓库即可协调运行。有关设置详情,请参阅 钩子指南。
执行循环
如上所述,通常先本地迭代计划直到看起来合理,并将其编码到 CLAUDE.md 中,这很有用。准备好后,在计算节点上的终端多路复用器(如 tmux)内启动 Claude Code 会话,告诉智能体在哪里找到你的代码库,然后让它工作。因为会话在 tmux 内运行,你可以分离、关闭笔记本电脑,并偶尔检查进度。在 HPC 集群上,你可能通过 SLURM 请求一个节点;在云 VM 或工作站上,通常可以直接启动 tmux。
一个启动 Claude Code 到 tmux 会话的示例 SLURM 作业脚本可能如下所示:
#!/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 循环,在智能体完成后将其踢回上下文,并询问它是否 真的 完成了。这对于长期运行的任务很有用,因为智能体会承认任务未达标,并继续直到达标。
Ralph 可以通过 /plugin 安装。Claude Code 中的典型调用提示可能如下所示:
claude code/ralph-loop:ralph-loop "Please keep working on the task until the success criterion
of 0.1% accuracy across the entire parameter range is achieved."
--max-iterations 20 --completion-promise "DONE"
在这里,Claude 将迭代最多 20 次,直到它保证任务完成并发出“DONE”咒语。你无需手动 SSH 到集群并在交互式 Claude Code 会话中运行命令,始终可以要求本地版本的 Claude Code(例如,在你的笔记本电脑上)执行此操作。
一个应用实例与结论
作为一个具体例子,我使用这些模式与 Claude Opus 4.6 一起 实现了一个可微分的宇宙学玻尔兹曼求解器。这是一个数值代码,根据一组宇宙学参数(例如,暗能量比例)预测大爆炸余辉——宇宙微波背景(CMB)——应该是什么样子。它通过演化光子、重子、中微子和暗物质在早期宇宙中的耦合方程来实现。像 CLASS 和 CAMB 这样的玻尔兹曼求解器是宇宙学中的核心科学基础设施,使得从 Planck 和 Simons Observatory 等巡天中进行参数估计成为可能。
该实现通过 JAX 完全可微,支持基于梯度的推断。作为对 现有代码(这些代码带有显著简化)的补充,该求解器覆盖了到各种 CMB 可观测量的完整流程。使用 CLASS C 源代码 作为测试基准,以及一个跟踪准确度表格和失败数值方法的进度文件,Claude 在几天的挂钟时间内从零开始构建了它,达到了与 CLASS 的亚百分比一致性。这类任务在结构上不同于 C 编译器项目,后者可以分配给大量并行智能体。而玻尔兹曼求解器是一个深度耦合的流程:复合模块中的细微错误可能悄无声息地改变可见性函数,从而改变扩散阻尼尺度,等等。调试需要因果性地追踪整个链条,这更适合单个智能体顺序工作,根据需要生成子智能体,并使用参考实现来二分差异并持续测试其工作。
我让 Claude 重建了代码一些主要交付成果(各种 CMB 角功率谱)在整个项目过程中的准确度,并标注了里程碑。它生成了上面的图表,显示在运行几天后达到了亚百分比准确度(智能体在此期间并非连续运行,并重启了几次)。智能体的进展有些笨拙——它可能犯下对宇宙学家来说显而易见的错误,比如被不同的规范约定绊倒——但它持续朝着亚百分比准确度的既定目标前进。
虽然最终的求解器尚未达到生产级,但它表明智能体驱动的开发可以将数月甚至数年的研究人员工作压缩到几天内。
机器学习研究中的一个普遍体验是,希望连夜启动一个实验(例如,训练运行),然后在早上满意地看到结果。不运行实验会带来机会成本。如今,不运行智能体似乎也有成本。如果你有计算配额、带有测试套件的代码库和明确定义的准确度目标,那么每个 不 运行会话的夜晚,都是留在桌上的潜在进展。科学计算常常卡在智能体擅长处理的那种工作上——追踪 2 倍因子、对照参考比较中间值、跨参数空间运行验证扫描。研究人员推迟这些任务是因为它们枯燥,而不是因为它们不可能。
相关内容
AI 对劳动力市场的影响:新衡量标准与早期证据
关于我们对 Claude Opus 3 模型弃用承诺的更新
觉得有用?分享给更多人