AI力场二次开发教程(17):蛋白–配体自由能(FEP)——AI 力场接入 alchemical 工作流
2026/9/4 18:45:33 网站建设 项目流程

AI力场二次开发教程(17):蛋白–配体自由能(FEP)——AI力场接入 alchemical 工作流

适用版本与技术栈(以官方文档为准)

  • espaloma 0.3.x(conda-forge)
  • openff-toolkit 0.19.0 / openff-interchange 0.5.1
  • OpenFE(openfe,自由能与工作流引擎,开源)
  • Perses(相对自由能 alchemical 引擎,开源,espaloma 0.3.0 校验中使用过 perses 0.10.1)
  • 涉及无 License 开源工具时一律按官方文档示意,不编造接口细节

一句话结论:相对结合自由能(FEP)通过 alchemical 映射与退火把一个配体"逐步变成"另一个配体,从而抵消大量常项误差、得到高精度的相对绑定自由能差值;Espaloma 已被 perses-benchmark 用于蛋白–配体体系验证,接入点是"用 espaloma 生成 alchemical 双态体系所需的 OpenMM Force 参数"。

〇、认知问题

  1. 为什么我们算相对结合自由能(relative binding free energy)而不是绝对结合自由能?(认知)
  2. alchemical 映射(alchemical map)与退火(annealing)到底在做什么?(认知)
  3. Espaloma 在 perses-benchmark 这类相对自由能计算里扮演什么角色——它的真实接入点在哪?(方法)
  4. 用 openfe/perses 搭一个 FEP 骨架时,CPU/GPU 模拟窗口如何组织、怎么理解窗口间能差?(方法)

一、机制解析

1.1 从绝对到相对:为什么自由能差值好用

热力学告诉我们,结合自由能本身可以写成:

ΔG_bind = -k_B T ln( 配体在口袋 / 配体在溶液 的配分比 )

但直接算"绝对"绑定自由能需要同时精确处理口袋、水、去溶剂熵,极难收敛。相对自由能则聪明地利用热力学循环:

ΔG1(结合态的转变) L1·蛋白 ────────────────→ L2·蛋白 │ │ ΔG(A)│ 真实绑定能 │ΔG(B) ↓ ↓ L1(水) ────────────────→ L2(水) ΔG2(溶液态转变) ΔΔG_bind = ΔG(B) - ΔG(A) = ΔG2 - ΔG1 (循环闭合)

只要两个配体够相似(同系物等),两个转变过程里的误差大量抵消,ΔΔG往往可以做到±1 kcal/mol级别——这在药物优化中已经很有价值。这就是"我们算相对而不是绝对"的根本原因。

1.2 alchemical 映射与退火:把化学转变变成连续参数

alchemical 映射的核心思想:在 L1 与 L2 之间插值一个耦合成λ的中间态。常见做法是引入 alchemical 原子对:把 L1 与 L2 的共同原子重合,把"多出来/要消失"的原子用软核(softcore)处理,避免双删诞生的奇异项(LJ 项分母趋于 0 的经典问题)。

退火(annealing)在自由能语境里,通常指对 λ 做渐进的、多窗口的调度:从 λ=0(纯 L1)扫到 λ=1(纯 L2),每个窗口是一个 OpenMM 模拟,收集能量对 λ 的导数,通过热力学积分(TI, thermodynamic integration)或各向异性/一阶累积展开(BAR/MBAR)加权求和。

ASCII 图:一个典型 6 窗口 TI 过程

调节变量 λ: 0.0 0.2 0.4 0.6 0.8 1.0 状态 L1 ←—————— 混合态 ————————→ L2 能量采样 [w0] [w1] [w2] [w3] [w4] [w5] 累计积分 →→→→→→→→ ∂H/∂λ 对 λ 积分 →→→→→→→→

一个更高的窗口数(例如 12–24 窗加退火往返)通常能改善方差,但代价是总 GPU 机时;最优窗口数以具体体系与官方实践为准。

1.3 Espaloma 在 perses-benchmark 中的真实接入点

Espaloma 官方仓库提供了scripts/perses-benchmark作为真实佐证;espaloma-0.3.0 的论文(arXiv:2307.07085)也报告了用 perses 0.10.1 的相对 alchemical 自由能框架,在蛋白–配体基准集上把 espaloma 参数化的小分子与成熟力场 openff-2.1.0 做对比。

接入点在工程上是很清晰的:alchemical 引擎(如 perses)需要一个能对 λ 状态生成 OpenMMSystemIntegrator的参数化后端。Espaloma 恰好提供esp.graphs.deploy.openmm_system_from_graph(molecule_graph)生成openmm_system。所以在管线里,用 espaloma 替换默认 S-LSR/OpenFF 参数化的哪一步,就是 AI 力场真正"接入" alchemical 工作流的地方

传统管线: SMIRNOFF(openff-2.x) → alchemical System → OpenMM 采样 → ΔΔG AI 管线: espaloma(GNN) → openmm_system_from_graph → 无缝进入同一 alchemical 引擎 接入点 = 替换上方的“参数化后端”,其余引擎逻辑保持不变

这个"替换后端而保留引擎"的接口,正是 AI 力场能复用整个 free energy 生态的原因。

二、完整代码与逐行剖析

下面两段代码都是"可运行骨架"。第一段演示 AI 力场侧生成 OpenMM System 的最小闭环;第二段演示 openfe/perses 的通用 FEP 骨架逻辑(标注 AI 接入点)。涉及无 License 开源工具的 API 一律以官方文档为准。

2.1 代码一:Espaloma 生成 System(AI 力场侧闭环)

# 文件:espaloma_to_system_for_fep.py# 思路:相对自由能引擎需要"能对 λ 生成 OpenMM System"的参数化后端,# 这里给出 espaloma 最小闭环。后续把它塞进引擎即可。fromopenff.toolkit.topologyimportMoleculeimportespalomaasesp# 1) 建小分子(同系物示例:以简单骨架代表 L1)molecule=Molecule.from_smiles("CCO")# 乙醇,仅作骨架示意g=esp.Graph(molecule)# 转成 espaloma 异质图# 2) 加载 AI 力场模型("latest" 指向最新稳定权重;本地 .pt 需先 model.eval())model=esp.get_model("latest")model(g.heterograph)# 前向推理:为图上每个节点跑参数# 3) 把预测参数组装成 OpenMM System —— 这就是 alchemical 引擎所需的"后端产物"fromespaloma.graphs.deployimportopenmm_system_from_graph openmm_system=openmm_system_from_graph(g)print("生成 System,相互作用类型数:",openmm_system.getNumForces())

逐行剖析:esp.Graph(molecule)接受openff.toolkitMolecule,把化学图(原子键角二面)建成异质图;esp.get_model("latest")拉取官方权重,model(g.heterograph)触发 GNN 前向以填充参数;openmm_system_from_graph(g)是部署入口,得到可直接交给模拟引擎的openmm_system。在 FEP 语境里,alchemical 引擎会对该 System 做 λ 态改造(施加软核、耦合缩放),因此此处的 System 结构越规整,改造越稳。

2.2 代码二:openfe / perses FEP 骨架(标注接入点)

# 文件:fep_sketch_openfe_perses.py# 说明:openfe / perses 的调用细节属于无 License 开源工具,# 这里只给骨架 + AI 接入点注释,实际运行以官方文档为准。defbuild_fep_workflow(ligand_a_smiles,ligand_b_smiles,protein_pdb,method="TI"):""" 骨架示意,非可直跑的完整管线。 此函数的核心目标:把两个配体、一个蛋白,组织成 alchemical 任务。 """# 1) 化学网络 / 映射(openfe 概念:transformation、alchemical network)ligand_a=ligand_a_smiles# 例 "CCO"ligand_b=ligand_b_smiles# 例 "CCN"(骨架同系替换)mapping=_sketch_atom_mapping(ligand_a,ligand_b)# 原子对应关系(骨架示意)# 2) 蛋白准备(简化:仅示意)system_a=_sketch_system(protein_pdb,ligand_a)# L1 结合态复合物system_b=_sketch_system(protein_pdb,ligand_b)# L2 结合态复合物# 3) 窗口调度(真正实现时 perses / openfe 会生成 λ 窗列表)lambdas=[0.0,0.2,0.4,0.6,0.8,1.0]# 4) 关键注释(AI 力场接入点):# 真正脚本中,L1/L2 的参数化后端应从“openff-toolkit/espaloma”产生 OpenMM System,# 替换这里的 _sketch_system,即让 espaloma 进入 alchemical 引擎。results={}forlaminlambdas:# 每个窗口:做 OpenMM 模拟 → 记录 dU/dλ → 存进 resultsresults[lam]=_run_window(system_a,system_b,lam)# 骨架示意# 5) 热力学积分求和得到 ΔG2 类量,结合溶液态循环得 ΔΔGdG=_integrate(lambdas,results)returndGdef_sketch_atom_mapping(a,b):"""骨架:返回原子索引映射字典,真正实现用 openfe 的 mapping 工具。"""return{i:iforiinrange(min(len(a),len(b),8))}def_sketch_system(pdb,smi):"""骨架:占位,返回一个普通 dict;实际是构建复合物并参数化。"""return{"protein":pdb,"ligand":smi}def_run_window(sys_a,sys_b,lam):"""骨架:占位积分采样;真实逻辑在 OpenMM 中进行 MD 并记录能量。"""return0.0def_integrate(lambdas,results,order=2):"""示意:用辛普森/梯形做热力学积分;返回 kcal/mol 等级差值。"""importnumpyasnpreturnfloat(np.trapz([results.get(l,0.0)forlinlambdas],lambdas))if__name__=="__main__":dG=build_fep_workflow("CCO","CCN",protein_pdb="target.pdb")print("相对转变自由能(示意):",round(dG,3),"kcal/mol —— 以实际运行与官方文档为准")

逐行剖析:这段代码刻意保留了完整骨架但把所有不确定接口都降为_sketch_*占位函数,其唯一目的是让你看清FEP 管线的形状:化学网络/映射 → 双态 System 准备 → λ 窗采样 → 积分。真实环境里这些占位由 openfe 的 transformation 与 perses 的RelativeAlchemicalState等对象替换,调用方式以官方文档为准。文中最关键的一行是注释"AI 力场接入点":把_sketch_system里的参数化后端换成 espaloma,就完成了 AI 力场接入。

三、常见报错与排查

表:FEP 类报错及处理思路

现象 / 报错可能原因处理思路(以官方文档为准)
窗口间 dU/dλ 方差巨大参数化不一致(L1/L2 乱序)或映射错位复查 atom mapping 与拓扑一致性
λ=1 端出现奇异势能(软核报错)softcore 未启用或 η 参数不当改用/开启软核,调整软核光滑参数
蛋白与配体 System 组合时原子索引错乱复合体拓扑构建顺序不一致用统一的 topol/接独立性索引重新组装
两侧(结合态/溶液态)计算细节不一样未统一采样参数统一步长、约束、非键处理、随机种子策略(报告性)
结果重复性差采样不足 / 窗口数少增加窗口数与退火往返,以收敛曲线判断

四、动手练习

练习 1(必做):选取一对结构相似的中性小分子(例如CCOCCN),先跑通 espaloma→openmm_system的闭环(2.1 段),打印 System 信息;再观察如果把该 System 交给某个 alchemical 引擎(无论 openfe 还是 perses),接入点改在哪一行。

练习 2(推进):用一个极小的模型体系(如"假想蛋白质=单晶格约束中两个水+空腔"),跑 TI 骨架的 6 窗模拟,打印每一窗的dU/dλ,手动作梯形积分,理解"能差含义"——即每个窗里的导数在积分后如何累积成总自由能。

练习 3(对照):制作一张"结合态 vs 溶液态"两行的处理差异表格,列出参数化、非键、约束等项是否必须一致,理解为什么循环闭合如此依赖一致性。

五、小结与下一篇预告

本篇讲清了三件事:相对结合自由能的循环机制与误差抵消、alchemical 映射与退火的工作方式、以及 Espaloma 在 perses-benchmark 中的真实接入点(用 espaloma 生成 alchemical 后端需要的 OpenMM System)。核心要点:相对自由能靠热力学循环与 alchemical 插值抵消常项误差,AI 力场的接入点是"替换参数化后端而保留引擎"

下一篇(第 18 篇)转向规模化应用:高吞吐虚拟筛选——用concurrent.futures对上百个 SMILES 批量做 AI 参数化并统计成功率,为实战型管线铺路。


本篇认知问题回显(FAQ)

  1. 为什么相对结合自由能(relative binding free energy)比绝对结合自由能更实用?
    相对法用热力学循环把 L1→L2 转变在结合态与溶液态中扣除,大量常项误差在差值中抵消,ΔΔG精度可到约 ±1 kcal/mol,而绝对绑定能需同时精确处理去溶剂熵,收敛代价高得多。

  2. alchemical 映射(alchemical map)与退火到底在做什么?
    alchemical 映射建立 L1 与 L2 的原子对应并插值出λ依赖中间态,退火则对 λ 做多窗口渐进调度,每个窗口用 OpenMM 采样 dU/dλ,最终经热力学积分得到 ΔG。

  3. Espaloma 在 perses-benchmark 相对自由能计算里的真实接入点在哪里?
    接入点是"参数化后端":perses/openfe 引擎需要能对 λ 状态的复合体生成 OpenMM System,而 espaloma 的openmm_system_from_graph正可替换默认的 OpenFF 参数化,其余引擎逻辑保持不变。

  4. 用 openfe/perses 搭 FEP 骨架时窗口如何组织、能差怎么理解?
    窗口沿 λ 从 0 到 1 排列,各窗独立采样 dU/dλ,事后梯形/辛普森或 MBAR 加权求和;每窗导数在积分后累积成总自由能,窗口越多方差越小但机时越高,最优窗口数以实际收敛为准。

查看第 17 篇教程

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询