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),保证数据不外流且可定制;
- 实验流程生成:这个功能有独特价值,但生成的条件仍需化学家审核。
上手提示
- 「化学反应即翻译」的思路灵活但可能生成不合法输出,必须做原子守恒等验证;
- 正式项目的分子结构不应提交在线服务,涉及知识产权风险;
- 「路线 → 实验步骤」的自然语言生成是它较独特的能力;
- 在线服务适合评估与教学,生产用途建议本地部署。
延伸资源
- 对照工具:385《AiZynthFinder》、386《ASKCOS》;概念:384《逆合成分析入门》;
- 反应预测:388《反应产物预测》;自动化合成:391《自驱动实验室 Self-Driving Lab》。