388

反应产物预测:从反应物预测主产物

反应产物预测帮助验证合成设计。这篇讲清建模方法、位点选择性问题与实际用途。

正向反应预测回答的问题是:给定反应物和条件,会生成什么产物?它与逆合成互补——逆合成提出方案,正向预测验证方案

为什么需要正向预测

  • 验证逆合成建议:逆合成说「A + B → C」,但实际反应可能给出别的产物;
  • 位点选择性:分子有多个反应位点时,反应发生在哪里?这是合成中最实际的问题之一
  • 官能团兼容性:分子中其它官能团会不会参与反应或被破坏?
  • 副产物预测:会生成什么杂质,影响纯化策略;
  • 保护基需求判断:如果某个官能团会干扰,就需要保护。

三类建模方法

方法 思路 特点
基于模板 匹配反应规则并应用 产物化学合法,可解释;受模板库限制
seq2seq SMILES 到 SMILES 的翻译 灵活;可能不合法
基于图/电子流 预测哪些键断裂、哪些形成 更符合化学直觉,原子守恒天然满足

基于电子流的方法(如 WLDN、GraphRetro 系)在概念上最优雅:它把反应建模为「电子对的重新分配」,直接预测反应中心与键的变化,产物由此推导——这与化学家的思维方式一致,且天然保证原子守恒。

位点选择性:最有实用价值的预测

# 典型问题:一个含多个反应位点的分子,反应会发生在哪?
#
# 例:一个同时含伯胺、仲胺、酚羟基的分子做酰化
#     → 哪个先反应?需不需要保护?
#
# 这类问题在实际合成中极常见,且判断错误代价高

from rdkit import Chem
from rdkit.Chem import AllChem

def enumerate_possible_sites(mol_smiles, reaction_smarts):
    """枚举所有可能的反应位点"""
    mol = Chem.MolFromSmiles(mol_smiles)
    rxn = AllChem.ReactionFromSmarts(reaction_smarts)

    products = set()
    for prod_set in rxn.RunReactants((mol,)):
        for p in prod_set:
            try:
                Chem.SanitizeMol(p)
                products.add(Chem.MolToSmiles(p))
            except Exception:
                continue
    return list(products)

# 枚举给出所有「化学上可能」的产物,
# 但不告诉你哪个是主产物 —— 这正是预测模型的价值

# 影响位点选择性的因素:
#   - 亲核性/亲电性强弱
#   - 空间位阻
#   - 电子效应(给电子/吸电子基团)
#   - 反应条件(pH、温度、溶剂)
#   - 动力学 vs 热力学控制

用 ASKCOS 做正向预测

import requests

BASE = "http://localhost/api/v2"

r = requests.post(f"{BASE}/forward/", json={
    "reactants": "Cc1ccc(N)cc1O.CC(=O)Cl",     # 含氨基和酚羟基
    "reagents": "",
    "solvent": "CN(C)C=O",
    "num_results": 5,
})

for p in r.json()["output"]:
    print(f"概率 {p['prob']:.3f}  {p['smiles']}")

# 输出会给出多个可能产物及其概率
# 高概率产物 = 预测的主产物
# 若多个产物概率接近 → 选择性差,可能需要保护基

怎么读预测结果

  • 看概率分布而非只看第一名:如果第一名概率 0.9、第二名 0.05,说明选择性好;如果前两名都是 0.4,说明可能得到混合物。
  • 概率不是产率:模型给的是「在训练数据中,这类反应最常生成什么产物」的统计,不是实际产率预测。
  • 检查原子守恒:seq2seq 类模型可能给出不守恒的产物。
  • 结合化学直觉判断:模型的输出应该与你对反应机理的理解一致;不一致时要么模型错了,要么你发现了值得注意的情况。

能力边界

  • 只在训练数据覆盖的反应类型上可靠:USPTO 等数据集中常见的反应(酰胺偶联、Suzuki、还原胺化)预测较准;罕见反应或新反应不行。
  • 条件敏感性建模不足:同样的反应物在不同条件下可能给出不同产物,而多数模型对条件的建模很粗糙。
  • 立体选择性预测弱:这是整个领域的短板。
  • 不预测反应是否真的发生:模型假设反应会发生,只预测产物是什么。「这个反应根本不会进行」这种情况它给不出。
  • 训练数据只有成功反应:这个根本局限影响所有合成 AI(见 384《逆合成分析入门》)。

实际用法

# 用法一:验证逆合成建议(最主要)
# 逆合成给出 A + B → C 的切断后,
# 用正向模型检验是否真的生成 C

# 用法二:保护基策略判断
# 对含多个官能团的分子,预测不加保护基时会发生什么
# → 决定是否需要保护

# 用法三:杂质预警
# 预测的次要产物提示可能的杂质,
# 有助于提前规划分析方法与纯化策略

# 用法四:路线打分
# 把「正向预测的产物是否与目标一致」作为路线打分的一项
# → 这是 ASKCOS 等平台的做法

def verify_route_step(reactants, expected_product, model_api):
    predictions = model_api.predict(reactants)
    from rdkit import Chem
    expected_canon = Chem.MolToSmiles(Chem.MolFromSmiles(expected_product))
    for i, p in enumerate(predictions):
        pred_canon = Chem.MolToSmiles(Chem.MolFromSmiles(p["smiles"]))
        if pred_canon == expected_canon:
            return {"verified": True, "rank": i + 1, "prob": p["prob"]}
    return {"verified": False}

# rank=1 且 prob 高 → 该步骤可信度高
# 目标产物不在预测列表中 → 这个切断可能有问题

关键要点

  • 正向预测的核心价值是验证逆合成建议与判断位点选择性
  • 看概率分布而非只看第一名——前两名接近说明选择性差;
  • 概率是统计频率,不是产率预测;
  • 模型不预测「反应是否会发生」,只预测「如果发生会给什么产物」。

延伸资源