第二章 · 2.7

2.7 化学反应的表示与变换:Reaction SMARTS

Representing Chemical Reactions
反应是分子集合到分子集合的变换。本节先立反应 SMILES 的三段式骨架与试剂的角色,再以原子映射定义反应中心——键级变化的键集合,并讨论映射缺失时的自动补齐;在此之上引入反应模板与 Reaction SMARTS:通配图模式写成图重写规则,模板半径决定特化与泛化的取舍;最后回到 Corey 的逆合成分析,把模板反向应用组织成 AND/OR 搜索树,说明组合爆炸的根源及其对第 4 章生成模型的意义。

2.7.1 从分子到反应:三段式的文本表示

前六节处理的都是静态分子。化学反应把一组分子变成另一组分子:键断裂、键生成、原子重新组合。要让机器处理反应,先要给它一种文本。2.2 节的 SMILES 解决了单个分子;按角色把若干 SMILES 拼装起来,就得到反应 SMILES(reaction SMILES):三段式「反应物>试剂>产物」,两个大于号把一条反应切成三栏(Daylight 理论手册)。同一栏内的多个分子以点号分隔,与混合物的写法一致。

三栏的划分标准是键的变化。反应物(reactants)指发生键变化的分子——至少有一个原子卷入断裂或生成的键;试剂(agents)只提供环境:溶剂、催化剂、酸碱,箭头上方写的那些名字。图 2.7-1 是全文标注的酯化:乙酸与甲醇缩合生成乙酸甲酯与水,酸催化与加热放在中栏,两侧点号各分隔两个组分。试剂栏可以为空(写作「>>」),此时反应只剩净变换的骨架。

乙酸与甲醇在酸催化下酯化:三栏布局,各原子带映射编号,断裂键与生成键高亮 反应物 reactants 试剂 agents 产物 products > > C C O O :6 :1 :2 :3 点号 · 分隔同侧多组分 C O :5 :4 H⁺ Δ(加热) 催化剂与条件 不发生键变化 不进入原子守恒 C C O O C :6 :1 :2 :4 :5 O H H :3 反应中心 = 键级变化的键集合:C:1–O:3 断裂(灰虚线)、C:1–O:4 生成(深色粗线),其余键原样保持。 同一编号即同一原子:O:3 由酸羟基氧转为水的氧,O:4 由甲醇氧转入酯基;中栏的 H⁺ 不进入编号。
图 2.7-1 酯化反应的三段式与原子映射。左栏为反应物(乙酸与甲醇,点号分隔),中栏为试剂(酸催化与加热,不发生键变化),右栏为产物(乙酸甲酯与水)。编号 :1–:6 标出「同一原子」在箭头两侧的去向;深色描边的原子为卷入反应中心的原子。键的变化只有两条:C:1–O:3 断裂、C:1–O:4 生成。

三段式只编码结构骨架,编码不了别的东西:计量比、速率、温度区间、立体选择性与机理细节都不在其中(立体化学可用 @ 记号局部表达,但反应数据很少完备到这一步)。同样要认清:「反应物/试剂」的边界是标注约定而非物理——数据库里两者经常混排,把角色理顺本身就是反应数据清洗的第一道工序,2.6 节的问题在反应层面重演。USPTO 专利反应集是这类数据的最大来源,其角色划分的噪声是公认的局限(Coley et al., 2017)。

2.7.2 原子映射:反应数据真正携带的信息

仅凭三段式,机器只知道「这些分子进了、那些分子出了」,不知道谁变成了谁。补上这一环的是原子映射(atom mapping):给反应物与产物中「同一个原子」标注同一个整数,映射号写在原子方括号内(如 [CH3:1])。它是纯粹的标注层——抹掉全部映射号,反应的化学含义分毫未变;但有了映射,键的变化可以逐条导出,图 2.7-1 中酸羟基氧与水的氧同为 O:3、甲醇的氧转入酯基成为 O:4,去向一目了然。

定义

反应中心。已映射反应 R → P 中,键级发生变化的键的全体:任取两个带映射号的原子 a、b,若它们在 R 与 P 中的键级不同——无键变有键、单键变双键均算——这条键属于反应中心。反应中心 = 断裂的键 ∪ 生成的键 ∪ 变键级的键。

RC(R → P) = { (a, b) : ordR(a, b) ≠ ordP(a, b) }
(2.7-1)a、b 为带映射号的原子对;ord(x, y) 为两原子间键的键级,无键记 0。键级 1 → 0 即断裂,0 → 1 即生成。反应中心是派生量:映射给出原子的对应,键的变化由式逐条算出。

换个角度说:无映射的反应只有「表观」,映射给出「对应」。历史文献与专利几乎从不给出映射,自动补齐于是成为反应信息学的第一道工序。两条主要路线:结构对齐——在反应物与产物之间找最大公共子结构,保留的骨架直接对号,剩余原子再按连接度配对;数据驱动——RXNMapper 一类工具以 Transformer 注意力从大规模反应数据中直接学出原子对应(Schwaller et al., 2021)。两条路线都有失败模式,映射错误并不罕见。

注记

映射号是标注,不是物理。原子并没有编号,映射是人对「同一原子」的认定。认定错了——本该给氧的编号标给了氮——式 (2.7-1) 算出的反应中心就全错,由此提取的模板、差异指纹与训练数据随之全部污染。下游一切「键的变化」都是派生品:映射的可信度决定整条数据链的可信度。使用公开反应数据前,先问映射从哪里来。

反应中心的概念也撑起了反应的向量化。Schneider 等(2015)把产物一侧的原子环境减去反应物一侧的原子环境,得到反应差异指纹,用于大规模反应分类与相似性检索——算的仍是「哪里变了」。反应中心还可以直接建模:Coley 等(2017)用图卷积网络在底物图上预测哪条键将被改写,再对候选产物排序,把「找反应中心」变成一个可学习的任务。这条线索在第 4 章正面展开。

2.7.3 反应模板:从个例到广义变换

单条反应只是个例,合成化学的知识以「一类反应」存在:酯化、酰胺化、偶联。把个例归纳成类,靠的是反应模板(reaction template)。从大量已映射反应出发:取出反应中心,连同指定半径的邻近环境,再把具体原子泛化为查询条件——脂肪碳写作 [#6]、伯胺写作 [N;H2]——即得一条广义变换。数百万条专利反应可以抽出数万到数十万条特化模板(量级估计,随提取半径与归并口径而变),归并后常用的泛化模板在千条量级。

定义

反应模板。从已映射反应中提取的广义变换:反应中心 + 给定半径 r 的邻近环境,写成「左侧模式 → 右侧模式」的图重写规则。半径 r 给定后,一条模板压缩「这一类反应」;数据集中出现过的全部模板,构成该数据集化学操作的字典。

模板的粒度由半径决定(图 2.7-2、表 2.7-1)。半径 0 只留反应中心:几乎一切同型反应都命中,覆盖极广;但「形似而非」的底物也一并命中,误配率高。半径 1 把直接邻居带上:模板开始区分环境,覆盖收缩,误配下降。半径 2 以上接近逐例复现:精确,但每条模板只服务少数反应。特化与泛化不可兼得,半径是这组权衡的旋钮。

同一个酰化中心在半径 0 与半径 1 两种模板粒度下的形态与覆盖面差异 半径 0:仅反应中心 C O O N 离去 进入 [CX3](=[OX1])[OX2] >> [CX3](=[OX1])[NX3] 覆盖:极广——一切酰基转移都命中; 误配:高——酸酐、碳酸酯、氨基甲酸酯一并命中。 半径 1:中心 + 一层邻居 #6 C O O N #6 [#6][C](=O)O . [#6]N >> [#6][C](=O)N[#6] 覆盖:窄——无相应碳—氮邻接环境者出局; 误配:低——邻居排除不相关底物。 半径每加一环,模板更特化:覆盖收缩、误配下降——粒度是覆盖与精度之间的旋钮。
图 2.7-2 模板提取半径:特化与泛化。同一个酰化中心(C、=O、离去的 O、进入的 N,深色描边),左图只取中心原子,模板成为一切酰基转移的通配规则;右图纳入一层邻居(灰色 #6 节点),模板开始要求「酰基碳连着碳、氮上连着碳」的邻接环境。下方为两种粒度的示意写法。
表 2.7-1模板提取半径的特化—泛化权衡(以酰化模板为例)
提取半径模板内容覆盖面误配风险典型角色
半径 0(仅中心)中心原子与改写的键极广:一切酰基转移都命中高:酸酐、碳酸酯、氨基甲酸酯一并命中提示「此处有反应」,难以定前体
半径 1(含一层邻居)中心 + 直接键合原子广:同型底物大多覆盖中:排除无相应官能团组合的底物模板库的常用默认粒度
半径 ≥ 2(多层环境)中心及二层以外环境窄:接近逐例复现低:几乎等价于文献先例反应检索与分类、特化路线复用
警示

粒度没有最优解。半径的选择取决于任务:逆合成要覆盖——漏掉一条可行模板即漏解;反应分类要精度——混入异类反应即错分。同一反应集在不同半径下抽出的模板数量可以相差一个量级。评估任何「基于模板」的方法前,先弄清其模板库的提取口径:半径、原子泛化程度、归并规则;口径不同,数字不可比。

模板因此成为合成可达性(synthetic accessibility)的粗粒度模型:一个分子「可达」,若存在模板链把商业起始原料一步步变换到它;连一步模板都套不上的分子,合成难度大概率偏高。相比逐原子打分的经验规则,模板模型直接对应「已知的化学操作」,解释性强;代价同样明确——模板之外的新化学天然不可达,它只能回答已知问题。

2.7.4 Reaction SMARTS:把变换写成图重写规则

模板怎样落到纸面?答案接回 2.3 节的 SMARTS。Reaction SMARTS 把变换写成一对图模式:左侧模式匹配反应物,右侧模式给出产物,两侧以原子映射号对齐保留下来的原子。左侧被匹配而不带映射号的原子是离去基团,产物中不再出现;右侧不带映射号的原子是新建的。这是一条名副其实的图重写规则(graph rewriting rule):在底物图上找到同构于左侧模式的子图,按右侧模式改写边、重建分子。Daylight 规范中的 SMIRKS 是加了严格对应限制的子集(要求两侧映射原子集一致),工程语境里两词常混用(Daylight 理论手册)。

通配符在规则里扮演 R 基。[#6] 只约束「是个碳」,把骨架其余部分放行;[#6;R] 进一步要求处于环上,[N;H2] 锁定伯胺。通配的深浅逐原子可调,模板的特化程度因此是连续旋钮,而非二选一——2.7.3 节的半径权衡在原子层面重现。举一个整类反应的例子:钯催化的Suzuki 偶联(Suzuki coupling)可写作 [#6:1][B](O)O.[#6:2]Br>>[#6:1][#6:2](钯催化剂与碱入试剂栏):两个芳基片段各贡献一个 [#6],断裂的 C–Br 与离去的硼酸基不带映射号,新生的 C:1–C:2 是唯一的成键事件——一条重写规则压住整类偶联化学。

下面把 2.7.1 节的酯化写成规则并应用于真实底物。四个映射原子全部保留,键的变化只有断裂与生成各一条;两个 [#6] 通配符各锚住一个 R 基。

from rdkit import Chem
from rdkit.Chem import AllChem

# 酯化模板(净变换):C:1–O:3(酸羟基)断裂,C:1–O:4(醇氧)生成;
# [#6:6] 与 [#6:5] 是两个 R 基——通配只约束元素,不约束环境
ester = AllChem.ReactionFromSmarts(
    "[#6:6][C:1](=[O:2])[O;H1:3].[#6:5][O;H1:4]"
    ">>[#6:6][C:1](=[O:2])[O:4][#6:5].[OH2:3]")

acid = Chem.MolFromSmiles("CC(=O)O")    # 乙酸:R 基 = CH3
alc  = Chem.MolFromSmiles("CO")         # 甲醇:R 基 = CH3
prods = ester.RunReactants((acid, alc))[0]  # 左侧模式匹配底物图,右侧模式重建产物
print([Chem.MolToSmiles(p) for p in prods])
# ['COC(C)=O', 'O'] —— 乙酸甲酯 + 水;映射原子全部守恒

把底物换成乙醇,同一规则给出乙酸乙酯——通配符放行了模板视野之外的骨架。两点提醒。其一,模板编码的是净变换:酯化经四面体中间体多步完成,图重写一步到位——模板是计量关系的账本,不是机理的影片,电子推动另有表示体系。其二,右侧模式决定产物的合法性:映射原子照搬属性,重建后仍需通过价键校验;写错的模板会安静地产出错误分子,责任在使用者(Landrum et al., 2026)。

2.7.5 思想源头:Corey 的逆合成分析与 AND/OR 搜索树

模板正向用是预测产物,反向用就是规划合成。思想源头在 Corey:合成设计可以形式化为「目标分子的结构变换」序列(Corey & Wipke, 1969)。1969 年的 Science 论文与 LHASA 程序给出完整设想:图形输入目标分子,计算机沿「感知—策略—变换」循环递归展开候选路线。逆合成分析(retrosynthetic analysis)由此定形:把目标当作可拆解的结构,反复施加切断(disconnection)——逆着一条正向模板断开一根键——得到前体(precursor)集合,直到全部前体落入商业可得的起始原料。切断所得的抽象碎片即合成子(synthon),与前体(真实试剂)相对。

递归展开天然长成一棵 AND/OR 搜索树(AND/OR search tree)(图 2.7-3)。OR 层枚举不同切断——断酯键、换酰源——彼此替代,任选其一即可;AND 层是同一切断要求的前体集合——水杨酸与乙酸酐缺一不可。每个前体又是新目标,递归下探。「找到一条路线」等价于在树中找到一条从根到全部起始原料叶的解路径。

目标分子阿司匹林经两种切断得到前体集合,其中一个前体再递归展开的树形结构 起始原料 中间体 / 目标 OR:任选其一 AND:缺一不可 目标 T:阿司匹林 CC(=O)Oc1ccccc1C(=O)O OR 切断① 酯键:酰基—氧键 水杨酸 可再切断 乙酸酐 起始原料 AND:两个前体齐备才算一条路线 切断② 酯键:酰氯酰源 水杨酸 可再切断(同①) 乙酰氯 起始原料 AND:前体集合共同定义一条路线 递归展开(深度 +1) OR 切断③ Kolbe–Schmitt 羧化 苯酚 CO₂ 两个前体均为起始原料,此分支封叶 搜索树为何爆炸 每个目标平均 b 种切断(OR),每种切断平均 k 个前体(AND), 前体又各自成为新目标——宽度逐层乘 bk。 深度 d 的展开规模 ~ (bk)d;b=3、k=2、d=8:约 1.7×106
图 2.7-3 逆合成的 AND/OR 搜索树(以阿司匹林为例)。根为目标分子;OR 节点(圆)枚举彼此替代的切断方案;每个 AND 组(虚线框)是同一切断所需的前体集合,缺一不可。水杨酸不是起始原料,作为中间体递归展开:Kolbe–Schmitt 羧化把苯酚与 CO₂ 接成水杨酸。找到一条全由起始原料封叶的路径,即找到一条合成路线。

为什么爆炸?分支每层相乘,规模按深度指数增长:

N(d) ≈ (bk)d
(2.7-2)b:每个目标的平均切断方案数(OR 分支);k:每种切断的平均前体数(AND 展开);d:递归深度。b=3、k=2、d=8 时 N ≈ 6⁸ ≈ 1.7×10⁶——不剪枝无法穷举。具体数值见习题 2.7-3。

浅看分支并不凶:每步三五条候选很平常;乘方立刻失控。三层结构性对策沿用至今。起始原料清单提前终止——节点一旦命中库存即封叶;启发式给切断排序——Corey 的战略键分析,优先断出最大结构简化的键;检索算法控制探索次序——蒙特卡洛树搜索是当代版本(Segler et al., 2018)。1969 年设想的框架,今天仍在同一棵树上做文章。

2.7.6 模板作为先验:通向第 4 章

回到表示的主线。第 4 章会遇上「从头逐原子生成分子」的模型:自回归地逐个吐出原子与键。对合成而言,这类模型的输出空间是全部合法分子——绝大多数与已知化学毫无关系。模板给出强得多的先验:把搜索限制在模板库覆盖的变换之内,每一步的产物天然合法、天然有文献先例,逆合成树的有效分支因子骤降。代价同样明确:模板之外的新反应类型永远走不通——先验即天花板。

当代数据驱动逆合成沿两条路推进:模板推荐——学习「对这个目标该用哪条模板」,把庞大的模板库压缩成排序问题;无模板模型——绕开模板直接预测前体图(Segler et al., 2018)。产物预测是同一问题的正向姊妹题:从底物预测反应中心与产物(Coley et al., 2017)。两条路线的较量与融合,留待 4.7 节讨论。

本章至此收束。RDKit 给出的三样东西——分子图、SMILES 与 SMARTS、反应与模板——是后续所有章节的地基:第 3 章在分子表示上训练性质模型,第 4 章把生成与反应变换接起来。带着映射、中心、模板、切断这四个词过去,新章节没有新地基。

习题 2.7-1

已映射的酰胺化反应:[CH3:1][C:2](=[O:3])[OH:4].[CH3:5][NH2:6]>>[CH3:1][C:2](=[O:3])[NH:6][CH3:5].[OH2:4]。(1) 分别列出箭头两侧全部带映射号原子之间的键及键级;(2) 用式 (2.7-1) 求反应中心的键集合;(3) N:6 上的一个氢去了哪里?这对「氢原子是否需要映射」说明什么?

参考解答

(1) 反应物:1–2(单)、2=3(双)、2–4(单)、5–6(单);产物:1–2(单)、2=3(双)、2–6(单)、5–6(单)。(2) 逐对比较:键 (2,4) 由 1 变 0——断裂;键 (2,6) 由 0 变 1——生成;其余键级不变。反应中心 = {C:2–O:4 断裂,C:2–N:6 生成}。(3) N 的一个氢随质子转移落到 O:4 上,成为水的氢。氢原子通常不显式映射:反应中心由重原子键级的变化即可确定,质子的迁移属于机理细节,净变换层面可以省略——这正是「模板是账本不是影片」的一个实例。

习题 2.7-2

对阿司匹林(乙酰水杨酸,CC(=O)Oc1ccccc1C(=O)O)做一步逆合成分析:(1) 指出应切断的键,给出前体集合;(2) 写出对应的正向 Reaction SMARTS 模板(酰氯版),并指出离去基;(3) 该切断对应哪类反应,催化剂与溶剂应放在三段式的哪一栏?

参考解答

(1) 切乙酰基与酚氧之间的酯键(酰基—氧键):前体为水杨酸(邻羟基苯甲酸)与乙酰氯(工业上常改用乙酸酐)。(2) 模板:[#6:1][C](=O)Cl.[#6:2][O;H1]>>[#6:1][C](=O)[O;H0][#6:2]——更简洁的等价写法 [#6:1][C](=O)Cl.[O;H1]>>[#6:1][C](=O)[O]:酚氧保留成为酯氧,Cl 被匹配而无映射号,即离去基;[#6:1] 承载酰基的 R 基,[#6:2] 是芳环上接氧的碳。(3) 酚羟基的酰化;碱(吡啶、三乙胺或 DMAP)与溶剂入中栏试剂,水杨酸与酰化剂入左栏反应物——它们之间的键发生了变化。

习题 2.7-3

设某目标分子递归逆合成中,每个中间体平均有 b = 3 种可行切断,每种切断平均给出 k = 2 个前体,完整展开深度 d = 8。(1) 用式 (2.7-2) 估计搜索树的展开规模;(2) 若起始原料命中使分支平均提前两层封叶,规模降为多少(量级)?(3) 由此说明:为什么实用系统必须把库存检查与打分剪枝放进搜索循环内部,而不是先展开完再过滤?

参考解答

(1) N ≈ (bk)d = 6⁸ = 1 679 616 ≈ 1.7×10⁶。(2) 提前两层封叶相当于有效深度降为 6:N′ ≈ 6⁶ = 46 656,规模缩小 36 倍,仍在万级。(3) 爆炸按指数走,任何「先展开、后过滤」的方案都要先付清指数代价再丢弃大部分节点。把可用性检查与优先级打分做进扩展循环(best-first 或蒙特卡洛树搜索),等于在乘方之前先砍基数与排序——只有在这一层介入,搜索才做得动。习题 2.7-2 的一步切断若在深度 1 就被库存命中封叶,整棵子树根本不会展开。


关键术语

反应 SMILES (reaction SMILES)
「反应物>试剂>产物」三段式的反应文本表示,同侧多组分以点号分隔。
原子映射 (atom mapping)
给反应物与产物中同一原子标注同一编号的标注层,反应信息的真正载体。
反应中心 (reaction center)
键级发生变化的键的集合,由映射逐对比较键级导出。
反应模板 (reaction template)
反应中心加指定半径邻近环境的广义变换,从已映射反应集中提取。
Reaction SMARTS (Reaction SMARTS)
左右图模式加映射对齐写成的变换语言;SMIRKS 是其规范子集。
图重写规则 (graph rewriting rule)
在图中定位同构子图并按模式改写边与节点的产生式规则。
合成可达性 (synthetic accessibility)
以模板链与起始原料库存衡量目标分子可被合成的难易。
逆合成分析 (retrosynthetic analysis)
Corey 的方法学:目标分子经反复切断回溯至起始原料。
切断 (disconnection)
逆合成中逆着正向模板断开一根键的操作,前体集合由此产生。
合成子 (synthon)
切断所得的抽象碎片,与实际使用的前体试剂相对。
AND/OR 搜索树 (AND/OR search tree)
OR 枚举替代方案、AND 汇聚前体集合的递归搜索结构。

参考文献与延伸阅读

  1. Corey EJ, Wipke WT. 1969. Computer-assisted design of complex organic syntheses. Science 166:178–192.
  2. Daylight Chemical Information Systems. Daylight Theory Manual: Reaction SMILES and SMIRKS. Daylight 官方理论文档.
  3. Schneider N, Lowe DM, Sayle RA, Landrum GA. 2015. Development of a novel fingerprint for chemical reactions and its application to large-scale reaction classification and similarity. Journal of Chemical Information and Modeling 55:39–53.
  4. Coley CW, Barzilay R, Jaakkola TS, Green WH, Jensen KF. 2017. Prediction of organic reaction outcomes using machine learning. ACS Central Science 3:434–443.
  5. Schwaller P, et al. 2021. Extraction of organic chemistry grammar from unsupervised learning of chemical reactions. Science Advances 7:eabe4166.
  6. Segler MHS, Preuss M, Waller MP. 2018. Planning chemical syntheses with deep neural networks and symbolic AI. Nature 555:604–610.
  7. Landrum G, et al. 2026. RDKit Documentation: Chemical Reactions; Reaction Fingerprints. RDKit 官方文档,2026.03 系列.