021

Chai-1 教程:从序列到复合物结构预测的完整流程

Chai-1 从序列到复合物结构,支持灵活的约束输入。这篇给出完整的使用流程与约束设计方法。

Chai-1 是开放权重的 AF3 级复合物预测模型。它相对同类工作的差异化能力是「约束输入」——可以把突变实验、交联质谱等已知信息注入预测,显著提高可靠性。

安装与基本使用

pip install chai_lab
# 需要 GPU;首次运行会自动下载权重

# ---- 输入格式:带类型标注的 FASTA ----
# input.fasta:
#   >protein|name=chain_A
#   MKTAYIAKQRQISFVKSHFSRQLEERLGLIEVQ
#   >protein|name=chain_B
#   MSKGEELFTGVVPILVELDGDVNGHKFS
#   >ligand|name=lig
#   CC(=O)Nc1ccc(O)cc1
#   >rna|name=rna_chain
#   AUGCUAGCUAGC
#
# 【支持的类型】:protein、ligand(SMILES)、rna、dna

from pathlib import Path
from chai_lab.chai1 import run_inference

output = run_inference(
    fasta_file=Path("input.fasta"),
    output_dir=Path("results/"),
    num_trunk_recycles=3,
    num_diffn_timesteps=200,
    seed=42,
    device="cuda:0",
    use_esm_embeddings=True,      # 【无 MSA 模式】
)

# ---- 输出 ----
# results/
#   pred.model_idx_0.cif ~ pred.model_idx_4.cif   多个候选
#   scores.model_idx_0.npz ...                    置信度

约束输入:核心差异化能力

# 【实际场景中,我们常常已经知道部分信息】:
#   - 突变实验表明某残基对结合至关重要
#   - 交联质谱给出了残基对的距离约束
#   - HDX-MS 指出了界面区域
#   - 同源结构提示了结合位点
#   - 已知的药效团模式
#
# 【把这些信息作为约束输入,能显著提高预测质量】

# restraints.csv:
#   chainA,res_idxA,chainB,res_idxB,connection_type,confidence,min_distance_angstrom,max_distance_angstrom,comment,restraint_id
#   A,123,B,1,contact,1.0,0.0,8.0,mutagenesis,r1
#   A,145,B,1,contact,1.0,0.0,8.0,mutagenesis,r2
#   A,89,A,201,contact,0.8,0.0,12.0,crosslink,r3

output = run_inference(
    fasta_file=Path("input.fasta"),
    output_dir=Path("results_constrained/"),
    constraint_path=Path("restraints.csv"),
    num_trunk_recycles=3,
    num_diffn_timesteps=200,
    seed=42,
    device="cuda:0",
)

# 【约束设计的建议】:
#
# 1) 【只加有把握的约束】
#    错误的约束会把预测引向错误的方向
#    → confidence 字段可以表达把握程度
#
# 2) 【距离范围要合理】
#    残基间接触:0~8 Å(Cβ 距离)
#    交联剂约束:取决于交联剂的臂长
#      如 DSS 约 11.4 Å,加上侧链柔性可放宽到 25~30 Å
#
# 3) 【先跑无约束版本作对照】
#    比较有无约束的结果差异
#    → 差异大说明约束起了作用
#    → 完全一样说明约束是冗余的(模型本来就这么预测)
#
# 4) 【逐步加约束】
#    一次加太多难以判断哪个起作用

# 【实用价值】:
#   纯从序列预测 vs 带实验约束预测,
#   后者的可靠性高得多
#   → 【有实验数据时不用,是浪费】

无 MSA 模式

用 MSA 无 MSA(ESM 表示)
准确度 更高 较低
速度 慢(MSA 搜索耗时) 快得多
数据安全 需要外部服务或本地库 完全本地
适用 关键预测 批量粗筛、敏感序列、孤儿蛋白

建议:关键预测用 MSA 模式,批量粗筛用无 MSA 模式。无 MSA 模式的原理是用 ESM 蛋白语言模型的表示替代显式的共进化信息(见 143《ESM-2 论文精读》)——它对有深 MSA 的蛋白准确度明显下降

结果判读

import numpy as np

scores = np.load("results/scores.model_idx_0.npz")
print("综合分:", scores["aggregate_score"])
print("pTM:", scores["ptm"])
print("ipTM:", scores["iptm"])
print("逐链 pTM:", scores["per_chain_ptm"])
print("链对 ipTM:", scores.get("per_chain_pair_iptm"))

# 【判读要点】:
#   ipTM > 0.8   界面很可能正确
#   0.6 ~ 0.8    不确定
#   < 0.6        【界面预测不可靠】
#
#   per_chain_pair_iptm 更细:
#     能看出【哪对链的界面可信、哪对不可信】
#     → 多链体系中很有用

# ---- 多个模型的一致性(最实用的判据)----
from rdkit import Chem
from rdkit.Chem import rdMolAlign
import numpy as np

def model_consistency(cif_paths, ligand_resname="LIG"):
    """比较多个预测中配体位置的一致性"""
    # 从 cif 提取配体后两两算 RMSD
    # 一致性高 → 模型有信心
    # 分散 → 该体系不可靠
    pass

# 【判读逻辑】:
#   5 个模型给出相似的结构 → 可信度高
#   各说各话 → 不应据此做设计决策

Chai-1 与 Boltz 的选择

考量 Chai-1 Boltz-2
商用许可 需核对当前条款 MIT,无限制
亲和力预测
约束灵活性 接触约束更灵活 口袋 + 共价键
无 MSA 模式 原生支持 需自行处理
输入格式 FASTA(简单) YAML(结构化)
结构准确度 两者接近,各基准互有胜负

最实用的建议:两个都装上,对关键体系都跑一遍。它们的训练细节不同——结果一致时可信度显著提高;结果分歧时说明该体系本身难预测。这个交叉验证的价值,超过纠结选哪一个。

许可注意事项

# 【使用前必须核对】
#
# 代码:Apache 2.0
# 权重:有单独的许可条款
#
# 关键点:
#   - 学术与研究用途明确允许
#   - 【商业用途需核对具体条款】
#   - 条款可能随版本变化
#
# 【实践建议】:
#   1) 企业环境中使用前,让法务审阅当前的许可文本
#   2) 每次升级版本都重新确认
#   3) 想避免这类不确定性 → 直接用 Boltz-2(MIT)
#
# 这不是技术问题,但在产业环境中是实际的决策因素

后处理:与所有此类方法一样必需

  • 物理有效性检查:PoseBusters(见 096《Binding Pose》);
  • 局部优化:smina --minimize 修正轻微的几何问题(见 100《Smina》);
  • 独立打分:Chai-1 不给亲和力,需要 smina 或 MM/GBSA 独立评估;
  • 相互作用核对:与已知的关键相互作用比较(见 108《PLIP》);
  • 与传统对接交叉验证:原理不同,一致性有判别价值(见 346《比较 DiffDock、Vina、GNINA》);
  • 与 Boltz 交叉验证:两个 AF3 级模型的一致性。

关键要点

  • 约束输入是差异化优势——能把突变实验、交联质谱等已知信息注入预测;
  • 加约束前先跑无约束版本作对照,判断约束是否真的起作用;
  • 无 MSA 模式适合批量粗筛与敏感序列,关键预测仍应用 MSA
  • 商用许可需核对当前条款;最佳做法是与 Boltz 都跑并比较一致性。

延伸资源