正向反应预测回答的问题是:给定反应物和条件,会生成什么产物?它与逆合成互补——逆合成提出方案,正向预测验证方案。
为什么需要正向预测
- 验证逆合成建议:逆合成说「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 高 → 该步骤可信度高
# 目标产物不在预测列表中 → 这个切断可能有问题
关键要点
- 正向预测的核心价值是验证逆合成建议与判断位点选择性;
- 看概率分布而非只看第一名——前两名接近说明选择性差;
- 概率是统计频率,不是产率预测;
- 模型不预测「反应是否会发生」,只预测「如果发生会给什么产物」。
延伸资源
- 平台:386《ASKCOS》、387《IBM RXN for Chemistry》;逆合成:384《逆合成分析入门》、385《AiZynthFinder》;
- 条件预测:389《反应条件与产率预测》;反应数据:399《反应数据库》。