一、问题不是从论文里来的,是从数据里来的
上个月我在跑 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 个样本跑了一遍。
结果让我自己都愣了一下:
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 评估工具。
六、如果让我重新设计这个评估流程
如果这个项目从头再来,我会这么做:
先明确打分目的:是评估 de novo 设计的可靠性,还是做序列 redesign? de novo 评估: use_binder_template=False,num_recycles=3–6,给 target 上 MSA 或 template,重点看 interface 指标,不要只看全局 RMSD。redesign: use_binder_template=True,接受 RMSD 接近 0 的结果。做对照实验:同一批样本,有 template 和无 template 各跑一遍。两者差距越大,说明设计越不稳定。 源码优先: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,到底在比较谁和谁?”
”
