AF3 架构的一个关键跃进是把小分子配体纳入结构预测——不再需要「先预测蛋白、再对接配体」两步走,而是一次预测出复合物。Boltz(见 192《Boltz》)和 Chai-1(见 193《Chai-1》)是两个可本地部署的开源实现。
Boltz:MIT 许可,商用无限制
pip install boltz
# 最简单:FASTA 输入
boltz predict input.fasta --use_msa_server --out_dir results/
# 复杂体系用 YAML
boltz predict complex.yaml --use_msa_server \
--diffusion_samples 5 --out_dir results/
# complex.yaml
version: 1
sequences:
- protein:
id: A
sequence: MVTPEGNVSLVDESLLVGVTDEDRAVRSAHQFYERLIGLWAPAVMEAAH...
- ligand:
id: B
smiles: "COc1cc2ncnc(Nc3ccc(F)c(Cl)c3)c2cc1OCCCN1CCOCC1"
properties:
- affinity:
binder: B
--use_msa_server 省掉本地几百 GB 数据库,但会把序列发到远程服务。敏感靶点序列必须改用本地 MSA。
Chai-1:支持实验约束注入
pip install chai_lab
from pathlib import Path
from chai_lab.chai1 import run_inference
run_inference(
fasta_file=Path("input.fasta"),
output_dir=Path("outputs"),
num_trunk_recycles=3,
num_diffn_timesteps=200,
use_esm_embeddings=True, # 无 MSA 模式:快但精度略降
seed=42,
)
# FASTA 用特殊头部标记实体类型
>protein|name=kinase
MVTPEGNVSLVDESLLVGVTDEDRAVRSAHQFYERLIG
>ligand|name=inhibitor
COc1cc2ncnc(Nc3ccc(F)c(Cl)c3)c2cc1OCCCN1CCOCC1
Chai-1 的特色是可注入实验约束(已知的残基接触、交联质谱结果),当你手上已有部分实验证据时特别有用。
结果判读
import json, numpy as np
# Boltz 输出的置信度
conf = json.load(open("results/predictions/complex/confidence_complex_model_0.json"))
print(f"confidence_score: {conf['confidence_score']:.3f}")
print(f"ptm: {conf['ptm']:.3f}")
print(f"iptm: {conf['iptm']:.3f}") # 界面质量
print(f"ligand_iptm: {conf.get('ligand_iptm', 'n/a')}")
print(f"complex_plddt: {conf['complex_plddt']:.3f}")
| 指标 | 含义 | 判读 |
|---|---|---|
| pLDDT | 残基级局部置信度 | >90 很可信;<50 常为无序区 |
| PAE | 残基对相对位置误差 | 低 = 域间/链间取向可信 |
| ipTM | 界面预测质量 | >0.8 较可信;<0.6 需谨慎 |
| ligand_iptm | 配体界面质量 | 判断配体姿势可信度的关键 |
多采样看收敛性:比单次置信度更可靠
from rdkit import Chem
from rdkit.Chem import rdMolAlign
import itertools, numpy as np
# 用多个 diffusion sample,看配体姿势是否收敛
poses = []
for i in range(5):
m = Chem.MolFromPDBFile(f"results/predictions/complex/model_{i}.pdb",
removeHs=True, sanitize=False)
poses.append(m)
# 两两 RMSD
rmsds = []
for a, b in itertools.combinations(range(len(poses)), 2):
try:
rmsds.append(rdMolAlign.CalcRMS(poses[a], poses[b]))
except Exception:
pass
print(f"采样间 RMSD: 均值 {np.mean(rmsds):.2f} Å, 最大 {np.max(rmsds):.2f} Å")
if np.mean(rmsds) < 2.0:
print("✓ 采样收敛,姿势较可信")
else:
print("✗ 采样发散 —— 该体系预测不可靠,需交叉验证")
发散本身是重要信号,比一个高置信度数字更能反映预测的可靠性。
配体姿势的验证(必做)
# 1) 物理有效性检查
pip install posebusters
from posebusters import PoseBusters
buster = PoseBusters(config="dock")
df = buster.bust(["predicted_ligand.sdf"], None, "receptor.pdb")
print(df.T)
# 检查项:键长、键角、平面性、立体化学、
# 与蛋白的空间冲突、是否在口袋内
# 任何一项不通过,该姿势就不该用于设计决策
# 2) 与传统对接交叉验证
# 用 Vina/GNINA 对同一体系对接,比较姿势
from rdkit.Chem import rdMolAlign
rmsd = rdMolAlign.CalcRMS(predicted_pose, docked_pose)
print(f"预测姿势 vs 对接姿势 RMSD: {rmsd:.2f} Å")
# < 2 Å 说明两条独立路线一致,可信度大增
# 3) 相互作用核对(见 338)
# 预测姿势是否形成了该靶点家族已知的关键相互作用?
与传统对接的分工
| 场景 | 推荐 |
|---|---|
| 有共晶结构,做类似物对接 | 传统对接(Vina/GNINA) |
| 无任何结构信息 | AF3 类复合物预测 |
| 需要大规模筛选 | 传统对接(成本低几个数量级) |
| 需要蛋白与配体同时建模 | AF3 类 |
| 含核酸、离子、辅因子的复杂体系 | AF3 类 |
| 亲和力排序 | 两者都弱,需 FEP 或实验 |
共同的限制:这类模型的姿势预测有改善,但亲和力预测仍弱。Boltz-2 的亲和力预测功能很有潜力,但用于决策前必须在自家已知活性数据上验证。
常见坑与提示
- 商业项目用 Boltz(MIT 许可);敏感序列必须配本地 MSA;
- 多采样看收敛性比单次置信度更可靠,发散说明该体系预测不可信;
- 配体姿势必须过 PoseBusters 物理检查并与传统对接交叉验证;
- 姿势预测改善不等于亲和力预测准确,排序仍需 FEP 或实验。