想象你给朋友写一张寄往远方的信件地址:口头告诉朋友怎么走,是“出门右转,第二个路口左转,看见红色招牌就到了”——这像 SMILES,简单随意;邮局的标准址单则是“国家/城市/街道/门牌号”逐层填写,绝不产生歧义——这像 InChI;而乐高积木式的模块地址,每块自带接口,怎么拼都不容易崩坏——这像 SELFIES。今天,我们就用这三种“地址语言”来理解分子表示:它们都是把分子这座“微型城市”转成计算机能读写的字符串。读完你会明白,为什么同一分子会有三种写法,又该如何为你的 AI 分子建模项目选择合适的“城市地址簿”。
掌握 SMILES、InChI、SELFIES 三种编码的语法、唯一性、可逆性与适用场景,是构建可靠可维护的 AI 药物发现解决方案的基础能力。
可视化演示
对比SMILES、InChI、SELFIES三种分子字符串编码的语法结构与AI生成鲁棒性。
本节配有交互动效(进入视口后自动加载,约 3KB)。
三种分子编码对比 SMILES:简洁非唯一 InChI:标准唯一 SELFIES:100%有效 AI生成友好
化学信息学基础
如果把一个分子想象成一座微型城市,原子就是城市里的市民,化学键则是连接市民之间的道路。AI 没有眼睛,它不认识这座城市的实物,但它认识字符串。要让 AI 处理分子,第一步就是为城市创建一套“地址系统”——把三维结构转成一串机器可读的字符。这套转写方法,就是化学信息学中的分子表示。
从技术的角度看,分子首先是一张图:图中的每个顶点代表一个原子,每条边代表一种化学键。我们不必关心这张图在三维空间怎么旋转、怎么摆放,只需要知道“谁和谁相连、是单键还是双键”。于是,在编码之前,分子先被抽象为一张无向图,这是所有字符串编码的共同出发点。
无论 SMILES、InChI 还是 SELFIES,本质上都是在同一张分子图上做“讲故事”式的旅行。它们之间的差异,就像同一座城市可以有不同的地图语言:有人用口述,有人用行政区划,有人用拼搭积木。
- 理解顶点集合 VV 是图中所有原子的集合。一个分子有多少个原子,V 里就有多少个成员,相当于城市里需要登记的所有市民。
- 理解边集合 EE 是图中所有化学键的集合。每条边连接两个顶点,代表它们之间存在一条“握手关系”。
- 组合成完整分子图把 V 和 E 放在一起,就得到完整的拓扑图 G。字符串编码的核心目标,就是把 G 无损地压缩成一维符号串。
SMILES:口头指路式编码
SMILES 像朋友给你口头指路:“走到 C 路口,遇见了氧巷子,再往前走一步就到了。”它短小、直观、能手写,是化学信息学里最像“日常口语”的地址方式。SMILES 全称是 Simplified Molecular-Input Line-Entry System,它的目标不是规范化,而是快速、可逆地把分子图写成一行字符。
SMILES 的语法很朴素:原子用元素符号书写,单键一般省略,双键用 =、三键用 #;如果从一个原子上分出多个分支,就用半角括号把分支包起来,例如 CC(=O)O 表示乙酸;如果分子中有环,则用数字标记“回到哪个原子闭合”,例如 C1CCCCC1 表示环己烷。
要理解环闭合,我们需要一个重要的图论结论:树形结构没有环,每增加一条“多余”的边就会多出一个环。于是,环的数量可以由顶点数和边数直接推算:
SMILES 就像口头指路:你可以从市中心出发,也可以从郊外出发,路线不同但城市相同。因此它足够灵活,却也容易让同一个分子出现多种字符串写法——这为后续的数据库去重和机器学习带来了麻烦,但也奠定了它在人工书写和教学场景中的不可替代性。
- 顶点数 VV 是分子图中的原子个数,对应口述路线中的路口总数。
- 边数 EE 是化学键个数,对应城市道路的长度。每一条键都连接两个原子。
- 计算环数 R树状结构满足 E = V - 1,因此 R = 0;当多出一条边时,R 就增加 1。
InChI:标准邮政地址
如果说 SMILES 是朋友间的口头指路,那么 InChI 就是邮政部门印发的标准地址单。无论你从城市的哪个角落出发,最终填出来的地址都是“国家 / 城市 / 街道 / 门牌号”这样的固定层次,一次填写,全国统一。InChI(International Chemical Identifier)由 IUPAC 制定,目标是给出一种不依赖书写顺序、全球唯一的分子标识。
InChI 是分层的字符串,每一层用斜杠分隔:第一层是化学式层,例如 C2H4O2;后面依次是连接层、氢层、电荷层、立体化学层等。它的一个典型示例是 InChI=1S/C2H4O2/c1-2(3)4/h1H3,(H,4,3),其中 1S 表示标准版 InChI,C2H4O2 是分子式层,之后每一层都从不同角度补充分子结构信息。
分子式层直接告诉我们每种元素的原子数量,这正是计算摩尔质量的输入。按每种元素的原子数乘以其原子量再求和,就得到了分子的摩尔质量:
InChI 的优势是“标准”:不论你从哪个顺序书写分子图,最终生成的标准 InChI 都完全一致。就好比世界上只有一门标准邮政地址,不必担心同名街道造成的误会。因此,跨数据库合并、专利排重这些任务都喜欢用它来当分子的“身份证号”。
- 确定元素种类i 遍历分子中出现的每种元素,比如碳、氢、氧。
- 读取原子数n_i 表示第 i 种元素在分子式层中的原子个数。
- 提取平均原子量A_i 是该元素的相对原子质量,通常查元素周期表得到。
- 累加求和将每种元素的质量贡献相加,得到分子量 M。
SELFIES:乐高积木式编码
SELFIES 让我想到乐高积木:每一块积木自带接口,无论你怎么打乱排列,它们仍然能拼起来,不会出现“这块插不进去所以整个模型崩溃”的情况。SELFIES(Self-Referencing Embedded Strings)正是为了机器学习而设计的分子编码——它希望生成模型每吐出一个令牌,都不会造成语法灾难。
SELFIES 的每个令牌都是一对方括号包裹的单元,例如 [C]、[O]、[=Branch1]、[Ring1]。解码器依次消费这些令牌,把令牌翻译成原子、键、分支或环闭合指令。由于令牌自带括号并定义了自身的派生含义,即使序列被打乱,解码器也能跳过无效内容,保证最终输出仍然是一个可以被完整解析的分子字符串,而不是一个半路崩掉的废串。
从形式上看,SELFIES 字符串就是一系列令牌的拼接:
SELFIES 就像一套设计精良的积木,模型在生成时不需要担心“拼错了就塌方”的问题。因此,在基于强化学习的分子生成、进化算法改造分子等任务中,它成了减少无效分子的得力工具。
- 识别词表令牌每个令牌 Tok 都必须属于一个预先定义的词表,如原子、分支、环等。
- 执行拼接操作将 n 个令牌按顺序首尾相连,得到一个一维字符串 S,这就是模型要生成的序列。
- 解码并还原分子图解码器从左到右消费令牌,边消费边在分子图上添加原子或键,最终得到完整分子图。
- 享受自纠正红利的场景因为令牌自带上下文,遇到无法匹配的符号时,解码器会跳过或纠正,而不是终止整个生成过程。
编码对比与选型
现在你手里有了三种“地址方案”:口头指路、标准邮编、乐高积木。选哪种,取决于你要做什么——给熟人带路用口头指路,寄官方文件用标准邮编,搞人工智障实验则用乐高积木。三种编码没有绝对的优劣,只有场景的适配。
从语法维度看,SMILES 最简洁、最易读,但是同一分子可以有多个不同写法;InChI 标准、唯一,层次丰富,但字符串很长,且解析繁琐;SELFIES 语法规则最整齐,机器生成和解析都稳定,但人类阅读起来很不直观。从可逆性维度看,三者都能无损还原分子图,区别主要体现在“唯一性”和“鲁棒性”上。
为了量化选型,我们可以设计一个简易的评分函数:给每种编码在不同维度打分,再用权重合成。例如对可读性、唯一性和机器学习友好度分别给出分数:
简单来说,科研展示和教学请选 SMILES,跨库交换与去重请选 InChI,分子生成模型请选 SELFIES。面对复杂的工业级系统,很多团队会同时使用三种编码:人读的入口用 SMILES,入库后用 InChIKey 做唯一索引,模型内部则用 SELFIES 作为动作空间。
- 定义可读性函数 r(x)r 衡量字符串能否被人类快速理解和手写,例如 SMILES 得分最高。
- 定义唯一性函数 u(x)u 衡量同一分子是否只对应一个字符串,例如 InChI 得分最高。
- 定义机器学习友好度 m(x)m 衡量模型是否容易生成该编码且不产生非法字符串,例如 SELFIES 得分最高。
- 设置权重并合成当项目偏重数据管理时,调高 β;当项目偏重生成式 AI 时,调高 γ。
分子建模实务
有了地址系统,还要有邮局——真实项目中的“邮局”就是 RDKit 这类化学信息学工具库。RDKit 能解析 SMILES、生成规范 SMILES、计算 InChI、提供大量分子描述符,是药物发现流水线里最常见的零件。它帮助我们把“地址”翻译成实实在在的化学对象,再投递给打分模型或生成模型使用。
在实际的 AI 药物发现流程中,虚拟筛选是最典型的场景:ZINC 等公共数据库中的上亿候选分子都以 SMILES 形式存放,AI 模型把它们编码成向量,然后预测活性并排序。与此同时,分子生成模型会用强化学习或 Transformer 不断产出新分子结构;如果输出层直接是 SMILES,经常出现括号不匹配、环闭合错误等非法字符串,而把 SELFIES 作为词表后,这类问题会大幅减少。
生成模型如何学习生成分子字符串?以最常用的自回归语言模型为例,它在每一步预测下一个令牌的条件概率,并通过最大化整个序列的似然来训练:
如果把分子表示比作写地址,那么编码选型就是选信封格式,RDKit 就是投递员,损失函数就是训练投递员的工作目标。只有把三个环节对齐,AI 才能在一座座分子城市之间高效送信。
- 理解序列位置 t生成过程从 t=1 到 t=T 依次吐出令牌,就像邮局按顺序派发信件的每一步。
- 理解条件概率 pp(y_t | y_{<t}) 表示在已生成前缀 y_1……y_{t-1} 的前提下,第 t 位生成为某令牌的概率。
- 对所有位置求和把序列中每一步的负对数概率相加,得到整个字符串的损失值。
- 最小化负对数似然损失越小,模型越擅长预测真实数据中的分子编码;搭配 SELFIES 时,输出几乎永远可解码。
AI 应用场景
大规模虚拟筛选
阶段:数据准备与特征提取
解决的问题:传统药物筛选中,实验人员需要逐一在湿实验室测试数十万化合物,成本高、周期长。用 SMILES 字符串表示分子,配合 AI 模型读取结构并预测活性,可以把候选范围从百万级快速压缩到百级。
具体案例:一个药企项目需要从 ZINC 数据库中挑选 10 万个“类药”分子。团队先用 RDKit 读取 ZINC 的 SMILES,过滤掉违反类药规则的分子,再把剩余分子编码成特征向量输入打分模型,最终只保留 200 个高潜力分子进行湿实验验证。
基于 SELFIES 的分子生成
阶段:生成建模
解决的问题:用强化学习生成新分子时,如果模型直接输出 SMILES,经常生成括号不匹配或环无法闭合的非法字符串,浪费大量采样预算。改用 SELFIES 后,生成器输出的每个序列都能被解码为合法分子图,大幅提升有效分子率。
具体案例:研究团队用 Transformer 在 ChEMBL 数据上预训练,迁移到强化学习阶段把 SELFIES 作为动作空间;生成的 10000 个 SELFIES 序列中,99% 以上可还原为有效分子结构,而对照组使用 SMILES 时无效率高达 20%。
跨库化合物去重与整合
阶段:数据治理与知识图谱构建
解决的问题:同一化合物在不同供应商数据库中可能使用不同的 SMILES 字符串,导致按 SMILES 合并时出现重复记录。InChI 的唯一性可以保证同一个分子只对应一个标准字符串,从而在数据整合时准确去重。
具体案例:某药企知识图谱团队合并来自 PubChem、ChEMBL 和内部数据库的 500 万条记录,统一用 RDKit 生成 InChIKey 作为主键,成功将重复记录率从 15% 降至 2% 以下。
Python 演示
# -*- coding: utf-8 -*-"""分子表示对比演示:SMILES / InChI / SELFIES仅使用标准库, 演示三种字符串编码的基本合法性与突变鲁棒性.""" import re MOLECULES = [ ("乙醇", "CCO", "[C][C][O]"), ("乙酸", "CC(=O)O", "[C][C][=Branch1][C][=O][O]"), ("苯", "c1ccccc1", "[C][=C][C][=C][C][=C][Ring1]"),] def valid_smiles(s): """简化版 SMILES 合法性检查: 括号配对且环数字成对""" stack = [] ring_digits = [] for ch in s: if ch == "(": stack.append(ch) elif ch == ")": if not stack: return False stack.pop() elif ch.isdigit(): if ch in ring_digits: ring_digits.remove(ch) else: ring_digits.append(ch) return not stack and not ring_digits def valid_inchi(s): return s.startswith("InChI=") and s.count("/") >= 2 and s.isascii() def valid_selfies(s): tokens = re.findall(r"\[[^\]]+\]", s) return bool(tokens) and "".join(tokens) == s def mutate(s, idx, ch="X"): return s[:idx] + ch + s[idx+1:] def main(): print("== 分子表示鲁棒性对比 ==") for name, smiles, selfies in MOLECULES: print("\n分子: {}".format(name)) print("SMILES: {} 合法? {}".format(smiles, valid_smiles(smiles))) print("SELFIES: {} 合法? {}".format(selfies, valid_selfies(selfies))) n_smiles_fail = sum(not valid_smiles(mutate(smiles, i)) for i in range(len(smiles))) n_selfies_fail = sum(not valid_selfies(mutate(selfies, i)) for i in range(len(selfies))) print("单字符扰动使 SMILES 失效次数: {}/{}".format(n_smiles_fail, len(smiles))) print("单字符扰动使 SELFIES 失效次数: {}/{}".format(n_selfies_fail, len(selfies))) if __name__ == "__main__": main()
MOLECULES = [("乙醇", "CCO", "[C][C][O]"), ...]用三种编码预置了三个常见分子,便于做对比实验。stack = []用栈记录未闭合的括号,模拟 SMILES 的分支是否合法。elif ch.isdigit():遇到数字时把它当作环闭合标记,数字成对出现才合法。valid_selfies` 中用 `re.findall(r"\[[^\]]+\]", s)提取所有方括号令牌,体现 SELFIES “以令牌为基本单元”的语法特征。"".join(tokens) == s检查字符串是否完全由令牌拼接而成,这是 SELFIES 词法完整的核心保证。mutate(smiles, i)对字符串每个位置做单字符扰动,模拟生成模型“手抖”写错一个字符的情况。n_selfies_fail = sum(...)统计 SELFIES 在扰动后仍能保持词法合法的比例,展示其鲁棒性。
常见误区
误区“SMILES 和 InChI 都是分子字符串,既然都能表示分子,那它们就是等价的吧?我随便选一种入库就可以了。”
正解等价性要看用途。SMILES 是“口语指路”,同一个分子可以有多个不同写法;InChI 是“标准邮编”,同一分子在规范情况下只有一个标准字符串。如果直接用 SMILES 入库,很容易出现重复记录;用 InChI 或 InChIKey 才能保证唯一标识。
为何常见:初学者最先接触的就是 SMILES,看到 InChI 也是字符串,很容易把两者都当成“一维分子代码”,从而忽视了唯一性这一关键差异。
误区“我用 RDKit 写了个 SMILES,这个字符串就是做这个分子的唯一编码,数据库里一定不会重复。”
正解普通 SMILES 有多种写法,比如乙醇可以写成 CCO、也可以写成 C(O)C。RDKit 能生成“规范 SMILES(Canonical SMILES)”,它通过固定的原子排序规则保证唯一性,但前提是你主动调用规范化和标准生成流程。
为何常见:很多人以为“编码 = 唯一”,忽略了规范 SMILES 与普通 SMILES 的区别;这在数据清洗时会埋下大量重复和冲突的坑。
误区“SELFIES 能自我纠正,生成模型又喜欢用,那以后所有分子表示都用 SELFIES 就完事了。”
正解SELFIES 在生成模型场景下有独特优势,但它字符串更长、人类很难阅读,且相关化学信息学工具链(如 RDKit 的某些功能、ChemDraw 的复制粘贴)仍以 SMILES 和 InChI 为主流。在展示、教学和已有生态里,SMILES 依然是事实标准。
为何常见:看到 SELFIES 的鲁棒性演示后,人容易走向“新工具完美”的极端,忽略了生态成熟度和可读性这些工程约束。
误区“InChIKey 是 InChI 的压缩版,那我拿到 InChIKey 应该就能还原出完整的分子结构吧?”
正解InChIKey 本质上是 InChI 字符串的 SHA-256 哈希摘要,只有 27 个大写字母,是不可逆的。它适合做数据库主键和快速匹配,但要还原结构必须回到 InChI 原文或借助大型映射表。
为何常见:因为 InChIKey 看起来很像是“短编码”,初学者容易把它和“无损压缩”混为一谈,忽略了哈希函数的单向性。
面试题
Q1. SMILES 编码中,半角括号"("的含义是什么?
- A.创建分支结构← 正确答案
- B.闭合环数字
- C.表示电荷转移
- D.表示原子共价
答案:A。SMILES 中括号表示从当前原子出发打开一个分支,括起来的部分会在后续某处汇合,类似口头指路中的“右转绕一圈再回来”。闭合环需要数字标记,电荷转移和共价则由电荷字段或键符表达。
Q2. 同样一个分子,InChI 相比 SMILES 最大的特点是?
- A.字符串长度短
- B.编码标准唯一← 正确答案
- C.支持汉字字符
- D.可直接画图片
答案:B。InChI 由 IUPAC 制定并采用分层结构,同一分子在规范计算下会生成唯一的标准 InChI,适合跨库去重。SMILES 虽然短且直观,但属于“口语化”编码,同一分子可以写出多个版本。
Q3. SELFIES 令牌的自可纠正特性,最适合用于哪类任务?
- A.数据库主键
- B.化学结构绘图
- C.分子生成模型← 正确答案
- D.手写化学笔记
答案:C。SELFIES 设计初衷就是让生成模型每次解码都能得到合法分子图;即使出现异常令牌,解码器也能跳过或修正。数据库主键更多使用 InChIKey,绘图和手写笔记则用传统的结构编辑器更合适。
Q4. InChI 字符串包含多个用斜杠分隔的层次,其中第一层通常是什么?
- A.化学式层← 正确答案
- B.连接层
- C.立体层次
- D.质子转移层
答案:A。InChI 的第一层是化学式层,例如 C2H4O2,它给出分子中各元素的比例。后续的 /c 连接层、/h 氢层、/t 立体化学层才逐步补充原子连接和空间信息。
Q5. SMILES 中用于标记环闭合起止位置的符号是什么?
- A.一个数字← 正确答案
- B.一个斜杠
- C.一个问号
- D.一对中括号
答案:A。SMILES 使用数字把环的始末原子连接起来,比如 C1CCCCC1 中两个 1 是同一个环的闭合点。斜杠用于键的空间构型,中括号用于原子属性和电荷,问号在 SMILES 中不是标准语法。
Q6. 关于规范 SMILES 与普通 SMILES 的核心区别,下列说法正确的是?
- A.规范原子排序唯一← 正确答案
- B.键长固定不变
- C.字符串必然更短
- D.不能再被解码还原
答案:A。规范 SMILES 通过算法确定一个唯一的原子遍历顺序,使同一分子只产生一个标准字符串,解决重复入库问题。它不保证更短,也不改变键长,并且仍然可被解码还原为分子图。
Q7. 关于 InChIKey 的说法,正确的是?
- A.它是哈希缩略码← 正确答案
- B.它能逆推回 InChI
- C.它比 InChI 更长
- D.它编码所有原子坐标
答案:A。InChIKey 是对整个 InChI 字符串做哈希形成的 27 位大写缩略码,适合做数据库索引和快速匹配。哈希过程不可逆,因此无法从 InChIKey 反推出分子结构;它也不包含原子坐标。
Q8. 下列哪些属于分子表示的常见目标?
- A.让机器快速检索← 正确答案
- B.让模型自由生成← 正确答案
- C.让数据库统一去重← 正确答案
- D.让天平称出质量
答案:ABC。分子表示的核心目标是把分子图转换成机器可处理的字符串,以支持检索、生成与去重。天平称量质量是物理实验的操作,和字符串编码没有直接关系。
Q9. 用 SELFIES 驱动分子生成模型时,可以获得哪些优势?
- A.免去非法字符串← 正确答案
- B.解码过程可纠正← 正确答案
- C.输出可还原为图← 正确答案
- D.字符串必然最短
答案:ABC。SELFIES 每个令牌自带上下文,解码时遇到错误能自我纠正,且生成结果总能还原成合法分子图。但它并不是以“最短”为目标,通常反而比同等结构的 SMILES 更长。
Q10. 下列哪些做法符合分子表示的使用规范?
- A.用 InChI 去重化合物← 正确答案
- B.用 SMILES 做数据展示← 正确答案
- C.用 SELFIES 驱动生成← 正确答案
- D.用普通 SMILES 唯一化入库
答案:ABC。InChI 唯一性强适合去重,SMILES 简单直观适合展示,SELFIES 鲁棒性强适合生成式 AI。普通 SMILES 不具备唯一性,直接作为唯一化入库字段会导致重复记录。