344

用 Boltz 或 Chai-1 预测蛋白-配体复合物

Boltz 与 Chai-1 能直接预测蛋白-配体复合物结构。这篇给出两者的运行命令、结果判读与配体姿势的验证方法。

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 或实验。

延伸资源