这两年大家都在聊大语言模型,但真正让它扎进硬核科学问题里的思路,其实比想象中更朴素:别急着让模型背化学知识,先想清楚它最适合干哪种脏活累活。这篇发表在 Nature Machine Intelligence 的工作,就把一个让计算化学家头疼多年的问题——分子可合成性优化,改写成了一种让大语言模型输出“编辑序列”的形式,再用可合成性指标作为反馈,让模型自己学会怎么一步步改造分子结构。换句话说,不是拿模型去凭空生成一个完美分子,而是让它告诉你:从这个化合物出发,依次做哪几步化学编辑,最终能改出一个既保持活性、又更容易做出来的分子。
这条路线对我这种常年跑分子生成模型的人来说,第一反应是“对啊,问题本来就该这么表达”。合成化学里没有“一步到位”的魔法,只有一连串可执行的操作:这里加个甲基调节脂溶性,那里换掉一个麻烦的杂环,再把空间位阻调一调。把这些操作排成序列,让模型去规划最优顺序,逻辑上天然自洽。下面我把这个工作的核心思路、复现过程中需要死磕的细节,以及我踩过的坑,按我自己的理解完整拆一遍。
1. 先搞懂它在解决什么问题:可合成性为什么是瓶颈
1.1 打分容易,给出修改路径难
做药物发现的人对这一幕应该都不陌生:虚拟筛选跑出来一批活性很高的分子,对接分数漂亮,ADMET性质预测也不错,结果合成同事看了一眼结构就说“这个我做不出来,中间那步要过硅胶柱三回还得碰运气”。这其实就是分子生成领域最尴尬的裂缝——生成模型擅长在化学空间里翻花样,但生成出来的东西经常偏离可合成范围。
长期以来,大家处理可合成性问题主要靠打分函数。SA score 也好,RA score 也好,本质都是给一个分子打一个“好不好合成”的分数,数值越低越容易合成。这种打分有个天然局限:它只给你一个结果,不给你路径。就像教练告诉你“你动作不标准”,但没说清楚是脚踝发力不对还是膝盖内扣。对下游工作来说,真正需要的是“怎么改才能更可合成”,而不是验收的时候拿个分数说“不过关”。
这篇文章抓的点就在这:不满足于给一个可合成性分数,而是训练模型输出一整套具体的编辑动作序列。每个动作都是真实可映射到分子图上的化学变换,比如把某个苯环替换成吡啶、给某个位点加一个氟、断开一根易水解的酯键。模型不能只给出“最终目标分子长什么样”,还得给出一条能走通的逐步修改计划。
1.2 编辑序列把“优化”变成“多步规划”
“编辑序列”这个词听起来玄,其实类比一下就好懂了。比如你要装修一套老房子,理想的 AI 辅助不是直接甩给你一张“完美户型图”,而是告诉你:下周先拆掉客厅和厨房之间的非承重墙,再把阳台窗户封起来,最后换掉入户门的位置。每一步看起来都不大,但按这个顺序做完,房子就变成了你想要的样子。
分子优化同理。我们手里有一个起点分子,它有活性但合成路线太长;目标是另一个分子,活性更好或者合成更简单。以前有两种粗暴做法:一种是直接让生成模型产出目标分子,不管中间过程;另一种是做逆合成分析,把目标分子拆成买得到的片段,但逆合成只解决“怎么合成目标分子”,不解决“活性怎么改”。
把两种需求拼接起来看,就能理解编辑序列的价值。它把活性优化动作和可合成性优化动作统一在同一个序列里:先做一步骨架替换,再做一步官能团简化,最后调整一下手性中心构型。每一步单独拿出来都是一次合理的化学操作,连起来就成了一条可以执行的“施工计划”。模型需要学习的不是静态分子分布,而是多步决策策略——在每一步选择动作时,同时考虑当前分子的活性、可合成性以及后续动作的空间。
1.3 为什么选大语言模型而不是图神经网络
这个问题背后其实是序列化表达的天然优势。分子可以表示为图,但图上操作的组合空间不容易离散化;而一个“编辑序列”天然是 tokens 序列,这正好落进语言模型的射程。把每一个编辑动作编码成 token,把起始分子编码成上下文,模型要做的就是自回归地预测接下来的动作 token。语言模型对长序列依赖的处理能力,恰好能担得起“前面改了杂环、后面会影响取代基位置”这种跨步骤约束。
当然,我不是说图神经网络不行。图模型在分子表征上的强项依然能打,但到了“多步编辑路径生成”这个任务上,它得额外设计一个动作解码器,还得处理图编辑的循环依赖,工程复杂度高不少。语言模型直接把问题简化成了“序列生成”,加上这些年 Transformers 在长上下文上的积累,训练和推理的工具链都成熟,落地成本低很多。坦白说,这篇工作选 LLM 不是因为它能记住多少化学知识,而是因为**“多步规划”这个任务形态,恰好长在语言模型的能力半径里**。
2. 核心方法拆解:怎么让模型输出一份可用的编辑序列
2.1 编辑动作怎么 token 化
动作空间的设计,是整个系统能不能跑通的第一个分水岭。我见过不少复现卡壳的案例,问题都出在动作定义太随意——有人直接把整段 SMILES 作为“编辑单元”输入,结果模型输出一堆语法正确但化学上完全畸形的变体。
这一类工作里,比较合理的做法是把动作定义成原子和片段级别的变换,每个动作都对应 RDKit 能执行的修改。常见动作类型包括:
- 原子替换:把某位点的原子类型替换(比如 C → N),附带氢原子数的自动修正
- 片段插入/替换:在特定连接点插入常见基团,如 -F、-OCH₃、-CF₃,或者替换整个芳香环
- 键级调整:单键调双键、双键调单键,需要保证价键规则
- 断键/成键:断开一个连接位点或者新建一个桥环连接
- 立体化学翻转:修改手性中心构型,适用于活性构象相关的优化
把这些动作做成一整套受控词汇表后,每个动作 token 背后绑定一个实际可执行的分子编辑函数。这样不论模型怎么生成序列,最后一步都会经过化学合法性校验,非法动作直接拦截。这个设计很关键——它相当于给模型加了一层“语法海怪”,不允许它在语法层面胡言乱语,只能犯“化学策略”层面的错误。
token 化时还会涉及定位信息。分子总不能只有一个全局动作,得告诉模型“改哪个位置”。做法上通常是先给分子做一次子结构匹配,把修改位点编号,动作 token 里带上位点索引。不过要提醒一句:位点跟着骨架走,一旦序列前面已经替换过片段,位点编号也会变。处理不好会出现“改了一个被删掉的位点”这种矛盾,所以实现时必须在每一步执行后重新算分子图和位点映射。
2.2 奖励反馈:可合成性不是一个数字那么简单
如果只看最终的 SA score 来给模型打分,训练出来大概率是个“刷分机”。这个坑后面细说,先谈怎么设计一个不太容易被钻空子的奖励组合。
一个可用的奖励函数至少包含几块:
- 活性预测评分:由外部预测器给出,模型是为了它才做优化的
- 可合成性评分:SA score、RA score 或逆合成置信度,可以加权组合
- 结构相似性约束:用 Tanimoto 相似度衡量编辑序列产物与起始分子的距离,防止模型一步改到完全无关的分子来投机取巧
- 合法性惩罚:每一步执行失败或最终分子校验失败,直接给负奖励
我记得有不少工作还往奖励里加了药化规则过滤,比如 PAINS 警报、过度卤代的惩罚,否则模型很容易发现“多加几个氟原子 SA score 会变低”这种讨巧路径。
这里有个实操心得:奖励函数尽量设计成“相对提升”而非“绝对数值”。因为不同活性预测器出来的分值范围完全不一样,直接叠加数值容易让某一项特别大的权重主导训练。更稳的做法是,每一步计算当前分子和起始分子的奖励差值,让模型学会的是“编辑后比编辑前好”,而不是单纯追一种绝对值。这个细节对收敛稳定性影响很大。
2.3 训练流程:先从模仿开始,再用强化学习收敛
直接从随机策略开始强化学习,大概率训练十天半个月还在原地打转。这类工作的通用套路是分两阶段:先用监督学习做一个“像样”的初始化,再用强化学习去拉高奖励。
第一阶段是模仿学习。从已有的合成化学数据里挖出真实的分子改造案例,例如从一个先导化合物到一个上市药物的已知优化路径,把这些“起点分子 → 编辑序列 → 终点分子”三元组拿去训练模型。目标是让模型先学会说化学家听得懂的“化学语言”,而不是等强化学习从零去试。没有这个阶段,模型连合法的编辑序列都生成不利索,后面奖励信号再准也没用。
第二阶段才是强化学习。常见做法是用策略梯度类的方法,把模型当作策略网络,输入起点分子,输出一整段编辑序列,然后用上面组合出来的奖励函数评估终点分子,再把回报回传。为了防止模型在强化阶段彻底忘掉第一阶段学到的基本规则,会在损失函数里加一项 KL 正则,让模型不要偏离初始策略太远。这个技巧几乎是标配,不加的话训练后期容易“奖励膨胀但结构全面退化”。
在算力受限的环境里,还有一个折中方案:不用完整强化学习,而是用模仿学习配合 beam search 做推理时搜索。也就是训练好一个编辑策略后用波束搜索同时展开多个候选序列,每个候选走完再打分排序。这样做虽然理论上不如强化学习端到端最优,但工程实现简单,而且效果在很多任务上已经能满足需求。我觉得可以先从这个版本跑通,再往上加强化学习。
3. 复现时真正要下功夫的几个环节
3.1 动作空间别贪大,先做能约束的
我见过有人一上来就把动作空间切得特别细,原子级替换来一套、官能团变换来一套、立体化学又来一套,结果模型训练难度翻倍。动作空间大意味着 token 种类多、输出分布宽,在小数据量下很难学出可靠策略。
我的建议是分阶段扩展。第一版先做一个中等规模的动作集,大概覆盖常见官能团替换和原子替换就够用。等 pipeline 跑通、验证奖励函数稳定后,再往里面加复杂动作。动作集的选择还要考虑数据覆盖率:如果某个动作在训练集里连几十次都没出现过,模型基本学不会它,不如先砍掉。
另一个容易踩坑的地方是动作冲突处理。比如序列里第一步在某个位点插入了甲氧基,第二步想在这个位点替换杂原子,此时位点其实已经变成甲氧基的一部分。简化处理是在当前分子里重新做子结构匹配,匹配不到就跳过这一步,但跳过后要重新计算后续位点偏移,不然整个序列会越编越乱。这一步实现时多花点时间,后续会省掉大量麻烦。
3.2 模型选型与训练超参
模型结构不用太花哨,基于分子 SMILES 或者 SELFIES 预训练的 Transformer 编码器-解码器框架基本够用。编码器读入起点分子序列,解码器逐步输出编辑动作。如果想把任务做得更可控,可以在编码器中额外加入一个“优化目标描述”字段,比如“降低 SA score 并保持活性不低于 0.5”,让输入变成指令式的。
训练超参这块有几条比较实在的经验:
- 学习率:监督微调阶段可以放在 1e-4 到 3e-4,强化学习阶段要降到 1e-5 左右,否则策略变化太猛,KL 正则根本拉不住
- batch size:受限于分子序列长度,batch size 不用开特大,16 到 32 够用,但强化学习阶段为了让奖励信号稳定,梯度累积步数可以适当加
- 序列长度上限:编辑序列一般限制在 10 到 20 步就够了,太长的序列会带来两个问题:推理时 beam search 开销指数增长;奖励稀疏性加剧,因为只有到最后才能评估结果
还有一个小细节:起点分子输入前最好统一做标准化处理,去盐、中和电荷、规范立体化学表达。否则同一个分子可能有多种 SMILES 写法,模型会浪费容量去学习这种无意义的表示差异。
3.3 评测指标,别被一个 score 骗了
这类工作最容易出现的情况是模型在训练集上的奖励分数一路飙升,但拿给合成化学家一看,出来的分子还是“纸上谈兵”。所以评测指标一定要多层交叉验证。
我的建议是至少看四个维度:
| 评测维度 | 常用指标 | 注意点 |
|---|---|---|
| 有效性 | RDKit 可解析率、价键合法率 | 必须保持接近 100%,否则说明动作约束有漏洞 |
| 定向优化成功率 | 满足活性阈值和 SA 阈值的目标分子占比 | 别只看 top-1,要看 top-50 里的占比 |
| 可合成性可信度 | SA/RAScore 之外,再用逆合成分析器做完整路线评估 | 便捷分数高不代表真实路线存在 |
| 结构多样性 | 骨架类型数量、Tanimoto 距离分布 | 防止模型围着一个骨架疯狂微调 |
特别想强调第四点。模型很容易钻进死胡同:找到一个局部最优骨架后,后续所有编辑都在这个骨架周围打转,最终输出 top-100 里全是同一家族结构。多样性指标没盯着,审稿人随便抽几个结构就能看出问题。更严格的做法是让合成化学家对抽出的结构做一轮人工评估,打分表上包含路线长度、原料可得性、反应可靠性。这个工作里模型输出的是“序列”而不是“单个分子”,本来就更方便专家去阅读和判断,人工评估门槛并不高。
4. 踩坑实录:这些问题我基本都遇到过
4.1 分子有效性塌方
第一次跑通训练 pipeline 的时候,我兴冲冲地看生成结果,结果发现 RDKit 解析失败的分子占了差不多 30%。后来查日志,问题出在编辑函数的容错处理上:模型预测的动作是“在原子 5 和原子 7 之间新建一个键”,但执行条件没检查这个键是否已经存在、两原子距离是否合理、价电子是否允许。
后来加了几道硬校验才算稳定:每执行一步动作前先检查原子映射是否存在,动作执行后立即 sanitize 一次分子,失败就整体回滚到上一步状态。不要想着用概率手段掩盖非法动作,该拦截就拦截,该回滚就回滚,有效性才会稳定在 99% 以上。
4.2 模型钻奖励的空子
这是最让人头大的问题。奖励函数设计得再好,模型也能嗅到漏洞。我遇到的一次情况是:模型开始大范围引入溴原子。代进去看,SA score 确实降了,因为溴代物在某些打分规则里被当成了“常见商业片段”,但药化上溴代总是有代谢稳定性隐患,而且多溴化合物的合成后处理也不干净。
这就是典型的“奖励短视”问题。后来我为卤素原子数量加了额外惩罚项,并且调整了 SA score 权重,情况才好一些。这类问题没有一劳永逸的解法,只能在实验过程中不断检查生成物分布,用统计手段发现“模型在刷什么特征”,再动态调整奖励函数。说白了就是跟模型打攻防战。
4.3 稀疏奖励训不动
大部分编辑序列跑完,活性分数可能根本没变化。奖励全是零,模型策略梯度为零,训练就成了空转。我试过降低活性预测器的阈值,让更多分子“看起来有提升”,但代价是模型改进方向变得很模糊。
最终有用的办法是课程学习。先把奖励简化成只看可合成性优化,让模型学会“把一个难合成分子改简单”的基本能力,此时序列短、奖励相对密集。等这一步稳了,再引入活性预测器,开始联合优化。这样分两阶段训练,比从第一天就上完整奖励可靠得多。顺便说一句,这种思路和人类学习很像:先学基础操作,再学策略判断。
4.4 长序列与搜索成本的平衡
规则上把编辑序列限制在 20 步以内,但实际推理时 beam search 的宽度加深,计算成本感人。我试过 beam size 从 8 加到 32,多样性好了不少,但推理时间直接涨了几倍。在这个任务上,list 里比较现实的配置是 beam size 16 左右,长度控制在 15 步以内,再配合“提前终止”:如果连续几步的中间分子奖励没有再提升,就不再往下搜索了。这个技巧能省一多半算力,质量下降不明显。
5. 这个思路能往哪里用
5.1 药物发现里的苗头优化与骨架跃迁
最直接的落点是药物发现流程里的 hit-to-lead 阶段。传统做法是药化专家盯着先导化合物结构,手动尝试各种类比物设计,费时费力。编辑序列模型可以批量给出多条修改路径,专家只需要审阅这些路径,挑出靠谱的去验证。因为模型输出的是可解释的多步编辑计划,而非一个黑箱结构,专家的介入成本很低——看一眼就知道这条路线想干嘛,哪些步骤合理,哪些步骤不靠谱。
骨架跃迁是特别值得期待的方向。编辑序列天然包含“替换杂环片段”“重新连接环体系”这类操作,模型如果学会跨骨架规划,就能在保持活性的前提下跳出原专利覆盖范围。很多团队真正想要的就是这种能力,而不是微调几个取代基的程度。
5.2 更广的分子领域:材料、农化
不要只看药物发现。农化分子的优化也存在同样痛点:先导发现后要做的结构修饰、可合成性评估、多目标权衡,和药物化学如出一辙。材料领域里,某些发光分子或电子传输分子对纯度、合成路径的敏感度甚至比活性还高,一个漂亮的核心骨架如果第一步就合成不出来,后面都是空谈。
这类领域的好处是分子数据没有那么大但筛选成本更高,模型编辑序列的输出能帮材料科学家快速聚焦到“值得试的核心骨架”,而不是在传统试错里耗几个月。我觉得这个方向未来会扩散得比药物发现更快,因为材料领域的实验验证成本更贵,对“少走弯路”的需求更迫切。
5.3 它不会取代化学家,它提供的是可讨论的路线草案
看得多了会发现,这类模型最强的部分永远是生成假设,最弱的部分永远是构造世界知识模型。真实合成中还有催化剂配体选择、溶剂效应、反应浓度、纯化难度,这些很难在一套通用打分函数里完整表达。所以别指望模型输出一条“绝对正确”的路线,而要把它当成一个高产的助手,在几秒内提出几十条候选路径,再用化学家的经验去过滤和修正。
复盘这篇工作,我最大的感受是:把问题表达成语言模型擅长的形态,比堆模型结构重要得多。分子编辑序列这个角度,让模型既发挥了长程规划能力,又把每一步动作变得可执行、可回溯、可讨论,这才是深度学习方法落到化学问题里的正确姿势。我自己之后再做分子优化,应该不会再优先考虑“直接生成终态分子图”了,换成这种多步编辑的形式,至少和化学家的对话会顺畅十倍。
如果你也想复现一条类似的技术路线,我建议从“动作空间 + 奖励函数 + 分阶段训练”这三个点起步,先别管模型参数多大、网络多深。把动作约束做到位、奖励设计到不钻空子、监督初始化到能说化学语言,后面的强化学习和 beam search 都只是锦上添花。真把这三点打磨扎实,你大概率已经能跑出一个让人眼前一亮的原型了。