
1. 为什么“从头抗体设计”值得单独开一课抗体药物的研发长期依赖动物免疫和噬菌体展示这两条路径前者周期动辄数月后者虽然快一些但库容量和筛选通量始终是瓶颈。更关键的是这两条路都建立在“自然界已经存在的抗体序列”这个前提上——你只能从已有的序列空间里挑没法凭空造出一个针对特定表位、特定构象、特定亲和力需求的抗体。RFdiffusion 加 ProteinMPNN 这套组合拳第一次让“从零开始设计一个抗体”变得在算力可及的范围内可操作。RFdiffusion 负责生成全新的蛋白骨架ProteinMPNN 负责给骨架配上合理的氨基酸序列两者串起来就能得到一个自然界从未出现过的抗体候选。这不是小修小补而是把抗体设计的起点从“筛选”变成了“生成”。我最初接触这套流程的时候以为只要把两个模型跑通就完事了。实际动手才发现抗体这个体系有它的特殊性——它不是一个普通的球状蛋白而是由重链和轻链两条链通过二硫键和非共价相互作用组装起来的异源二聚体还有六个 CDR 环区需要精确定位。这些约束条件直接决定了你在 RFdiffusion 里怎么设参数、在 ProteinMPNN 里怎么设权重。这篇文章面向的是已经跑通过 RFdiffusion 基础流程、想把它用到抗体场景的读者。如果你还没装过 RFdiffusion建议先把官方仓库的 demo 跑一遍再回来。下面我会从抗体骨架的特殊性讲起把参数设置、序列设计、结构验证这几个环节拆开说重点放在那些官方文档里不会写、但实际跑的时候一定会遇到的问题上。2. 抗体骨架和普通蛋白骨架的本质差异2.1 异源二聚体的链间界面约束普通蛋白设计里你面对的大多数是单链蛋白RFdiffusion 生成一条链就完事了。抗体不一样重链和轻链之间的界面是一个高度优化的疏水-极性互补区域CH1 和 CL 结构域之间的接触面积大约在 600 到 800 平方埃之间涉及几十个残基的侧链堆积。如果你在 RFdiffusion 里把重链和轻链当成两条独立的链来生成模型不会自动知道它们需要形成一个稳定的异源二聚体。结果就是两条链各自折叠得挺好但放到一起发现界面根本对不上。我试过直接跑默认参数出来的结构用 PyMOL 一看两条链的界面残基全是带电的互相排斥根本不可能稳定存在。正确的做法是在 RFdiffusion 的输入配置里显式定义链间接触约束。具体来说你需要在 contig 里把重链和轻链的界面区域标记出来让扩散过程在去噪的每一步都考虑两条链之间的相互作用。这个约束不是可选项是必选项。2.2 CDR 环区的构象灵活性抗体的六个 CDR 环区CDR-H1、H2、H3、L1、L2、L3是决定抗原结合特异性的核心区域。其中 CDR-H3 最长、最灵活长度可以从 5 个残基到 20 多个残基不等构象空间极大。RFdiffusion 在处理这种柔性环区的时候如果完全放开让它自由生成出来的构象往往不合理——要么能量太高要么和框架区发生碰撞。我的经验是对 CDR-H1、H2、L1、L2、L3 这几个相对保守的环区可以用已知的 canonical 构象作为模板来约束。CDR-H3 则必须给它足够的自由度但也不能完全放开。一个折中的做法是在 RFdiffusion 的噪声调度上做文章对 CDR-H3 区域使用较低的噪声水平让模型在已有构象的基础上做局部优化而不是从纯噪声开始生成。2.3 框架区的序列保守性抗体的框架区framework region承担着维持整体结构稳定的功能这些位置的序列在自然界中高度保守。如果你让 ProteinMPNN 完全自由地设计整个抗体的序列它可能会在框架区引入一些看起来合理但实际上会破坏结构的突变。我在一次测试中让 ProteinMPNN 对整条链做无约束设计结果在框架区的核心疏水核位置生成了一个天冬氨酸。从序列上看没什么问题但放到结构里一分析这个带电残基埋在疏水核里能量上完全不可接受。后来我调整了策略对框架区的位置根据 IMGT 编号做位置特异性权重设置保守位置给低突变概率CDR 区域给高突变概率出来的序列就合理多了。3. RFdiffusion 跑抗体骨架的参数调优实录3.1 输入配置文件的写法RFdiffusion 的输入配置决定了整个扩散过程的走向。对于抗体设计我通常会把重链和轻链分开定义然后在 contig 里指定界面接触。下面是一个我实际用过的配置片段contig: A1-120/0 B1-110/0 length: 120,110 noise_scale_ca: 0.5 noise_scale_frame: 0.3这里的A1-120和B1-110分别代表重链和轻链的框架区加 CDR 区域。noise_scale_ca控制 Cα 原子的噪声水平我把它设成 0.5 而不是默认的 1.0原因是抗体的框架区需要保持相对刚性的构象太高的噪声会让框架区变形。noise_scale_frame设成 0.3 是为了让主链的刚体运动幅度小一些避免两条链在扩散过程中漂得太远。注意noise_scale_ca和noise_scale_frame这两个参数需要配合调整。如果你把noise_scale_ca降得很低但noise_scale_frame保持默认模型会在局部做很剧烈的调整反而容易产生不合理的键长和键角。3.2 扩散步数和采样数量的权衡RFdiffusion 默认的扩散步数是 50 步。对于普通蛋白这个步数通常够用。但抗体体系因为链间界面的约束更复杂我建议把步数加到 100 到 150 步。步数太少两条链的界面来不及充分优化步数太多计算时间线性增长而且收益递减。采样数量方面我一般会生成 500 到 1000 个骨架然后从中筛选。这个数量听起来很多但实际筛下来能用的可能只有个位数。抗体的结构约束太强了大部分采样结果会在界面互补性或者 CDR 环区构象上出问题。筛选的时候我主要看三个指标第一条是两条链的界面面积低于 500 平方埃的基本可以扔掉第二条是 CDR-H3 的构象是否和框架区有碰撞用简单的原子距离检查就能筛掉一批第三条是整体结构的回旋半径如果和典型抗体的值偏差超过 15%说明折叠出了问题。3.3 常见报错和排查思路跑 RFdiffusion 抗体设计的时候最常见的报错是显存不足。抗体两条链加起来 230 多个残基加上扩散过程的中间态显存占用比单链蛋白高不少。如果你用的是 24G 显存的卡建议把 batch size 设成 1然后通过增加采样轮次来弥补。另一个常见问题是生成的骨架两条链“粘”在一起界面面积大得离谱。这通常是因为noise_scale_frame设得太低两条链在扩散过程中没有足够的空间探索最后收敛到了一个过度紧密的构象。把noise_scale_frame调到 0.5 以上通常能缓解这个问题。还有一个比较隐蔽的坑RFdiffusion 输出的 PDB 文件里两条链的链标识符可能都是 A。如果你直接拿这个文件去跑 ProteinMPNN它会以为只有一条链设计出来的序列就全乱了。我一般会在跑完 RFdiffusion 之后加一步后处理用脚本把重链和轻链的链标识符分别改成 H 和 L。4. ProteinMPNN 序列设计中的位置特异性策略4.1 默认参数为什么不够用ProteinMPNN 的默认设置是对所有位置一视同仁每个位置都有相同的概率被突变。这个策略对于普通的蛋白设计是合理的但抗体不行。抗体的框架区有大量的保守位置这些位置一旦突变轻则影响稳定性重则直接让抗体失去功能。我做过一个对比实验用默认参数对同一个抗体骨架做序列设计出来的序列在框架区有 12 个突变其中 3 个位于 VH-VL 界面核心。用位置特异性权重重新设计后框架区突变降到了 2 个而且都不在关键位置。结合实验验证的数据来看后者的表达量和热稳定性都明显更好。4.2 基于 IMGT 编号的权重设置要做位置特异性设计首先得把抗体序列按照 IMGT 编号系统对齐。IMGT 编号是抗体领域的通用标准它把抗体的可变区划分为框架区FR1、FR2、FR3、FR4和互补决定区CDR1、CDR2、CDR3每个位置都有固定的编号。对齐之后你可以根据位置的功能重要性来设置突变权重。我的做法是框架区的核心疏水位置如 VH 的 47 位、VL 的 44 位等权重设为 0.1即突变概率极低框架区的表面位置权重设为 0.5允许有限的突变CDR 区域权重设为 1.0 到 1.5鼓励多样性CDR-H3权重设为 2.0最大化序列多样性这个权重方案不是拍脑袋定的而是基于对抗体序列数据库的统计分析。我统计了上千条天然抗体序列计算了每个位置的氨基酸保守性得分然后把这个得分映射到权重上。保守性高的位置权重低保守性低的位置权重高。4.3 链间界面的协同设计抗体的重链和轻链界面需要协同设计不能分开跑。如果你先设计重链再设计轻链很可能会在界面上产生电荷冲突或者空间碰撞。ProteinMPNN 支持多链输入你可以在一次运行里同时设计两条链模型会自动考虑链间的相互作用。具体操作是在输入 PDB 里把两条链都标记为需要设计然后在输出的时候检查界面残基的配对情况。我一般会重点看 VH 的 37、39、45、47 位和 VL 的 35、37、44、46 位这些位置是 VH-VL 界面的核心必须形成互补的疏水或极性相互作用。如果一次设计出来的界面不理想可以固定其中一条链的界面残基只重新设计另一条链的对应位置。这种“半固定”策略比完全重新设计更可控也更容易得到合理的界面。5. 从序列到结构设计结果的验证链路5.1 AlphaFold2 或 ESMFold 的快速结构预测ProteinMPNN 输出的是序列你还需要确认这些序列能不能折叠回你设计的骨架结构。最直接的方法是用 AlphaFold2 或者 ESMFold 做结构预测然后把预测结构和 RFdiffusion 生成的骨架做比对。我通常用 TM-score 和 RMSD 两个指标来评估。TM-score 高于 0.85 且 RMSD 低于 2.0 埃的说明序列和骨架的兼容性很好可以进入下一轮筛选。如果 TM-score 低于 0.7说明序列设计有问题要么是权重设置不合理要么是骨架本身就不太合理。ESMFold 的速度比 AlphaFold2 快很多适合做大批量筛选。我一般先用 ESMFold 快速过一遍把明显不行的筛掉剩下的再用 AlphaFold2 做精细验证。这样能省不少时间。5.2 界面互补性的定量评估结构预测通过之后下一步是评估重链和轻链界面的互补性。我主要看三个指标指标合格范围测量方法界面面积600-900 平方埃PyMOL 的get_area命令形状互补性 0.6Sc 评分静电互补性-5 到 5 kcal/molAPBS 计算界面面积低于 600 平方埃的两条链的结合可能不够牢固。形状互补性低于 0.6 的说明界面上有空洞或者碰撞。静电互补性超出范围的说明界面上有未配对的带电残基。这三个指标不需要全部完美但至少要有两个在合格范围内。我遇到过一些设计界面面积和形状互补性都很好但静电互补性很差后来分析发现是界面上有一个谷氨酸和一个谷氨酸靠得太近互相排斥。把其中一个突变成谷氨酰胺之后指标就正常了。5.3 分子动力学模拟的稳定性检查如果你有足够的算力建议对筛选出来的候选做一轮短时间的分子动力学模拟。我一般跑 50 到 100 纳秒看两条链会不会解离CDR 环区会不会发生大的构象变化。跑 MD 的时候有几个参数需要注意水模型用 TIP3P力场用 AMBER14SB温度 300K压力 1 个大气压。时间步长 2 飞秒每 10 皮秒保存一次轨迹。如果模拟过程中两条链的界面面积下降了超过 20%或者 CDR-H3 的 RMSD 超过了 3 埃这个设计就值得怀疑。MD 模拟不是必须的但它能发现一些静态结构分析发现不了的问题。我有一次筛出来一个设计静态指标都很好但 MD 跑到 30 纳秒的时候轻链开始往外漂最后完全解离了。后来回头看发现是界面上的一个关键氢键在动态过程中断掉了静态结构里看不出来。6. 实操中踩过的坑和对应的解法6.1 链标识符混乱导致的设计失败前面提过 RFdiffusion 输出的链标识符问题这里展开说一下。RFdiffusion 默认把所有链都标成 A如果你不做后处理直接跑 ProteinMPNN它会认为只有一条链设计出来的序列就是一条长链的序列而不是两条链各自的序列。我第一次跑的时候没注意这个问题ProteinMPNN 输出的序列长度是 230 个残基我还纳闷怎么这么长。后来把 PDB 文件打开一看两条链的链标识符都是 AProteinMPNN 把它们当成了一条链。改成 H 和 L 之后输出的序列就正常了重链 120 个残基轻链 110 个残基。提示RFdiffusion 的输出目录里通常有一个chain_id的映射文件但有时候不会自动生成。保险起见跑完 RFdiffusion 之后手动检查一下 PDB 文件的链标识符用sed或者 Python 脚本改一下就行。6.2 CDR-H3 长度选择的经验法则CDR-H3 的长度对抗体的结合特性影响很大。太短了结合表位的能力有限太长了构象灵活性太高容易产生不合理的折叠。根据我的经验CDR-H3 长度在 10 到 15 个残基之间是比较理想的区间。如果你有特定的抗原表位信息可以根据表位的大小和形状来调整 CDR-H3 的长度。表位比较平坦的CDR-H3 可以短一些8 到 12 个残基表位比较深或者有凸起的CDR-H3 需要长一些12 到 18 个残基。我在一次针对一个凹槽状表位的设计中把 CDR-H3 设成了 16 个残基出来的骨架确实能伸到凹槽里但构象不太稳定。后来降到 13 个残基虽然伸得没那么深但整体结构更合理后续的序列设计也更容易得到好的结果。6.3 采样多样性不足的应对RFdiffusion 在抗体设计中的一个常见问题是采样多样性不够生成的骨架看起来都差不多。这通常是因为噪声调度设置得太保守模型没有充分探索构象空间。我的解法是分两阶段采样第一阶段用较高的噪声水平noise_scale_ca设成 0.8 到 1.0生成一批多样性高的骨架第二阶段从中挑出有潜力的用较低的噪声水平0.3 到 0.5做局部优化。这样既能保证多样性又能保证最终结构的合理性。另外增加采样数量也是提高多样性的有效手段。我一般会跑 1000 个以上的骨架然后根据 CDR-H3 的构象做聚类从每个聚类里挑一两个代表进入下一轮。这样能避免所有候选都集中在同一个构象区域。6.4 序列设计中的半胱氨酸处理抗体里有保守的二硫键重链和轻链各有一个内部二硫键有些抗体还有链间二硫键。ProteinMPNN 在默认设置下可能会在非保守位置引入半胱氨酸这些额外的半胱氨酸如果找不到配对就会形成游离巯基影响抗体的稳定性和表达量。我的做法是在 ProteinMPNN 的输入里把已知的二硫键位置固定住不允许突变。对于非保守位置把半胱氨酸的突变概率设成 0。这样出来的序列就不会有额外的半胱氨酸了。如果你确实想引入新的二硫键来增强稳定性那需要同时设计两个位置让它们空间上靠近且几何构象合适。这个操作难度比较大建议先用 Disulfide by Design 之类的工具做预测确认可行之后再在 ProteinMPNN 里放开这两个位置的限制。7. 从设计到实验的衔接要点7.1 表达载体的选择设计出来的抗体序列要进入实验验证第一步是选择合适的表达载体。哺乳动物细胞表达系统如 HEK293 或 CHO是最常用的因为抗体需要糖基化和正确的二硫键形成这些翻译后修饰在原核系统里做不了。我一般用 pcDNA3.4 载体重链和轻链分别克隆到两个载体上然后共转染。重链和轻链的比例很重要我试过 1:1、1:2 和 2:1 三种比例1:1 的表达量最高1:2 的轻链过量有助于减少重链的聚集但总表达量会低一些。具体用哪个比例建议做个小规模的优化实验。7.2 纯化标签的位置纯化标签的位置会影响抗体的结合活性。如果你把 His 标签放在重链的 C 端它可能会干扰 CH1 和 CL 的界面。我一般把标签放在轻链的 C 端或者用 Fc 融合的方式让标签远离抗原结合位点。如果设计的是 Fab 片段标签放在重链 Fd 链的 C 端通常没问题。如果是 scFv标签放在 linker 的 N 端或 C 端都可以但要确保 linker 足够长不会影响 VH 和 VL 的配对。7.3 初步结合实验的设计拿到纯化后的抗体第一步是做结合实验。最常用的是 ELISA把抗原包被在板上加梯度稀释的抗体看结合曲线。如果抗原是膜蛋白或者构象敏感的表位ELISA 可能不合适需要用 SPR 或者 BLI 来做。我一般先用 ELISA 做初筛阳性克隆再用 SPR 测亲和力。SPR 的 KD 值如果在纳摩尔级别说明设计是成功的。如果 KD 在微摩尔级别可能需要做一轮亲和力成熟用 ProteinMPNN 对 CDR 区域做定向进化或者用 RFdiffusion 对 CDR-H3 做局部重新生成。7.4 稳定性评估的时机抗体的热稳定性直接影响它的保存条件和体内半衰期。我一般用圆二色谱或者差示扫描荧光法来测熔解温度。好的抗体设计Tm 应该在 65 摄氏度以上。如果 Tm 低于 60 摄氏度说明框架区的序列设计可能有问题需要回头检查 ProteinMPNN 的权重设置。热稳定性评估最好在亲和力测定之前做因为如果抗体本身就不稳定亲和力数据也不可靠。我遇到过几个设计ELISA 信号很好但一测 Tm 只有 55 摄氏度后来发现是框架区的一个关键脯氨酸被突变掉了导致局部结构松散。8. 这套流程的边界和后续优化方向RFdiffusion 加 ProteinMPNN 的抗体设计流程目前能做到的是生成结构合理、序列可折叠、界面互补性良好的抗体候选。但它不能保证的一定是高亲和力、高特异性、低免疫原性。这些属性需要实验验证和后续优化。从我的实操经验来看这套流程最大的价值在于把候选抗体的获取周期从几个月压缩到了几周。你可以在很短的时间内生成几百个候选然后从中筛选出几十个进入实验验证。虽然最终能成功的可能只有几个但这个效率已经比传统方法高太多了。后续的优化方向我觉得有几个值得关注的点。一是把抗原结构信息整合到 RFdiffusion 的条件生成里让生成的抗体骨架直接针对特定表位。二是用 ProteinMPNN 做亲和力成熟通过多轮迭代设计逐步提高结合强度。三是把免疫原性预测整合到筛选流程里提前排除那些可能引起免疫反应的序列。这套流程还在快速演进新的模型和工具不断出现。但核心思路是清晰的用生成模型探索序列和结构空间用物理和统计方法做筛选用实验做最终验证。把这个思路吃透具体工具的替换和升级都是水到渠成的事。