387

IBM RXN for Chemistry:反应与逆合成预测服务

IBM RXN 提供在线的反应与逆合成预测服务。这篇讲清它的模型思路、使用方式与在线服务的取舍。

IBM RXN for Chemistry 是把化学反应预测做成在线服务的代表。它的技术特点是用自然语言处理的方法处理化学反应——把 SMILES 当作一种语言,用 Transformer 做「翻译」。

「化学反应即翻译」的思路

# 正向反应预测 = 把「反应物」翻译成「产物」
#   输入: CC(=O)O.OCC
#   输出: CCOC(C)=O
#
# 逆合成 = 把「产物」翻译成「反应物」
#   输入: CCOC(C)=O
#   输出: CC(=O)O.OCC
#
# 用的是与机器翻译相同的 Transformer 架构,
# 只是把词元从单词换成了 SMILES 字符

# 优点:
#   - 不需要人工定义反应模板
#   - 能处理模板库之外的反应
#   - 端到端训练
#
# 缺点:
#   - 可能生成化学上不合法的 SMILES
#   - 不保证原子守恒(需要后处理检验)
#   - 可解释性弱(不知道用了什么反应规则)

使用方式

# 在线平台(有免费额度)
# https://rxn.res.ibm.com

# Python API
pip install rxn4chemistry

from rxn4chemistry import RXN4ChemistryWrapper

rxn = RXN4ChemistryWrapper(api_key="YOUR_API_KEY")
rxn.create_project("my_project")

# 1) 正向反应预测
response = rxn.predict_reaction("BrBr.c1ccc2cc3ccccc3cc2c1")
results = rxn.get_predict_reaction_results(response["prediction_id"])
print(results["response"]["payload"]["attempts"][0]["smiles"])

# 2) 逆合成
response = rxn.predict_automatic_retrosynthesis(
    "Cc1ccc(cc1)S(=O)(=O)Nc1ccc(cc1)C(=O)O",
    max_steps=4,
)
results = rxn.get_predict_automatic_retrosynthesis_results(
    response["prediction_id"])

# 3) 反应流程生成(从路线到实验步骤的自然语言描述)
#    这是它比较独特的功能

独特功能:从路线到实验流程

IBM RXN 有一个其它工具少见的能力:把合成路线转换成自然语言的实验操作步骤,甚至转换成自动化设备可执行的指令。

# 输出示例(概念示意):
# "Add 4-methylbenzenesulfonyl chloride (1.0 eq) to a solution of
#  4-aminobenzoic acid (1.0 eq) in pyridine at 0 °C.
#  Stir the mixture for 2 h at room temperature.
#  Quench with water and extract with ethyl acetate..."
#
# 价值:
#   1) 降低了从「路线」到「可执行实验」的门槛
#   2) 是自动化合成的必要一环(见 391)
#
# 局限:
#   生成的步骤是「典型条件」,不是针对该底物优化的条件,
#   仍需化学家审核与调整

在线服务 vs 本地部署

维度 在线服务 本地部署(如 AiZynthFinder)
上手成本 极低 需配置
算力 无需自备 需自备
数据保密 结构会上传 数据不出内网
批量处理 受配额限制 无限制
可定制 不能改库存/模板 完全可定制
可复现 模型版本可能变 可锁定版本

数据保密是首要考量:把未公开的候选化合物结构上传到第三方服务,涉及知识产权风险。正式项目的分子不应提交在线服务;在线服务更适合方法评估、教学、以及处理已公开的分子。

无模板方法的验证

# 无模板模型可能生成不合法的输出,必须验证
from rdkit import Chem

def validate_reaction_prediction(reactants_smi, product_smi):
    """检验预测的反应是否合理"""
    checks = {}

    # 1) 产物 SMILES 是否合法
    prod = Chem.MolFromSmiles(product_smi)
    checks["valid_smiles"] = prod is not None
    if not checks["valid_smiles"]:
        return checks

    # 2) 原子守恒检查(排除小分子离去基团后)
    react_mols = [Chem.MolFromSmiles(s) for s in reactants_smi.split(".")]
    react_mols = [m for m in react_mols if m]

    from collections import Counter
    def atom_counts(mols):
        c = Counter()
        for m in mols:
            for a in m.GetAtoms():
                if a.GetSymbol() != "H":
                    c[a.GetSymbol()] += 1
        return c

    r_atoms = atom_counts(react_mols)
    p_atoms = atom_counts([prod])
    # 产物的重原子不应多于反应物
    checks["atom_conservation"] = all(
        p_atoms[el] <= r_atoms.get(el, 0) for el in p_atoms)

    # 3) 化合价合法性(MolFromSmiles 已检查)
    # 4) 是否与某个反应物完全相同(无效预测)
    checks["not_identical"] = Chem.MolToSmiles(prod) not in [
        Chem.MolToSmiles(m) for m in react_mols]

    return checks

务实的定位

  • 方法评估与学习:想了解反应预测能做到什么程度,在线服务是最低成本的方式;
  • 处理公开分子:文献复现、教学案例;
  • 正式项目:应使用本地部署的方案(AiZynthFinder、ASKCOS),保证数据不外流且可定制;
  • 实验流程生成:这个功能有独特价值,但生成的条件仍需化学家审核。

上手提示

  • 「化学反应即翻译」的思路灵活但可能生成不合法输出,必须做原子守恒等验证
  • 正式项目的分子结构不应提交在线服务,涉及知识产权风险;
  • 「路线 → 实验步骤」的自然语言生成是它较独特的能力;
  • 在线服务适合评估与教学,生产用途建议本地部署。

延伸资源