一、问题不是从论文里来的,是从数据里来的

上个月我在跑 TFR1 的环肽 binder 项目,流程走到 TFR1_binder_bicyclic2 这一步时,我打开 afcyc_score_results.sc,第一眼看到的不是 pLDDT,不是 ipTM,而是一列 RMSD:

平均值 38.3 Å,最高 69.1 Å。

我的第一反应是:设计是不是崩了?

毕竟在蛋白设计这个圈子里,RMSD 超过 5 Å 通常就要打个问号,40 Å 几乎意味着两个结构完全对不上。但我又有点不甘心——前面的 RFDiffusion、MPNN、Rosetta FastRelax 都正常跑完了,cycle0、cycle1、cycle2 的 RMSD 几乎一样,这不像是某一步 relax 失败能解释的现象。

于是我决定先把这列 RMSD 搞清楚:它到底在比较哪两个结构?


二、找源码,比看文档快得多

我没先去翻 ColabDesign 的文档,而是直接找生成这个 score 文件的脚本。

在 /mpnn_fr/ 下面,我找到了 afcyc_score.py。核心逻辑很直接:

ounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(linemodel.prep_inputs(pdb_path,                  binder_chain='A',                  target_chain='B',                  rm_target=False,                  use_binder_template=False,                  use_multimer=True,                  use_initial_guess=True)model.set_opt(num_recycles=1)model.predict(models=[0,1], verbose=False)rmsd = model.aux['losses']['rmsd']

它做了一件很简单的事:把 all_pdb/ 里的每个 *_cycle0/1/2.pdb 喂给 ColabDesign 的 binder 协议,跑一次 AlphaFold2,然后计算 输入结构和 AF2 预测结构之间的 Cα-RMSD。

也就是说,这个 RMSD 比较的是:

“

AlphaFold2 预测结构 vs. 输入的 Rosetta/MPNN 设计结构

”

不是 cycle0 和 cycle1 比,也不是和实验结构比。

知道这个定义以后,我心里大概有数了:问题可能不是“设计崩了”,而是 AF2 没有被约束住。


三、真正的问题:binder 只给了 initial guess,没给 template

这里要区分两个概念:initial guess 和 template。

Initial guess 是 recycling 的起点。use_initial_guess=True 只是把输入坐标作为第 0 轮的初始坐标放进去,但 AF2 每轮 recycling 都会更新它,不强制保留。

Template 是结构先验。AF2 会把 template 的主链坐标、伪 Cβ、原子 mask 等作为额外特征输入网络,预测结果会强烈倾向于贴近 template。

在 afcyc_score.py 的默认参数里:

  • target 链(B 链):rm_target=False,所以它同时是 template 和 initial guess;
  • binder 链(A 链):use_binder_template=False,所以它只是 initial guess。

也就是说,binder 的坐标只是“起点建议”,AF2 可以随便跑。再叠加:

  • num_recycles=1,对 390 个残基的复合物根本不够收敛;
  • 没有 MSA,target 的折叠缺少进化信息约束;
  • 环化肽的 LINK 记录 AF2 不理解;
  • RMSD 是全局 Cα-RMSD,target 只要整体漂一点,数值就被拉得很大。

binder 没有 template 约束 → 预测时 binder 漂移 → 全局 RMSD 被放大到 30–40 Å。

这个解释比“设计全崩了”合理得多。


四、验证:改一个参数,RMSD 掉一个数量级

为了验证这个判断,我复制了一份 afcyc_score.py,只改了一个参数:

use_binder_template=True

然后挑了 9 个样本跑了一遍。

结果让我自己都愣了一下:

PDB
原 RMSD (Å)
新 RMSD (Å)
下降
TFR1_binder_cyc2_1_0_dldesign_0_cycle0.pdb
39.40
2.49
36.9
TFR1_binder_cyc2_1_0_dldesign_0_cycle1.pdb
40.72
1.11
39.6
TFR1_binder_cyc2_1_0_dldesign_0_cycle2.pdb
40.54
1.10
39.4
TFR1_binder_cyc2_1_1000_dldesign_0_cycle0.pdb
36.11
1.60
34.5
TFR1_binder_cyc2_1_1000_dldesign_0_cycle1.pdb
36.78
0.76
36.0
TFR1_binder_cyc2_1_1000_dldesign_0_cycle2.pdb
35.96
0.52
35.4

RMSD 从 30–40 Å 直接掉到 0.5–2.5 Å。

这个实验基本坐实了我的判断:原文件里的高 RMSD,绝大部分是因为 binder 没有被当作 template,AF2 自由预测时跑飞了。


五、但我为什么不推荐你这么用?

看到这里,可能会有人说:那把 use_binder_template=True 打开不就好了?RMSD 变好看了,ipAE 也变低了。

我的回答是:不建议,除非你的目标本来就是 redesign。

原因很直接:打开 use_binder_template=True 以后,AF2 已经被输入骨架“剧透”了,它不需要真正“理解”这个 binder 为什么能结合 target,只需要在 template 约束下填出和输入一致的结构。

这时候:

  • RMSD 小 ≠ 设计好,它只是 template 服从度;
  • ipAE 低 ≠ 界面真的好,因为它是“在强制贴合前提下的内部一致性”;
  • 你筛选出来的不是“AF2 认可的 binder”,而是“输入骨架的复制品”。

在企业研发里,这两种用途完全不同:

  • de novo binder 评估:你想知道 AF2 自由预测时能不能复现这个设计。这时候应该 关掉use_binder_template,同时增加 recycle 数、提供 MSA/template,重点看 ipTM、plDDT、interface RMSD。
  • binder redesign:你已经有一个不错的骨架,只想改序列。这时候可以 打开use_binder_template,保持骨架不动。

afcyc_score.py 的默认参数,其实更适合 redesign 场景,但很多人(包括我一开始)会误把它当成 de novo 评估工具。


六、如果让我重新设计这个评估流程

如果这个项目从头再来,我会这么做:

  1. 先明确打分目的:是评估 de novo 设计的可靠性,还是做序列 redesign?
  2. de novo 评估:use_binder_template=False,num_recycles=3–6,给 target 上 MSA 或 template,重点看 interface 指标,不要只看全局 RMSD。
  3. redesign:use_binder_template=True,接受 RMSD 接近 0 的结果。
  4. 做对照实验:同一批样本,有 template 和无 template 各跑一遍。两者差距越大,说明设计越不稳定。
  5. 源码优先:ColabDesign 的文档写得不算细,prep.py、inputs.py、design.py 比任何教程都靠谱。

七、总结

afcyc_score_results.sc 里那列 38 Å 的 RMSD,不是设计崩了的铁证,而是 AF2 没有被约束在输入 binder 骨架上 的结果。

改一个 use_binder_template=True,RMSD 能掉到 1 Å,但这不代表你的 binder 变好了,只代表 AF2 被强制贴回了输入结构。

在企业里做 AI 制药,最怕的不是模型不准,而是指标看对了,但指标背后的含义理解错了。这个坑我踩了,希望你下次遇到 40 Å 的 RMSD 时,能先问一句:

“

“这个 RMSD,到底在比较谁和谁?”

”