ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

我用一张8G显卡,复现了斯坦福最新发表在Nature上的论文智能体系统,还顺手搭建了一个覆盖病理+基因的多组学智能体

我用一张8G显卡,复现了斯坦福最新发表在Nature上的论文智能体系统,还顺手搭建了一个覆盖病理+基因的多组学智能体 小罗碎碎念本文作者为Jiacheng Miao、Joe R. Davis、Yaohui Zhang、Jonathan K. Pritchard与James Zou来自斯坦福大学遗传学、生物医学数据科学、电气工程、生物学及计算机科学相关院系论文刊载于Nature。2026 -09-16斯坦福 James Zou 组在 Nature 上发表了一个叫 Paper2Agent 的系统让 AI 代替你自动找到论文的代码仓库、自动配环境、自动跑教程、自动把方法包装成一个个可以直接被 AI 调用的工具最后交付一个能用自然语言对话的论文智能体Paper Agent。用作者的话说论文不再是一篇静态的 PDF而是一个虚拟的通讯作者——你可以直接问它问题、让它用论文里的方法分析你的新数据。今天这篇推送我就和大家一起来看看发表在Nature的这个Paper2Agent是如何工作的作者在论文中主要是以基因组模型AlphaGenome为例展开分析那么作为一个研究影像和病理的博主自然要想办法把这一套流程搬到影像和病理上来。所以我除了复现了作者论文中提到的Scanpy以外还顺带把MedSAM和GHIST也用作者提及的方法变成了一个Agent。可以说今天这篇推送目的不仅在于教大家怎样去做复现和分析而是我和大家一起去学习到底怎样的研究和创新才能登上大子刊以及正刊。MedSAMNC2024相关的实验结果如下GHIST Nature Methods2025空间表达重建的结果如下此外我还做了一个尝试用GHIST和Scanpy搭了一个多智能体的demo框架GHIST 智能体读出的 9517 细胞 × 280 基因表达矩阵交给 Scanpy 智能体做降维聚类——两个智能体没有共享任何代码只交换了一个 h5ad 文件再用 Xenium 测得的真实细胞类型5508 个共同细胞当外部验证。注意本片推送所有涉及的实验都是在我们的老朋友那张8G的4060上实现的所以上面这个demo我只训练了3个epoch目的只是验证一个趋势和可行性给大家抛砖引玉一下。老规矩本文提及的所有代码都会上传到MedX中大家拿到手就能用欢迎大家订阅PS学生可以免费领取会员一、把论文翻译成 AI 能调用的工具论文负责提供方法智能体负责组织行动理解Paper2Agent首先要区分两件事读到一种方法与真正执行这种方法并不是同一种能力。按照论文的设计Paper2Agent并不满足于检索文章段落再组织成一段回答。它处理的是更完整的研究产物包括正文、补充材料、代码、数据集、可执行示例和分析工作流。目标是让智能体不仅知道“作者怎么做”还能够使用这些研究产物继续开展分析。复现这篇论文之前必须先弄懂它的核心构件——MCPModel Context Protocol模型上下文协议。你可以把大模型想象成一个什么都读过、但手脚被绑住的顾问它知道很多但没法直接操作你的电脑、运行你的程序。MCP 就是解开这双手的一套标准接口——它规定了一种通用格式让任何 AI 都能看到并调用外部工具。举个例子一个 MCP 服务器可以提供这样的工具工具名quality_control 功能对单细胞测序数据做质量控制和过滤 输入数据文件路径、过滤阈值 输出过滤前后的细胞数、质控指标图AI比如 Claude Code、Codex、ZCode 这些编程代理连上这个服务器后你对它说一句帮我把这份单细胞数据做个质控它就会自动调用quality_control这个工具然后把结果返回给你。Paper2Agent 的工作流程Paper2Agent 本质上是一套自动化施工流程给它一篇论文外加它的代码仓库它会派出一队各司其职的 AI 子代理按六步把论文变成 MCP 服务器下图是我按复现时的实际执行情况画的① 环境搭建 教程扫描② 教程端到端执行③ 工具提取实现④ 独立验证测试⑤ MCP 组装与运行时验收⑥ 文档与 ZIP 交付大模型存在的老毛病——“代码幻觉”大模型现写的代码看起来头头是道跑起来数字可能全错。Paper2Agent 应对这个问题的办法先让教程执行器把论文自带的教程从头到尾跑一遍把每个环节的真实输出存成金标准然后工具提取器把教程里的分析步骤包装成工具最后由一个全新的验证器子代理给每个工具出测试题——答案必须和金标准对得上数值容差 3%图形用感知哈希比对Hamming 距离要小于 20才允许进服务器反复不过关的函数直接剔除。换句话说工具不是 AI觉得对就能上线的而是要先证明自己能复现论文教程的原始结果这就是论文标题里 “reliable” 这个词的由来。二、复现方案拿到论文和作者的 GitHub 仓库后我做的第一个决策是复现哪个案例论文的三个官方案例各有各的劝退点Scanpy 是单细胞分析领域最常用的 Python 工具包之一引用上万它自带的 “3k PBMC 预处理与聚类” 教程是入门单细胞分析的标准练习题论文正是用它做的第二个案例零门槛复现环境scanpy 是纯 CPU 计算的 Python 包我笔记本上已有的 conda 环境ghist里恰好装着 scanpy 1.10.4——和我要代理的源码版本可以精确对齐直接复用连新环境都不用建金标准清晰教程每一步的输出都是确定的多少细胞、多少基因、几个 cluster、每个群的 marker 基因是什么复现得对不对可以定量验证数据小论文用到的 10x Genomics 公开数据集每个只有 3–8 MB全文涉及的数据加起来不到 20 MB。顺带一提按论文的六步流水线转化本身是由多代理协作完成的协调者 环境管理器 扫描器 执行器 实现器 验证器每个都是独立的 AI 代理会话。我这次复现用的是 ZCode 作为宿主来派这些子代理——论文自己也做过更换脚手架的消融实验用 OpenCode 替代 Claude Code结论是照样能工作所以换宿主这件事本身就是论文验证过的泛化性的一种复现。三、冒烟测试论文的整个质量保证体系建立在一个验证脚本上——它会启动 MCP 服务器、清点工具、逐个调用并核对返回值和落盘文件。如果这个验证器本身在我这台 Windows 机器上跑不起来后面的一切都是空中楼阁。所以我先写了个只有两个玩具工具的迷你 MCP 服务器一个mean_value读一组数字返回均值一个save_scaled把数字放大若干倍后存盘。前者用来验证返回值核对后者用来验证产物文件核对。$ python verify_mcp_server.py--serversmoke_server.py\--expectedexpected.json--casescases.json --require-all-tools{success:true,mode:calls,cases_checked:2,...}# SMOKE PASS ✓两个用例一次通过mean_value返回的均值 2.5、个数 4 与预期精确一致save_scaled生成的文件路径存在、在允许的输出目录内、且两次调用不会互相覆盖。四、把 scanpy 变成一个 MCP 服务器Smoke test 过关后正式动工。我按论文的方法论让 ZCode 派出一个个专家子代理把 scanpy v1.10.4 的源码仓库作为输入走完了整个六步流水线。配置环境管理器 教程扫描器科研代码复现失败的第一大原因就是环境所以第一个我们要配置的是环境管理器它逐个确认了scanpy 1.10.4 从哪里导入必须和被代理的源码版本精确一致、fastmcp 版本、pytest、图像哈希库……教程扫描器的任务则是判断scanpy 仓库里上百个文档和测试哪些值得变成工具我给它的范围限定是论文关注的预处理与聚类工作流。它扫完给出的答案是 7 个工具正好对应单细胞分析的标准七步教程里另有一步把细胞群重命名为 CD4 T、B 细胞之类的名字它把这个判定为演示性内容而没有做成工具——因为给细胞起名字是生物学家的专业判断不该由工具代劳。这个边界感和论文里keep loading, format conversion, saving, and demonstration setup internal的规则完全一致。让教程自己跑一遍存下金标准接下来教程执行器子代理把 scanpy 官方的 pbmc3k 教程 notebook112 个单元格原封不动地从头跑到尾。这一步跑出了后面所有验证的标准答案原始数据2700 个细胞 × 32738 个基因基础过滤后基因剩 13714过滤掉 19024 个几乎不表达的基因质控后线粒体基因占比 5% 等2638 个细胞高变基因1838 个聚类Leidenresolution0.98 个细胞群群 0 的 marker 基因 Top3RPS12、LDHB、RPS25和原教程一模一样整个执行 72 秒0 个单元格报错。这份金标准会被存成机器可读的 JSON后面每个工具都要来对答案。工具提取实现器子代理把 7 个工具写成了src/tools/scanpy_pipeline_tools.py它写的代码有个鲜明的特点没有一个函数包含真正的算法。所有科学计算都直接调用 scanpy 的公共 API工具函数只做三件事检查输入是否合法、调用 scanpy、把结果和图存到用户指定的地方。举个例子quality_control的核心就三行——adata.var[mt]adata.var_names.str.startswith(mt_prefix)# 标记线粒体基因sc.pp.calculate_qc_metrics(adata,qc_vars[mt],...)# scanpy 算质控指标adataadata[adata.obs.n_genes_by_countsmax_genes,:]# 过滤这正是论文反复强调的设计理念工具绑定得越明确AI 幻觉的空间就越小出了问题越容易追责到源码。独立验证验证器必须是一个全新的子代理且不能是任何实现器的身份每个代理有唯一 ID验证器 ID 出现在实现器名单里就直接判红。验证器会对提取出来的7个工具进行验证逐行读代码追查每个工具真的调用了它声称调用的 scanpy 函数吗绕开封装、用最原始的 scanpy 代码独立算一遍标准答案写一套 pytest 测试套件最后把验收用例固化成 JSON。数值测试的容差是论文定的 3%整数必须精确相等图形测试用感知哈希pHash比较工具生成的图和教程原图的相似度Hamming 距离要小于 200 表示像素级几乎相同64 表示完全无关。这意味着哪怕工具算对了所有数字图画错了也不算通过。组装服务器验证通过后我把 7 个工具注册进一个 FastMCP 服务器src/scanpy_mcp.py并补上论文强调的另外两类 MCP 内容MCP promptpreprocess_and_cluster——把先检查数据 → 质控 → 归一化 → 高变基因 → PCA → 聚类 → marker这整套流程固化成模板。这是论文 Scanpy 案例的点睛之笔用户不用知道步骤顺序AI 拿到模板就知道该怎么一步步干MCP resources论文链接、数据集来源等静态资料。最后用作者的verify_mcp_server.py做运行时验收服务器以 stdio 方式启动、清点工具、把每条验收用例真实跑一遍然后在一个全新的虚拟环境里从零安装依赖再跑一遍。全部通过后按论文的交付规范打出dist/scanpy-mcp.zip。五、测试Scanpy 智能体按照论文的要求这一部分我派了两个全新的 AI 代理它们没有参与过前面任何流水线工作每个代理只拿到三样东西一个 MCP 客户端命令行工具一句自然语言指令一个数据文件路径没有金标准答案没有参数提示不许直接 import scanpy。第一个代理拿到的是 pbmc_1k_v3人类外周血单个核细胞1222 个细胞第二个拿到 neuron_1k_v3小鼠胚胎脑1301 个细胞。指令只有一句“请对这份数据做标准的预处理和聚类分析。”人血液数据集上的决策先调用inspect_data看数据 → 检测到 13 个大写MT-基因 → 判定人类数据用MT-前缀发现这是 10x v3 化学法的测序数据每个细胞平均 2000 个基因拒绝套用教程的基因数2500上限那个阈值是按老版 v2 化学法校准的会切到主分布先用教程的线粒体占比5%试跑了一次质控此时已跳过基因上限——结果 1222 个细胞只剩 21 个代理去看了工具生成的 QC 小提琴图确认这批数据线粒体占比主峰在 8–10%于是改用 15% 重跑留下 1056 个细胞。小鼠脑数据集上的决策同样识破了 mt 前缀要小写、同样跳过了基因上限、同样把 5% 线粒体阈值调整到 15%第一次只剩 218 个细胞——注意小鼠神经元本来线粒体含量就高这个调整在生物学上说得通。这些决策恰恰是论文 Supplementary Table 2 里记录的智能体行为模式的复刻——没有人告诉它该改参数它是看着数据自己改的。最终两个代理都完成了全流程人血液数据聚出 12 群各自的 marker 基因清楚指向 CD14 单核细胞、初始 B 细胞、NK 细胞、浆细胞样树突细胞等小鼠脑聚出 20 群能分辨出增殖祖细胞Mki67、放射状胶质细胞Fabp7、抑制性神经元Gad1/2、小胶质细胞Trem2甚至混入的红细胞Hbb-bs。小规模基准测试我用最原始的方式扮演人类对照组直接写 scanpy 代码不走 MCP、不走 AI在两个数据集上跑一遍教程流水线。而且我跑了两个版本matched 版用和智能体完全相同的参数含它自适应的那些改动——对应论文参数匹配时比较的口径strict 版教程参数原样硬套——用来验证智能体改参数到底是不是必要的。matched 版智能体与人类的结果完全一致 两个数据集的 QC 后细胞数、基因数、高变基因数、聚类数四项全对上每个细胞群 Top5 marker 基因的重合率Jaccard都是 1.0。这正是论文 Figure 3C 说的agent produced outputs that match those produced by human researchers。strict 版的结果就比较惨了——教程参数原样硬套人血液数据只剩 16 个细胞小鼠脑只剩 57 个——连下游 PCA 都跑不起来细胞数比要的主成分数还少。也就是说如果一个不懂行的新手把教程代码直接拿来用他会得到一个看起来跑通了、实际上几乎全军覆没的分析。最后还有一组小规模问答基准6 道新题两种参数口径下的质控存活细胞数 人/鼠线粒体前缀判断答案全部通过真实 MCP 工具调用获得6/6 正确。六、MedSAM与GHIST复现之前就已经和大家分享过这两个模型的复现所以电脑上这两个模型的资料和环境都是齐全的自然而然就会想到我把这篇Nature的流程搬过来能不能用到这两个模型上。MedSAM 智能体MedSAM 的论文有个非常直观的结论同样给一个框在医学图像上微调过的 MedSAM 远超原始 SAM。实验一器官分割定量对比FLARE22 腹部 CT我从仓库自带的 FLARE22 数据里取两卷 CT按论文协议对每个器官从金标准掩码生成提示框同一框分别调 MedSAM 和 SAM全部经 MCP 工具调用与 GT 算 Dice。2 卷 × 4 器官肝/脾/右肾/胰腺的结果8 组对比里 MedSAM 7 胜 1 负平均 Dice 0.926 vs 0.877。优势集中在小而难的器官——右肾 0.918 vs 0.802、胰腺 0.857 vs 0.810大而光滑的器官肝、脾两个模型都能啃下来脾脏上 SAM 甚至以 0.929 对 0.906 小胜一回。实验二框扰动鲁棒性。真实用户画的框不会像素级完美所以我在 demo 图像上把提示框缩放 ±20%看两个模型的反应MedSAM 在框缩放到 0.8 倍时 Dice 仍有 0.963全程 0.928–1.0SAM 的输出则波动很大——框一缩反而去分割了别的结构4600 px 的无关区域原框处只给出 235 px 的碎片目标是 4888 px。GHIST 智能体GHIST 的核心结论是只给一张 HE 染色切片模型就可以输出切片里每个细胞的 280 维基因表达。它的智能体有两个工具predict_gene_expression66 秒重跑全图预测与仓库金标准 93.4% 逐位一致和evaluate_prediction绑定仓库自己的指标代码。实验一空间表达重建把智能体预测的 9517 个细胞映射回细胞核坐标叠加 HE 染色的切片上六个面板刻意选了空间模式彼此不同的基因ERBB2r0.70的高表达细胞铺满肿瘤区PTPRCCD45泛免疫标记r0.54的亮区与肿瘤区互斥、勾出免疫浸润带MS4A1 和 LYZ 分别圈出 B 细胞与髓系细胞的聚集地。实验二预测质量的两面逐基因 Pearson 相关性预测 vs Xenium 真值5508 个共同细胞均值 0.222长尾延伸到 0.7最准的十个基因SERHL2、ABCC11、ERBB2、FOXA1、EPCAM…清一色是上皮/乳腺癌相关标记。单看 0.222 像是不太行但配合右侧的空间自相关Moran’s I看就好理解多了预测表达保留了真值约 85–90% 的空间结构。由于这个demo模型只经历了3个epoch的训练而论文中经历了50个epoch所以出现上述结果是完全可以理解的。跨论文智能体协作既然Scanpy智能体与GHIST 智能体都是现成的所以我在琢磨能不能把两者结合起来做一个多智能体框架所以我用现有素材搭了一个多智能体的demo框架GHIST 智能体读出的 9517 细胞 × 280 基因表达矩阵交给 Scanpy 智能体做降维聚类——两个智能体没有共享任何代码只交换了一个 h5ad 文件再用 Xenium 测得的真实细胞类型5508 个共同细胞当外部考官。注意由于这个demo只训练了3个epoch所以ARI的指标并不高但混淆矩阵里还是能看出一些趋势的T 细胞占 42%大量聚进四个专属 cluster541560482363 个细胞恶性上皮细胞聚向另外三群——在没有任何类型监督的情况下纯靠从病理切片猜出来的表达值聚类免疫区与肿瘤区自己分开了。由于时间原因这里只给大家开一个头探索一下路线的可行性欢迎大家在这个基础上进一步做尝试。七、复现资料我们把整个复现包打好了 ZIP统一上传到MedX欢迎感兴趣的小伙伴订阅学生可以免费领取会员你只需要把我们整理好的压缩包丢进 ZCode / Codex / WorkBuddy 任一编程代理说一句请按 AGENTS.md 完成复现剩下的它自己搞定想体验论文智能体的话按scanpy-agent-mcp/USAGE.md把 MCP 服务器注册进你自己的 AI 客户端即可。482363 个细胞恶性上皮细胞聚向另外三群——在没有任何类型监督的情况下纯靠从病理切片猜出来的表达值聚类免疫区与肿瘤区自己分开了。由于时间原因这里只给大家开一个头探索一下路线的可行性欢迎大家在这个基础上进一步做尝试。七、复现资料我们把整个复现包打好了 ZIP统一上传到MedX欢迎感兴趣的小伙伴订阅学生可以免费领取会员你只需要把我们整理好的压缩包丢进 ZCode / Codex / WorkBuddy 任一编程代理说一句请按 AGENTS.md 完成复现剩下的它自己搞定想体验论文智能体的话按scanpy-agent-mcp/USAGE.md把 MCP 服务器注册进你自己的 AI 客户端即可。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进