酶改造-酶功能大模型与SMILES表征

简化分子线性输入规范(Simplified Molecular Input Line Entry System,SMILES)单行 ASCII 字符串描述小分子(及可表达的部分聚合物片段)分子图(原子、键、芳香性、支链等),是化学信息学里最常用的「可机读结构」之一。酶学机器学习里,酶功能/动力学大模型若要同时吃「蛋白质序列」与「底物化学结构」,通常会把底物统一成 SMILES(或由其派生的分子图),再经 Transformer图神经网络(Graph Neural Network,GNN)指纹 等编码,与 蛋白质语言模型(Protein Language Model,PLM) 支路对齐。本文只做脉络整理,不展开各模型公式。

段末注释SMILESInChI 等同为标识符体系,SMILES 更短、便于当「序列」喂给字符级模型;GNN 在分子上常以原子为节点、化学键为边。


1. 为什么在「酶 + 大模型」里总看到 SMILES?

需求 SMILES 能提供的 局限(工程上常踩坑)
底物结构氨基酸序列拼在同一套深度学习管线里 一维字符串,易与 ProtT5 / ESM 等「序列模型」并列为两条支路 同一结构可有多种合法 SMILES(需 canonicalize 规范化)
与公开数据库对接 PubChemChEBIKEGG 等常提供或可转换 SMILES / CID 溶剂合物多组分(见 §4
下游任务:kcat、Km、选择性等 结构决定相互作用,比「底物名称字符串」可泛化 金属配位大肽底物等,SMILES 未必是唯一或最佳表示

一句话:SMILES 是「底物分支」的通用输入语言酶分支则多为 PLMCNN/n-gram 序列编码。


2. 典型信息流(双支路)

1
2
3
4
5
底物 SMILES → [RDKit 解析] 或 [Tokenizer] → 分子图 / SMILES 字符序列

底物嵌入(Transformer / GCN / 指纹)

与酶向量拼接/融合 → 读出头(kcat、Km、…)
  • 序列式 SMILES 模型:把 SMILES 当字符序列,用 Transformer 编码(如 UniKP 中的 SMILES Transformer)。
  • 图式模型MolFromSmiles原子/键特征 + 邻接矩阵GCN / GAT(如 DeepEnzyme 底物支路;DLKcatGNN 作用于分子图,图由 SMILES 派生)。

段末注释GCN 为图卷积网络;GAT 为图注意力网络;RDKit 为开源化学信息学工具包。


3. 代表工作一览(与 SMILES 的关系)

工作(常见简称) 底物侧如何用 SMILES 酶侧 站内长文
UniKP SMILES Transformer(预训练),字符级嵌入 + pooling 拼成 1024 维分子向量,与 ProtT5 酶向量拼接 ProtT5-XL-UniRef50 嵌入 酶改造-modelpaper-UniKP
EF-UniKP 同上 + 环境因子(pH、温度等)重加权扩展 同上 同上
DeepEnzyme SMILES → RDKit 分子对象指纹 + 分子图 GCN Transformer(序列)+ 蛋白接触图 GCN(结构) 酶改造-modelpaper-DeepEnzyme
DLKcat 底物 SMILES → 分子图 → GNN 序列 CNN(n-gram) 可对照 Nature Catalysis 原文与 Tamarind DLKcat
TurNuP 文献中常以 SMILES/InChI 统一底物(具体以各文 Methods 为准) 多样 可在 酶改造-03 数据篇交叉检索

段末注释EF-UniKP 为 UniKP 的环境因子扩展版;TurNuP 为另一套 kcat 预测代表工作,底物编码方式以论文为准。


4. 数据与清洗:做数据集时建议统一规则

以下与 UniKP 等文剔除规则及常见实践一致,便于复现与对齐。

  1. 规范化:同一底物尽量用 RDKit MolToSmiles(MolFromSmiles(s), canonical=True) 得到 canonical SMILES,减少「字符串不同、分子相同」带来的伪多样性。
  2. 多底物/反应混合物SMILES 中用 「.」 分隔的多组分(如辅因子、双底物未写成反应式)在监督学习里常被整条剔除拆分为多任务,需在论文/README 中显式声明(UniKP 对含 「.」 样本的处理见站内 UniKP 文)。
  3. 稀有氨基酸 / 非标准片段:蛋白质侧用 X 等约定;小分子侧对无法解析的 SMILES 应丢弃或手工策展。
  4. 立体化学:若任务对手性敏感,需在 SMILES 中保留 @ / @@ 等标记,并在划分训练/测试时避免数据泄漏(同一不同 SMILES 写法的重复)。

5. 与其它分子编码的并列(可选)

表示 特点 在模型中的常见用法
SMILES 紧凑、序列化友好 TransformerRNN、字符级 tokenizer
SELFIES 语法上更「可合法化」,利于生成式模型 部分生成/设计工作流
分子图(原子为节点) 与化学键拓扑一致 GNN(输入常由 SMILESSDF 解析)
Morgan 等指纹 固定长度向量 传统机器学习 + 轻量深度模型

酶功能「大模型」语境下,SMILES 仍是数据交换与复现事实标准;真正进网络的是 SMILES 派生的张量(嵌入或图)。


6. 实践实例:从 SMILES 与条件到张量(Python)

以下用乙醇为底物、pH温度为条件,演示与 §2 一致的管线:规范化 SMILES底物向量(序列嵌入池化 / Morgan 指纹 / 图张量)→ 条件向量拼接。依赖:RDKit(化学信息学工具包,常用 RDKit 指代)与 PyTorch(深度学习框架,PyTorch)。安装示例:pip install rdkit torch

段末注释PyTorch张量(tensor) 即多维数组;下文维度与 UniKP1024 维不必强行一致,重在流程可复现

6.1 场景与目标

项目 取值(示例)
底物 乙醇,原始 SMILES 可写 CCOC(C)O
条件 pH = 7.4,热力学温度 T = 298 K(约 25 °C)
目标 得到可供 MLP 读出头的 底物向量 s条件向量 c 及拼接示例 z

6.2 步骤 1:规范化 canonical SMILES

同一分子多种写法时,用 RDKit 统一为 canonical SMILES,与 §4 一致。

1
2
3
4
5
6
7
8
9
10
from rdkit import Chem

raw_smiles = "C(C)O" # 与 "CCO" 等价的一种写法
mol = Chem.MolFromSmiles(raw_smiles)
if mol is None:
raise ValueError("无法解析 SMILES")

canon_smiles = Chem.MolToSmiles(mol, canonical=True)
# 乙醇常见输出: "CCO"
print("canonical:", canon_smiles)

6.3 步骤 2A:序列式——字符 idEmbeddingmean pooling

UniKPSMILES Transformer 同型:字符序列 → 嵌入 → 编码器(此处用池化代替预训练 Transformer 以减小依赖)。生产环境应替换为预训练SMILES Transformer 与论文一致词表。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import torch
import torch.nn as nn

# 词表:当前分子字符 + 常见 SMILES 字符(真实项目应从全库统计)
charset = sorted(set(canon_smiles) | set("CNOSPFclBrI@+-=#$%0123456789()[]\\.:/"))
stoi = {c: i + 1 for i, c in enumerate(charset)} # 0 保留给 padding
pad_idx = 0

ids = torch.tensor([stoi[c] for c in canon_smiles], dtype=torch.long)
emb = nn.Embedding(num_embeddings=len(stoi) + 1, embedding_dim=256, padding_idx=pad_idx)
torch.manual_seed(0)
# (L, d_model)
x = emb(ids)
s_seq = x.mean(dim=0) # mean pooling -> 底物向量 s_seq ∈ R^256
print("s_seq shape:", tuple(s_seq.shape))

6.4 步骤 2B:指纹式——Morgan 指纹 固定维向量

DeepEnzyme 等路线常用 SMILES → Mol → 指纹,得到固定长度二值或浮点向量,便于与传统机器学习或浅层网络拼接。

1
2
3
4
5
6
7
8
9
import numpy as np
from rdkit.Chem import AllChem
from rdkit.Chem import DataStructs

n_bits = 2048
fp = AllChem.GetMorganFingerprintAsBitVect(mol, radius=2, nBits=n_bits)
s_fp = np.zeros((n_bits,), dtype=np.float32)
DataStructs.ConvertToNumpyArray(fp, s_fp)
print("s_fp shape:", s_fp.shape, "sum(bits):", int(s_fp.sum()))

6.5 步骤 2C:图式——邻接矩阵与节点标量特征(供 GNN 使用)

DLKcat 等:SMILES 解析为 Mol 后构造分子图。此处仅导出 PyTorch 可用的 节点特征邻接GNN 前向需另写 torch_geometric 或自实现消息传递。

1
2
3
4
5
6
7
8
9
10
11
import numpy as np
from rdkit.Chem import rdmolops

n = mol.GetNumAtoms()
# 节点特征示例:原子序数归一化(真实工作常用 one-hot 原子类型、价、芳香性等)
node_feat = torch.zeros(n, 1, dtype=torch.float32)
for i in range(n):
node_feat[i, 0] = mol.GetAtomWithIdx(i).GetAtomicNum() / 100.0

adj = torch.from_numpy(rdmolops.GetAdjacencyMatrix(mol).astype(np.float32))
print("node_feat:", tuple(node_feat.shape), "adj:", tuple(adj.shape))

6.6 步骤 3:反应条件数值化与拼接

pHT 不来自 SMILES,需单独特征;下列线性缩放仅为演示(与 EF-UniKP 等论文中的具体归一化以原文为准)。

1
2
3
4
5
6
7
8
9
ph, T_k = 7.4, 298.0
# 演示用缩放,非文献唯一标准
c = torch.tensor(
[(ph - 7.0) / 2.0, (T_k - 273.15) / 50.0],
dtype=torch.float32,
)
# 与序列底物向量拼接,供下游 MLP(酶向量 e 可同理拼接)
z_demo = torch.cat([s_seq, c], dim=0)
print("c shape:", tuple(c.shape), "z_demo (s_seq||c) shape:", tuple(z_demo.shape))

6.7 单脚本串联(可选)

6.2–6.6 置于同一 if __name__ == "__main__" 中时,须共用同一个 mol(由 6.2 解析得到),并按顺序执行;6.3 依赖 6.2canon_smiles6.4–6.5 依赖 6.2mol

段末注释mean pooling 为对序列维求平均;Morgan 指纹RDKit 中默认 ECFP 类圆形指纹的一种实现。


7. 小结

  • SMILES 在酶功能/动力学模型里几乎总是底物(或底物侧)的入口表示,与 PLM 负责的酶序列并列。
  • UniKPSMILES TransformerDeepEnzyme / DLKcatSMILES → 图/指纹——选型取决于是否要显式图结构可解释性
  • 工程关键canonical 化多组分处理立体化学一致性
  • 实践§6 给出从 RDKit 解析到 PyTorch 张量的可运行骨架;替换预训练编码器即可对齐文献级模型。

8. 延伸阅读(检索关键词)

  • enzyme kcat prediction SMILES, SMILES Transformer Honda, UniKP ProtT5, DLKcat molecular graph, RDKit canonical SMILES enzyme
-------------本文结束感谢您的阅读-------------