跳转至

蛋白质设计与工程🔗

关键词: 蛋白质设计, RFdiffusion, ProteinMPNN, 从头设计, 反向折叠, binder design
难度: ⭐⭐⭐
预计阅读时间: 50 分钟
最后更新: 2026-04-08


本章导读🔗

蛋白质结构预测回答的是"自然界已有的蛋白质长什么样",而蛋白质设计要回答的问题更加激动人心——我们能否从零开始创造自然界不存在的蛋白质? 2024 年诺贝尔化学奖授予了 David Baker,正是因为他在"计算蛋白质设计"(computational protein design)领域的开创性贡献。

近年来,以 RFdiffusion 和 ProteinMPNN 为代表的 AI 工具让蛋白质从头设计(de novo protein design)的成功率从过去不到 1% 提升到了实验验证中的 10-30% 甚至更高,彻底改变了蛋白质工程的研究范式。

读完本章,你将能够:

  1. 理解蛋白质设计的两大范式(正向设计与反向设计)
  2. 掌握 RFdiffusion 的安装、使用和主要设计功能
  3. 掌握 ProteinMPNN 的序列设计方法
  4. 了解其他前沿设计工具(Chroma、ESM-IF、FrameFlow 等)
  5. 构建完整的"设计→预测→验证"计算工作流

前置知识: 建议先阅读 01_蛋白质结构预测_AlphaFold.md 和 02_蛋白质结构预测_进阶工具.md,了解 AlphaFold2、pLDDT、TM-score 等基本概念,因为结构预测是验证设计质量的核心手段。


1. 蛋白质设计概述🔗

1.1 什么是蛋白质设计?🔗

蛋白质设计(protein design)的核心目标是:创造出具有特定结构和/或功能的、自然界不存在的蛋白质。

这与蛋白质结构预测的方向恰好相反:

维度 结构预测(Structure Prediction) 蛋白质设计(Protein Design)
问题 给定序列,预测结构 给定目标功能/结构,设计序列
方向 序列 → 结构 结构/功能 → 序列
类比 看图纸,预测建筑外观 根据需求,设计全新蓝图
代表工具 AlphaFold2, ESMFold RFdiffusion, ProteinMPNN

蛋白质设计可以进一步细分为两大范式:

正向设计(Forward Design):序列 → 结构🔗

从一条氨基酸序列出发,预测或验证它能否折叠成目标结构。这更多是评估和筛选的手段,通常作为设计流程的验证环节。

反向设计(Inverse Design):结构 → 序列🔗

给定一个目标三维结构(骨架),设计能够折叠成该结构的氨基酸序列。这是蛋白质设计的核心问题,也被称为反向折叠(inverse folding)。ProteinMPNN 就是这一范式的代表工具。

生成式设计(Generative Design):从无到有🔗

不依赖于预定义的骨架结构,而是通过生成模型直接创造全新的蛋白质结构。这是最新也是最具革命性的范式,RFdiffusion 属于这一类别。

蛋白质设计的三大范式:

1. 反向折叠:  已知骨架 → 设计序列
                (ProteinMPNN, ESM-IF)

2. 生成式设计:约束条件 → 生成骨架 → 设计序列
                (RFdiffusion → ProteinMPNN)

3. 序列生成:  功能描述 → 直接生成序列
                (ProtGPT2, ProGen 等,目前成熟度较低)

1.2 传统方法 vs AI 方法🔗

在 AI 方法出现之前,蛋白质设计领域的统治者是 Rosetta 软件套件(同样来自 David Baker 实验室)。

特性 Rosetta(传统方法) AI 方法(RFdiffusion 等)
核心原理 基于物理的能量函数 + 蒙特卡洛采样 深度学习生成模型
设计速度 慢(单个设计需要数小时至数天) 快(单个设计数秒至数分钟)
序列空间探索 局部搜索,容易陷入局部最优 全局采样,多样性更高
从头设计成功率 较低(实验验证 < 5%) 较高(binder design 可达 10-30%)
灵活性 高度可定制,适合特定需求 功能逐步增加中,但定制性相对有限
学习门槛 高(复杂的 XML 脚本) 中等(命令行 + 配置文件)
物理约束 显式考虑(键长、键角、范德华力等) 隐式学习(从训练数据中学到)

注意: Rosetta 并未被淘汰。在许多应用中,Rosetta 的物理约束和精细控制能力仍然无法被 AI 方法完全替代。当前最佳实践往往是 AI 方法 + Rosetta 松弛(relaxation)的组合使用。

1.3 当前 AI 蛋白质设计的主要能力🔗

AI 蛋白质设计已经在以下场景展现了实用价值:

设计任务 说明 代表工具
从头结构生成 生成自然界不存在的全新蛋白质折叠 RFdiffusion, Chroma
Binder 设计 设计能够特异性结合目标蛋白的新蛋白质 RFdiffusion + ProteinMPNN
酶设计 设计具有催化功能的蛋白质 RFdiffusion(motif scaffolding)
对称寡聚体设计 设计具有对称性的蛋白质复合物(如环状、笼状) RFdiffusion
Motif scaffolding 在设计的蛋白骨架中嵌入特定功能性片段 RFdiffusion
序列设计 为给定骨架设计最优序列 ProteinMPNN, ESM-IF

1.4 2024 年诺贝尔化学奖🔗

2024 年诺贝尔化学奖的一半授予了 David Baker(华盛顿大学),表彰其在"计算蛋白质设计"领域的贡献;另一半授予了 Demis Hassabis 和 John Jumper(Google DeepMind),表彰其在"蛋白质结构预测"领域的贡献。

David Baker 的主要贡献包括:

  • Rosetta:开创性的蛋白质结构预测和设计软件(1998 年至今)
  • Top7:2003 年设计出第一个全新拓扑的人工蛋白质,实验证明可以稳定折叠
  • RFdiffusion:2023 年发表,基于扩散模型的蛋白质结构生成工具
  • ProteinMPNN:2022 年发表,革命性的序列设计工具
  • RoseTTAFold:2021 年发表,与 AlphaFold2 同期的结构预测工具

这一奖项的颁发标志着 AI 驱动的蛋白质科学 已经从前沿探索走向了学术界的最高认可。


2. RFdiffusion🔗

RFdiffusion 是当前最重要的 AI 蛋白质结构生成工具,由 David Baker 实验室于 2023 年发表在 Nature 上1。它基于扩散模型(diffusion model),能够从噪声中"去噪"生成全新的蛋白质骨架结构,支持多种设计任务。

2.1 基本原理(概念理解)🔗

RFdiffusion 的核心思想借鉴了图像生成领域的扩散模型(如 Stable Diffusion),但作用对象从图像像素变成了蛋白质三维结构中残基的坐标和朝向。

扩散过程的直觉理解🔗

  1. 正向扩散(训练时):取一个已知的蛋白质结构,逐步向其中添加噪声(随机扰动残基坐标和朝向),经过 T 步后,蛋白质结构变成了一团随机噪声
  2. 反向去噪(生成时):从一团随机噪声出发,训练一个神经网络逐步"去除"噪声,最终恢复出一个合理的蛋白质结构
训练时(正向扩散):
    真实蛋白质结构 → 加少量噪声 → 加更多噪声 → ... → 纯随机噪声
                        t=0           t=1                    t=T

生成时(反向去噪):
    纯随机噪声 → 去除一点噪声 → 去除更多噪声 → ... → 全新蛋白质结构
        t=T          t=T-1          t=T-2              t=0

关键在于:去噪网络的骨干架构使用了 RoseTTAFold(RFdiffusion 名字中的"RF"即来源于此)。RoseTTAFold 是一个蛋白质结构预测网络,它被改造为"去噪器"——给定一个带噪声的蛋白质结构,预测出去噪后的干净结构。

条件生成的关键🔗

RFdiffusion 的强大之处在于它不仅仅能生成随机结构,还能在各种约束条件下进行条件生成:

  • 指定长度:生成特定长度的蛋白质
  • 固定 motif:在生成的结构中嵌入指定的功能性片段
  • 结合目标蛋白:生成能与指定靶蛋白结合的 binder
  • 对称约束:生成具有特定对称性的寡聚体

这些条件通过在去噪过程中施加额外约束来实现,类似于图像生成中的"引导"(guidance)机制。

2.2 安装指南🔗

方式一:从 GitHub 安装(推荐)🔗

# 1. 克隆仓库
git clone https://github.com/RosettaCommons/RFdiffusion.git
cd RFdiffusion

# 2. 创建 conda 环境
conda env create -f env/SE3nv.yml
conda activate SE3nv

# 3. 安装额外依赖
pip install -e .

# 4. 下载模型权重(必须)
mkdir models && cd models
wget http://files.ipd.uw.edu/pub/RFdiffusion/6f5902ac237024bdd0c176cb93063dc4/Base_ckpt.pt
wget http://files.ipd.uw.edu/pub/RFdiffusion/e29311f6f1bf1af907f9ef9f44b8328b/Complex_base_ckpt.pt
wget http://files.ipd.uw.edu/pub/RFdiffusion/60f09a193fb5e5ccdc4980f613f7f168/Complex_Fold_base_ckpt.pt
wget http://files.ipd.uw.edu/pub/RFdiffusion/74f51cfb8b440f50d70878e05361d8f0/InpaintSeq_ckpt.pt
wget http://files.ipd.uw.edu/pub/RFdiffusion/76d00716416567174cdb7ca96e208296/InpaintSeq_Fold_ckpt.pt
wget http://files.ipd.uw.edu/pub/RFdiffusion/5532d2e1f3a4738acd7f9b7a209f3b18/ActiveSite_ckpt.pt
wget http://files.ipd.uw.edu/pub/RFdiffusion/12fc204edeae5b57713571f85a16867f/Base_epoch8_ckpt.pt
# 如果需要对称体设计,还需下载:
wget http://files.ipd.uw.edu/pub/RFdiffusion/f572d396fae9206628714fb2ce00f72e/Complex_beta_ckpt.pt

cd ..

硬件要求: RFdiffusion 需要 NVIDIA GPU(推荐 ≥16GB 显存)。生成一个 ~200 残基的蛋白质在 A100 上约需 1-2 分钟。

方式二:Docker 安装🔗

# 拉取官方 Docker 镜像
docker pull nvcr.io/nvidia/pytorch:22.12-py3

# 运行容器(挂载本地目录)
docker run --gpus all -it \
    -v /path/to/RFdiffusion:/app/RFdiffusion \
    -v /path/to/models:/app/models \
    nvcr.io/nvidia/pytorch:22.12-py3

# 在容器内完成安装
cd /app/RFdiffusion
pip install -e .

安装验证🔗

# 运行一个简单的无条件生成测试
python scripts/run_inference.py \
    inference.output_prefix=test_outputs/test \
    inference.model_directory_path=models/ \
    'contigmap.contigs=[150-150]' \
    inference.num_designs=1

# 如果成功,应该在 test_outputs/ 下看到生成的 PDB 文件
ls test_outputs/
# test_0.pdb  test_0.trb

2.3 主要功能与使用示例🔗

RFdiffusion 使用 Hydra 配置系统来管理参数。所有参数通过命令行以 key=value 形式传入。下面逐一介绍各主要功能。

功能一:无条件结构生成(Unconditional Generation)🔗

用途: 从随机噪声中生成全新的蛋白质结构,不施加任何约束条件。适用于探索新折叠或作为设计的起点。

# 生成 10 个长度为 100-150 残基的新蛋白质
python scripts/run_inference.py \
    inference.output_prefix=outputs/unconditional/design \
    inference.model_directory_path=models/ \
    'contigmap.contigs=[100-150]' \
    inference.num_designs=10

参数说明:

参数 含义
inference.output_prefix 输出文件路径前缀
inference.model_directory_path 模型权重所在目录
contigmap.contigs 描述要生成的蛋白质拓扑,[100-150] 表示生成 100-150 残基长的单链
inference.num_designs 生成设计的数量

输出文件:

  • design_0.pdb ~ design_9.pdb:生成的骨架结构(仅含 CA 原子或骨架原子)
  • design_0.trb ~ design_9.trb:包含去噪轨迹等元数据的文件

提示: 无条件生成的蛋白质通常以 α-螺旋束(helical bundle)为主,因为这是训练数据中最常见的折叠类型。如果需要特定拓扑(如 β-barrel),需要使用更高级的条件生成功能。

功能二:Motif Scaffolding🔗

用途: 将一个已知的功能性结构片段(motif)嵌入到一个新设计的蛋白质骨架(scaffold)中。这是酶设计、疫苗设计等应用的核心功能。

典型应用场景:

  • 你有一个酶的活性位点残基(几个关键的催化残基),想设计一个新蛋白把这些残基以正确的空间排列呈现出来
  • 你有一个抗原的表位片段(epitope),想设计一个蛋白把它稳定地展示出来
# 示例:将 PDB 5TPN 的 A 链第 10-25 号残基作为 motif,
# 设计一个 ~100 残基的 scaffold 来呈现它
python scripts/run_inference.py \
    inference.output_prefix=outputs/scaffolding/design \
    inference.model_directory_path=models/ \
    inference.input_pdb=inputs/5TPN.pdb \
    'contigmap.contigs=[10-40/A10-25/10-40]' \
    inference.num_designs=10

Contig 语法详解:

contigmap.contigs 是 RFdiffusion 最核心的输入语法,用于描述生成蛋白质的拓扑结构:

语法 含义 示例
[100-150] 生成一条 100-150 残基的新链 无条件生成
[A10-25] 保留输入 PDB 的 A 链第 10-25 号残基 固定的 motif
[10-40/A10-25/10-40] 新段(10-40 残基) + motif(A10-25) + 新段(10-40 残基) motif scaffolding
[A10-25/0 B1-50] A 链 motif + 不连接(/0)+ B 链的一段 多链 motif

关键理解: / 表示连续连接(peptide bond),/0 表示链间断开(不同链)。方括号内描述的是一条链的拓扑。

更复杂的 motif scaffolding 示例:

# 不连续 motif:将两段分离的 motif 同时嵌入 scaffold
# A 链的第 5-15 和第 30-40 号残基都是 motif
python scripts/run_inference.py \
    inference.output_prefix=outputs/discontinuous/design \
    inference.model_directory_path=models/ \
    inference.input_pdb=inputs/target.pdb \
    'contigmap.contigs=[10-30/A5-15/10-20/A30-40/10-30]' \
    inference.num_designs=20

功能三:Binder Design(最高频使用场景)🔗

用途: 给定一个靶蛋白(target),设计一个能与其特异性结合的新蛋白(binder)。这是药物开发、诊断试剂等应用最关注的功能。

# 设计与靶蛋白(PDB 中的 A 链)结合的 binder
# binder 长度为 70-100 残基
python scripts/run_inference.py \
    inference.output_prefix=outputs/binder/design \
    inference.model_directory_path=models/ \
    inference.input_pdb=inputs/target_protein.pdb \
    'contigmap.contigs=[A1-150/0 70-100]' \
    'ppi.hotspot_res=[A30,A33,A34,A37,A38]' \
    inference.num_designs=100

参数说明:

参数 含义
contigmap.contigs=[A1-150/0 70-100] 保留靶蛋白 A 链 1-150 号残基(不动),/0 表示新链断开,70-100 是新设计的 binder 长度
ppi.hotspot_res=[A30,A33,A34,A37,A38] binder 应与靶蛋白的这些"热点残基"(hotspot residues)接触。这是引导 binder 结合位置的关键参数

实用提示: - Hotspot 残基的选择至关重要。 通常选择靶蛋白表面暴露的、已知功能性界面的残基。可以通过查阅文献、分析已知复合物结构,或用 PyMOL 手动选取表面暴露残基来确定。 - 生成数量要多。 Binder design 的成功率通常在 1-10% 左右(即使用 AF2 验证后),建议生成 100-1000 个设计,然后用结构预测筛选。 - 如果靶蛋白较大,可以只保留结合位点附近的残基以节省计算资源。

指定 binder 的结合面:

# 如果你想让 binder 从靶蛋白的特定一侧接近
# 可以提供一个"种子"binder 的大致位置
python scripts/run_inference.py \
    inference.output_prefix=outputs/binder_guided/design \
    inference.model_directory_path=models/ \
    inference.input_pdb=inputs/target_with_seed.pdb \
    'contigmap.contigs=[A1-150/0 70-100]' \
    'ppi.hotspot_res=[A30,A33,A34]' \
    denoiser.noise_scale_ca=0 \
    denoiser.noise_scale_frame=0 \
    inference.num_designs=50

功能四:对称寡聚体设计(Symmetric Oligomer Design)🔗

用途: 设计具有特定对称性的蛋白质复合物,如同源二聚体(C2)、三聚体(C3)、四面体(T)等。这在纳米材料、药物递送系统设计中有重要应用。

# 设计一个 C3 对称的三聚体,每个亚基 80-100 残基
python scripts/run_inference.py \
    inference.output_prefix=outputs/symmetric/C3_design \
    inference.model_directory_path=models/ \
    'contigmap.contigs=[80-100]' \
    inference.symmetry=C3 \
    inference.num_designs=10
# 设计一个 C6 对称的六聚体
python scripts/run_inference.py \
    inference.output_prefix=outputs/symmetric/C6_design \
    inference.model_directory_path=models/ \
    'contigmap.contigs=[60-80]' \
    inference.symmetry=C6 \
    inference.num_designs=10

支持的对称类型:

对称类型 说明 示例
C2 - C12 环状对称(cyclic) 二聚体到十二聚体
D2 - D12 二面体对称(dihedral) 更高阶对称组
T 四面体对称(tetrahedral) 12 个亚基
O 八面体对称(octahedral) 24 个亚基
I 二十面体对称(icosahedral) 60 个亚基

2.4 进阶参数与调优技巧🔗

去噪步数(Diffusion Steps)🔗

# 默认 50 步去噪,增加步数可能提高质量但更慢
inference.diffusion.T=50        # 默认值
inference.diffusion.T=100       # 更多步数,可能更高质量
inference.diffusion.T=25        # 更少步数,速度更快但质量可能下降

噪声尺度调控🔗

# 控制生成的多样性
# 值越大,生成越多样但可能质量下降;值越小,生成越保守
denoiser.noise_scale_ca=1.0     # CA 原子位移噪声(默认 1.0)
denoiser.noise_scale_frame=1.0  # 残基朝向噪声(默认 1.0)

常见问题排查🔗

问题 可能原因 解决方案
CUDA out of memory 蛋白质太长或显存不足 缩短设计长度、使用更大显存 GPU、减小靶蛋白区域
生成的结构全是螺旋束 无条件生成的常见现象 使用 motif scaffolding 或 binder design 来约束拓扑
Binder 远离靶蛋白 hotspot 残基选择不当 检查 hotspot 是否为表面暴露残基,增加 hotspot 数量
安装时 SE(3)-Transformer 报错 已知兼容性问题 按 GitHub Issues 中的解决方案操作,或使用 Docker
生成结构有严重碰撞 正常现象 用 Rosetta relax 或 OpenMM 进行能量优化后再评估

3. ProteinMPNN🔗

3.1 核心思想:给骨架穿上"氨基酸外衣"🔗

ProteinMPNN(Message Passing Neural Network for Protein design)由 David Baker 实验室于 2022 年发表在 Science 上2,是当前最广泛使用的反向折叠(inverse folding)工具。

它解决的核心问题是:给定一个蛋白质的骨架结构(backbone),设计一条氨基酸序列使其能够折叠回该结构。

这一步是蛋白质设计流程中不可或缺的环节——RFdiffusion 生成的是骨架结构(只有 N、CA、C、O 原子坐标),要将其变成可以实际表达的蛋白质,必须为每个位置分配一个氨基酸残基。这正是 ProteinMPNN 的工作。

原理简述🔗

ProteinMPNN 将蛋白质骨架建模为一个图(graph):

  • 节点(node):每个残基位置
  • 边(edge):空间上相邻的残基对(基于 CA-CA 距离,通常取最近的 k 个邻居)

然后使用消息传递神经网络(Message Passing Neural Network, MPNN)在图上进行信息传播,最终通过自回归解码器(autoregressive decoder)逐位置生成氨基酸类型。

输入:蛋白质骨架坐标(N, CA, C, O 原子)
    ↓
[构建 k 近邻图] → 残基图(节点 = 残基, 边 = 空间邻居)
    ↓
[MPNN 编码器 × 3 层] → 每个残基获得结构上下文表示
    ↓
[自回归解码器] → 逐位置输出 20 种氨基酸的概率分布
    ↓
输出:设计序列(可采样多条不同序列)

为什么 ProteinMPNN 如此重要?🔗

在 ProteinMPNN 之前,序列设计主要依赖 Rosetta 的 fixbb(fixed backbone)设计协议,序列恢复率(sequence recovery)约为 30-33%。ProteinMPNN 将这一指标提升到了 ~52%(即对自然蛋白质,有超过一半的位置预测出了正确的氨基酸),实验验证的成功率也有了大幅提升。

指标 Rosetta fixbb ProteinMPNN
序列恢复率(sequence recovery) ~30-33% ~52%
实验成功率(设计→可溶表达) 低 高(多项研究报告 >60%)
计算速度 慢(分钟级/结构) 快(秒级/结构)
多状态设计支持 有限 原生支持

3.2 安装🔗

# 克隆仓库
git clone https://github.com/dauparas/ProteinMPNN.git
cd ProteinMPNN

# ProteinMPNN 依赖较少,使用 conda 或 pip 安装即可
conda create -n proteinmpnn python=3.9
conda activate proteinmpnn
pip install numpy torch

# 模型权重已包含在仓库中(vanilla_model_weights/ 目录下)
ls vanilla_model_weights/
# v_48_002.pt  v_48_010.pt  v_48_020.pt  v_48_030.pt

3.3 基本使用🔗

方式一:命令行使用🔗

# 第一步:解析 PDB 文件,生成 ProteinMPNN 需要的 JSON 输入
python helper_scripts/parse_multiple_chains.py \
    --input_path=inputs/ \
    --output_path=parsed_chains.jsonl

# 第二步:运行序列设计
python protein_mpnn_run.py \
    --jsonl_path parsed_chains.jsonl \
    --out_folder outputs/ \
    --num_seq_per_target 8 \
    --sampling_temp "0.1" \
    --batch_size 1

关键参数说明:

参数 含义 推荐值
--num_seq_per_target 每个骨架生成几条候选序列 8-64
--sampling_temp 采样温度。越低越保守(高置信位点偏多),越高越多样 0.1(保守)- 0.3(多样)
--batch_size 批大小 1(显存有限时)或更大
--backbone_noise 向骨架添加随机噪声(Å),增加序列多样性 0.02-0.10

方式二:Python 脚本使用(更灵活)🔗

import json
import torch
import numpy as np
from protein_mpnn_utils import (
    parse_PDB, 
    StructureDatasetPDB, 
    tied_featurize
)

# 加载模型
checkpoint = torch.load(
    "vanilla_model_weights/v_48_020.pt", 
    map_location="cuda"
)
model = protein_mpnn_model(checkpoint)
model.eval().cuda()

# 解析输入 PDB
pdb_dict = parse_PDB("inputs/scaffold.pdb")

# 运行序列设计
with torch.no_grad():
    sample = model.sample(
        pdb_dict,
        temperature=0.1,
        num_samples=8
    )

# 输出设计序列
for i, seq in enumerate(sample["sequences"]):
    print(f"Design {i}: {seq}")

高级功能:固定部分残基🔗

在很多场景下,你不希望修改某些残基(例如 motif scaffolding 中的功能性残基):

# 创建固定位置文件
# 假设要固定 A 链的第 10, 11, 12, 20, 21 号残基
python helper_scripts/make_fixed_positions_dict.py \
    --input_path=inputs/ \
    --output_path=fixed_positions.jsonl \
    --chain_list "A" \
    --position_list "10 11 12 20 21"

# 运行设计(加上固定位置约束)
python protein_mpnn_run.py \
    --jsonl_path parsed_chains.jsonl \
    --out_folder outputs/ \
    --num_seq_per_target 8 \
    --sampling_temp "0.1" \
    --fixed_positions_jsonl fixed_positions.jsonl

高级功能:多链设计🔗

对于蛋白质复合物(如 binder + target),通常只需要设计 binder 的序列,而保持 target 的序列不变:

# 指定只设计 B 链(binder),A 链(target)保持不变
python helper_scripts/make_fixed_positions_dict.py \
    --input_path=inputs/ \
    --output_path=fixed_positions.jsonl \
    --chain_list "A" \
    --position_list ""  # 空字符串表示固定 A 链所有位置

# 或者使用 --designed_chain_list 参数
python protein_mpnn_run.py \
    --jsonl_path parsed_chains.jsonl \
    --out_folder outputs/ \
    --num_seq_per_target 16 \
    --sampling_temp "0.1" \
    --chain_id_jsonl chain_ids.jsonl

3.4 RFdiffusion + ProteinMPNN 联合工作流🔗

这是当前蛋白质从头设计最标准的工作流:

                    RFdiffusion + ProteinMPNN 联合工作流
                    ====================================

步骤 1:RFdiffusion 生成骨架
    输入:设计约束(长度、对称性、靶蛋白等)
    输出:N 个骨架结构(.pdb 文件,仅含骨架原子)
        ↓
步骤 2:ProteinMPNN 设计序列
    输入:每个骨架结构
    输出:每个骨架 M 条候选序列
        ↓
步骤 3:AlphaFold2 / ESMFold 结构预测验证
    输入:设计的序列
    输出:预测结构 + 置信度分数
        ↓
步骤 4:筛选
    标准:scTM > 0.5, pLDDT > 70, etc.
        ↓
步骤 5:候选设计 → 实验验证

完整命令行示例(Binder Design Pipeline):

# ========== Step 1: RFdiffusion 生成 binder 骨架 ==========
python RFdiffusion/scripts/run_inference.py \
    inference.output_prefix=pipeline/step1_backbones/design \
    inference.model_directory_path=RFdiffusion/models/ \
    inference.input_pdb=inputs/target.pdb \
    'contigmap.contigs=[A1-100/0 70-100]' \
    'ppi.hotspot_res=[A25,A28,A32,A35]' \
    inference.num_designs=100

# ========== Step 2: ProteinMPNN 为每个骨架设计序列 ==========
# 2a. 解析骨架 PDB 文件
python ProteinMPNN/helper_scripts/parse_multiple_chains.py \
    --input_path=pipeline/step1_backbones/ \
    --output_path=pipeline/step2_parsed.jsonl

# 2b. 固定 target 链,只设计 binder 链
python ProteinMPNN/helper_scripts/assign_fixed_chains.py \
    --input_path=pipeline/step2_parsed.jsonl \
    --output_path=pipeline/step2_fixed_chains.jsonl \
    --chain_list "A"  # A 链是 target,固定不动

# 2c. 运行序列设计
python ProteinMPNN/protein_mpnn_run.py \
    --jsonl_path pipeline/step2_parsed.jsonl \
    --chain_id_jsonl pipeline/step2_fixed_chains.jsonl \
    --out_folder pipeline/step2_sequences/ \
    --num_seq_per_target 8 \
    --sampling_temp "0.1" \
    --batch_size 1

# ========== Step 3: 用 AlphaFold2/ColabFold 预测设计序列的结构 ==========
# (参见第 5 节的验证工作流)

提示: 在实际项目中,通常会生成 100-1000 个骨架,每个骨架设计 8-16 条序列,最终产生 几百到上万个候选设计。后续需要通过结构预测批量筛选。


4. 其他设计工具🔗

除了 RFdiffusion 和 ProteinMPNN 这两个"核心组合"之外,近年来涌现了一批重要的蛋白质设计工具,各有特色。

4.1 ESM-IF(Inverse Folding by ESM)🔗

ESM-IF 是 Meta AI(ESM 团队)开发的反向折叠模型,与 ProteinMPNN 解决相同的问题(骨架 → 序列),但架构不同。

核心特点:

  • 基于 GVP(Geometric Vector Perceptron)+ Transformer 架构
  • 在 CATH(蛋白质结构分类数据库)上训练
  • 除了序列设计外,还可以用于评估序列-结构兼容性(作为评分函数)

安装与使用:

# ESM-IF 包含在 ESM 包中
pip install fair-esm
import esm
import torch

# 加载模型
model, alphabet = esm.pretrained.esm_if1_gvp4_t16_142M_UR50()
model = model.eval()

# 从 PDB 文件采样序列
from esm.inverse_folding.util import load_structure, extract_coords_from_structure

# 加载骨架结构
structure = load_structure("scaffold.pdb", chain="A")
coords, native_seq = extract_coords_from_structure(structure)

# 采样新序列
sampled_seqs = model.sample(
    coords, 
    temperature=0.1, 
    num_samples=8
)

for i, seq in enumerate(sampled_seqs):
    print(f"Design {i}: {seq}")

与 ProteinMPNN 的对比:

特性 ProteinMPNN ESM-IF
序列恢复率 ~52% ~51%
速度 快 稍慢
多链支持 好 有限
评分功能 有(log-likelihood) 有(log-likelihood)
社区活跃度 非常高 中等

实用建议: 在序列设计环节,ProteinMPNN 是首选。但用两种工具同时设计、然后取并集进行筛选,可以增加序列多样性。

4.2 Chroma(Generate Bio)🔗

Chroma 是 Generate Biomedicines 公司于 2023 年发布的蛋白质生成模型3,与 RFdiffusion 同属扩散模型范畴,但架构和功能有所不同。

核心特点:

  • 同样基于扩散模型生成蛋白质结构
  • 内置序列设计:Chroma 可以同时生成结构和序列,不需要额外的 ProteinMPNN 步骤
  • 支持丰富的条件生成模式(通过 Conditioner API),包括对称性、子结构约束、基于自然语言的蛋白质描述等
  • 开源(MIT 许可证)

安装与使用:

pip install generate-chroma
import chroma
from chroma import Chroma, Protein, conditioners

# 初始化模型
model = Chroma()

# 无条件生成
protein = model.sample(chain_lengths=[200])
protein.to("output.pdb")

# 条件生成:指定对称性 C3
protein = model.sample(
    chain_lengths=[100],
    conditioner=conditioners.SymmetryConditioner("C3")
)

# 条件生成:基于自然语言描述(实验性功能)
protein = model.sample(
    chain_lengths=[150],
    conditioner=conditioners.ProCapConditioner(
        "A TIM barrel enzyme"
    )
)

注意: Chroma 的自然语言条件生成功能尚不成熟,生成质量不稳定,目前更多用于探索和演示。

4.3 FrameFlow 与 FoldFlow(Flow Matching 模型)🔗

FrameFlow(Yim et al., 2023)和 FoldFlow(Bose et al., 2023)是基于流匹配(flow matching)方法的蛋白质生成模型。与扩散模型的逐步去噪过程不同,流匹配直接学习从噪声分布到目标分布的连续映射,理论上具有更高的采样效率。

核心区别:

特性 RFdiffusion(扩散模型) FrameFlow/FoldFlow(流匹配)
生成过程 多步迭代去噪 连续流变换(更少步数)
数学框架 Score-based diffusion Flow matching on SE(3)
采样速度 中等(~50 步) 较快(通常 ~10-20 步)
成熟度 高(广泛验证) 较新(社区验证中)
功能完整性 完整(binder, scaffold, symmetry) 基础功能(主要是无条件生成)

FrameFlow 安装与使用:

# 克隆仓库
git clone https://github.com/microsoft/frame-flow.git
cd frame-flow

# 安装依赖
conda env create -f environment.yml
conda activate frameflow

# 运行生成
python generate.py --num_samples 10 --length 100

现状评估: 截至 2026 年,流匹配模型在蛋白质设计中仍处于发展阶段,功能不如 RFdiffusion 完善。如果你的目标是完成实际的设计任务(如 binder design),仍然推荐使用 RFdiffusion。流匹配模型更适合方法学研究和对比实验。

4.4 Genie2🔗

Genie2(Lin & AlQuraishi, 2024)是哥伦比亚大学 AlQuraishi 实验室开发的蛋白质结构生成模型,同样基于扩散框架,但在"可设计性"(designability)指标上超过了 RFdiffusion。

核心特点:

  • 在 designability(设计的序列能否折叠回目标结构)方面表现出色
  • 生成的结构多样性更高(更少的螺旋束偏好)
  • 支持长蛋白质生成(已测试 >800 残基)
# 克隆并安装
git clone https://github.com/aqlaboratory/genie2.git
cd genie2
pip install -e .

# 下载模型权重
bash download_weights.sh

# 生成蛋白质结构
python generate.py \
    --num_samples 10 \
    --length 150 \
    --output_dir outputs/

对比评价: Genie2 在无条件生成的多样性和可设计性方面有优势,但目前缺少 motif scaffolding 和 binder design 等条件生成功能,实际应用场景有限。

4.5 工具选择建议🔗

你的需求 推荐工具 原因
Binder 设计 RFdiffusion + ProteinMPNN 最成熟、最多验证
Motif scaffolding(酶设计等) RFdiffusion + ProteinMPNN 功能完善,业界标准
对称寡聚体设计 RFdiffusion 原生支持多种对称类型
序列设计(已有骨架) ProteinMPNN 速度快、恢复率高
一步式结构+序列设计 Chroma 无需两步流程
探索新折叠(多样性优先) Genie2 结构多样性高
方法学研究/对比 FrameFlow, FoldFlow 新方法探索

5. 设计-预测-验证工作流🔗

蛋白质设计不止于"生成一个结构"——真正的设计流程是一个多阶段筛选漏斗。本节介绍完整的计算验证工作流,帮助你从数千个候选设计中筛选出最有可能在实验中成功的设计。

5.1 完整计算工作流🔗

    ┌──────────────────────────────────────────────┐
    │          Step 1: 骨架生成 (RFdiffusion)       │
    │     生成 100-1000 个候选骨架                    │
    └──────────────────┬───────────────────────────┘
                       ↓
    ┌──────────────────────────────────────────────┐
    │       Step 2: 序列设计 (ProteinMPNN)          │
    │     每个骨架生成 8-16 条候选序列                 │
    │     总计 ~1000-10000 个候选序列                 │
    └──────────────────┬───────────────────────────┘
                       ↓
    ┌──────────────────────────────────────────────┐
    │    Step 3: 结构预测验证 (AF2/ESMFold)          │
    │     对每条设计序列进行结构预测                    │
    └──────────────────┬───────────────────────────┘
                       ↓
    ┌──────────────────────────────────────────────┐
    │        Step 4: 计算指标筛选                    │
    │     scTM > 0.5, pLDDT > 70 等                 │
    │     筛选出 Top 10-100 个候选                    │
    └──────────────────┬───────────────────────────┘
                       ↓
    ┌──────────────────────────────────────────────┐
    │         Step 5: 实验验证                       │
    │     基因合成 → 蛋白表达 → 纯化 → 功能测试        │
    └──────────────────────────────────────────────┘

5.2 用 AlphaFold2 验证设计🔗

设计完成后,最重要的验证步骤是:将设计序列输入 AlphaFold2(或 ColabFold),看它预测出的结构是否与设计骨架吻合。 如果吻合,说明设计的序列大概率能在实验中折叠成期望的结构。

验证的核心逻辑:

  1. RFdiffusion 生成骨架 B
  2. ProteinMPNN 为骨架 B 设计序列 S
  3. 将序列 S 输入 AF2,得到预测结构 P
  4. 比较 P 与 B 是否相似 → 若相似,则设计可能成功

使用 ColabFold 批量验证:

# 安装本地版 ColabFold(用于批量预测)
pip install colabfold[alphafold]

# 批量预测设计序列(FASTA 格式)
colabfold_batch \
    design_sequences.fasta \
    af2_predictions/ \
    --num-recycle 3 \
    --num-models 1 \
    --amber

使用 ESMFold 快速预筛选:

对于数千个设计,先用 ESMFold 快速筛选(秒级/序列),再对 Top 候选用 AF2 精确验证:

import torch
import esm

# 加载 ESMFold
model = esm.pretrained.esmfold_v1()
model = model.eval().cuda()
model.set_chunk_size(128)

# 批量快速预测
sequences = {
    "design_001": "MKTVRQERL...",
    "design_002": "MGSIFEKNL...",
    # ... 更多设计序列
}

for name, seq in sequences.items():
    with torch.no_grad():
        pdb_str = model.infer_pdb(seq)
    with open(f"esmfold_predictions/{name}.pdb", "w") as f:
        f.write(pdb_str)

5.3 核心评估指标🔗

scTM(self-consistency TM-score)🔗

scTM 是衡量设计质量的最重要指标。它的含义是:设计序列的 AF2 预测结构与原始设计骨架之间的 TM-score。

scTM = TM-score(AF2预测结构, 原始设计骨架)
scTM 值 含义
> 0.5 设计结构与预测结构整体折叠一致(最低通过标准)
> 0.7 高质量设计,推荐实验验证
> 0.9 非常高质量,预测与设计高度一致
< 0.5 设计序列可能无法折叠成目标结构,建议丢弃

计算 scTM 的方法:

# 使用 TMscore 程序计算
# 下载地址:https://zhanggroup.org/TM-score/
TMscore af2_prediction.pdb design_backbone.pdb
# 或使用 Python 工具(tmtools 包)
pip install tmtools

from tmtools import tm_align

# 读取结构坐标计算 TM-score
result = tm_align(
    coords_predicted,   # AF2 预测结构的 CA 坐标
    coords_designed,    # 设计骨架的 CA 坐标
    seq_predicted,
    seq_designed
)
print(f"scTM: {result.tm_norm_chain1:.3f}")

pLDDT of Designed Sequence🔗

将设计序列输入 AF2 后得到的 pLDDT 值反映了模型对设计蛋白折叠的"自信程度"。

平均 pLDDT 含义
> 80 AF2 认为设计序列能稳定折叠,高置信度
60-80 部分区域可能不确定
< 60 AF2 对该设计的折叠不自信,设计可能有问题

注意: 高 pLDDT 不等于设计一定成功,低 pLDDT 也不等于一定失败。但 pLDDT 是一个很好的统计指标。

Sequence Recovery(序列恢复率)🔗

对于反向折叠任务(已有天然蛋白的骨架),衡量设计序列与天然序列的一致程度。

def sequence_recovery(designed_seq, native_seq):
    """计算序列恢复率"""
    assert len(designed_seq) == len(native_seq)
    match = sum(a == b for a, b in zip(designed_seq, native_seq))
    return match / len(designed_seq)

# 示例
recovery = sequence_recovery(
    "MKTVRQERLKSIV",
    "MKTVRQEHLKSLV"
)
print(f"Sequence recovery: {recovery:.2%}")  # 76.92%

注意: 序列恢复率主要用于评估反向折叠工具本身的性能。在从头设计中,设计序列不应该追求与某个天然蛋白序列相似——因为你是在创造一个全新的蛋白。

Binder 设计的额外指标🔗

对于 binder design,还需要评估结合界面的质量:

指标 含义 推荐阈值
ipTM(AF2 multimer) 界面预测质量 > 0.7
pAE(界面区域) binder-target 间的对齐误差 < 10 Å
界面接触数 binder 与 target 之间的原子接触数量 按需评估
ΔG_binding(Rosetta) 结合自由能估计 < -10 REU

5.4 批量筛选脚本示例🔗

以下是一个将上述评估整合在一起的筛选脚本框架:

import os
import json
import numpy as np
from pathlib import Path

def evaluate_designs(
    design_dir,           # RFdiffusion 输出的骨架目录
    af2_prediction_dir,   # AF2 对设计序列的预测结果目录
    output_csv="design_evaluation.csv"
):
    """批量评估设计质量,输出汇总 CSV"""

    results = []

    for design_pdb in Path(design_dir).glob("*.pdb"):
        name = design_pdb.stem
        pred_pdb = Path(af2_prediction_dir) / f"{name}.pdb"

        if not pred_pdb.exists():
            continue

        # 1. 计算 scTM
        sctm = compute_tm_score(str(pred_pdb), str(design_pdb))

        # 2. 解析 AF2 的 pLDDT(存储在 B-factor 列)
        avg_plddt = parse_plddt_from_pdb(str(pred_pdb))

        results.append({
            "design_name": name,
            "scTM": round(sctm, 3),
            "avg_pLDDT": round(avg_plddt, 1),
            "pass_scTM": sctm > 0.5,
            "pass_pLDDT": avg_plddt > 70,
            "recommended": sctm > 0.7 and avg_plddt > 80,
        })

    # 排序并输出
    results.sort(key=lambda x: x["scTM"], reverse=True)

    # 保存为 CSV
    import csv
    with open(output_csv, 'w', newline='') as f:
        writer = csv.DictWriter(f, fieldnames=results[0].keys())
        writer.writeheader()
        writer.writerows(results)

    # 统计
    total = len(results)
    passed = sum(1 for r in results if r["recommended"])
    print(f"总设计数: {total}")
    print(f"推荐实验验证: {passed} ({passed/total*100:.1f}%)")

    return results

5.5 从计算到湿实验🔗

计算筛选完成后,以下是将设计推向实验验证的典型路径:

步骤 内容 说明
1. 密码子优化 将氨基酸序列转换为 DNA 序列 使用 IDT Codon Optimization Tool 或类似工具,针对表达宿主(如大肠杆菌)优化
2. 基因合成 通过商业公司合成 DNA 如 Twist Bioscience、GenScript、IDT 等
3. 克隆与转化 将合成基因插入表达载体 常用 pET 系列载体 + BL21(DE3) 表达菌
4. 蛋白表达 诱导表达目标蛋白 IPTG 诱导,37°C 或 18°C 过夜
5. 初步表征 SDS-PAGE、尺寸排阻色谱(SEC) 确认蛋白可溶表达且为单分散状态
6. 功能验证 视设计目标而定 Binder:SPR/BLI 测结合亲和力;酶:活性测定等
7. 结构验证 X-ray 或 Cryo-EM 验证实际结构 与设计结构对比

经验提示: - 计算设计到实验验证之间的"折损率"仍然很高。即使 scTM > 0.7 且 pLDDT > 80 的设计,实验成功率通常也在 10-50% 范围内(视任务难度而定)。 - 建议第一轮实验选择 8-24 个计算排名靠前的设计进行筛选。 - 蛋白是否能可溶表达本身就是一个重要筛选。很多设计虽然预测结构正确,但在大肠杆菌中会形成包涵体。


实操演示:从零设计一个小蛋白🔗

以下是一个完整的实操示例,从无条件生成一个 ~100 残基的新蛋白到验证其可设计性。

# ========== 环境准备 ==========
conda activate SE3nv  # RFdiffusion 环境
cd /path/to/your/workspace

# ========== Step 1: 生成 20 个候选骨架 ==========
python RFdiffusion/scripts/run_inference.py \
    inference.output_prefix=demo/backbones/design \
    inference.model_directory_path=RFdiffusion/models/ \
    'contigmap.contigs=[100-100]' \
    inference.num_designs=20

echo "✓ Step 1 完成:生成了 20 个骨架"
ls demo/backbones/

# ========== Step 2: ProteinMPNN 序列设计 ==========
conda activate proteinmpnn

# 解析骨架
python ProteinMPNN/helper_scripts/parse_multiple_chains.py \
    --input_path=demo/backbones/ \
    --output_path=demo/parsed.jsonl

# 设计序列(每个骨架 8 条序列)
python ProteinMPNN/protein_mpnn_run.py \
    --jsonl_path demo/parsed.jsonl \
    --out_folder demo/sequences/ \
    --num_seq_per_target 8 \
    --sampling_temp "0.1"

echo "✓ Step 2 完成:共设计了 $(cat demo/sequences/seqs/*.fa | grep -c '>') 条序列"

# ========== Step 3: ESMFold 快速预测 ==========
# (使用前面章节介绍的 ESMFold 批量预测脚本)
python predict_with_esmfold.py \
    --input_fasta demo/sequences/seqs/*.fa \
    --output_dir demo/predictions/

echo "✓ Step 3 完成:结构预测已完成"

# ========== Step 4: 计算 scTM 和筛选 ==========
python evaluate_designs.py \
    --design_dir demo/backbones/ \
    --prediction_dir demo/predictions/ \
    --output demo/evaluation.csv

echo "✓ Step 4 完成:筛选结果见 demo/evaluation.csv"

⚠️ 注意: 以上脚本中的 predict_with_esmfold.py 和 evaluate_designs.py 需要根据实际情况编写,上面第 5 节中提供了核心代码框架。


本章小结🔗

  • ✅ 蛋白质设计的核心范式是生成式设计(RFdiffusion)+ 反向折叠(ProteinMPNN)的组合
  • ✅ RFdiffusion 是当前最重要的结构生成工具,支持无条件生成、motif scaffolding、binder design、对称体设计等功能
  • ✅ ProteinMPNN 是标准的序列设计工具,为 RFdiffusion 生成的骨架设计可实际表达的氨基酸序列
  • ✅ 设计质量评估的核心指标是 scTM(设计骨架与 AF2 预测结构的 TM-score)和 pLDDT
  • ✅ 完整的设计流程是:生成骨架 → 设计序列 → 预测验证 → 筛选 → 实验验证
  • ✅ binder design 建议生成 100+ 骨架并充分筛选,实验选取 Top 8-24 个候选

延伸阅读🔗


参考文献🔗


  1. Watson, J.L., Juergens, D., Bennett, N.R. et al. "De novo design of protein structure and function with RFdiffusion." Nature, 620, 1089–1100 (2023). https://doi.org/10.1038/s41586-023-06415-8 ↩

  2. Dauparas, J., Anishchenko, I., Bennett, N. et al. "Robust deep learning–based protein sequence design using ProteinMPNN." Science, 378, 49-56 (2022). https://doi.org/10.1126/science.add2187 ↩

  3. Ingraham, J.B., Barber, M., Barber, G. et al. "Illuminating protein space with a programmable generative model." Nature, 623, 1070–1078 (2023). https://doi.org/10.1038/s41586-023-06728-8 ↩

  4. Lin, Y. & AlQuraishi, M. "Generating Novel, Designable, and Diverse Protein Structures by Equivariantly Diffusing Oriented Residue Clouds." ICML (2023). ↩

  5. Yim, J., Trippe, B.L., De Bortoli, V. et al. "SE(3) diffusion model with application to protein backbone generation." ICML (2023). ↩