打开网易新闻 查看精彩图片

一个做AI搜索的工程师,把向量数据库用在了阿司匹林上。结果传统方法漏掉的相似分子,被这套系统捞回来了。

David Vybornov(下文称D)在Medium发了一篇技术复盘。他原本只想验证一个直觉:既然SMILES能把分子写成字符串,transformer(变换器,一种神经网络架构)能不能像理解句子一样理解化学结构?

答案是可以。但过程比他预想的更曲折。

传统搜索的盲区:指纹碰撞与信息蒸发

传统搜索的盲区:指纹碰撞与信息蒸发

化学信息学里,分子相似性搜索的主流方案叫指纹相似度。流程很标准:用RDKit生成Morgan指纹(一种记录分子片段的固定长度位向量),计算查询分子与候选分子的Tanimoto分数(两向量重叠度,0到1),按分数排序。

这套方案快、简单、可解释,但有个致命伤:压缩即丢失。

分子被哈希成固定长度的位向量时,不同子结构可能撞进同一个比特位。这种碰撞在查询前就发生了——你搜索的不是分子本身,而是一个已经失真的副本。

D在测试中发现,肉眼明显相关的化合物,指纹系统给不出高分。子结构重叠度不够,Tanimoto分数就把它们过滤掉了。化学家说的"骨架跃迁"(scaffold hopping)——两个分子通过不同核心结构作用于同一生物靶点——正是这类系统的盲区。

他数了数,自己手头的测试集里,这类漏检大概占四成。

打开网易新闻 查看精彩图片

ChemBERTa的赌注:把分子当句子读

ChemBERTa的赌注:把分子当句子读

D的替代方案是ChemBERTa,一个专门在SMILES字符串上预训练的transformer。SMILES(简化分子线性输入规范)把三维化学结构编码成文本,比如阿司匹林的字符串是CC(=O)Oc1ccccc1C(=O)O

他的流水线是这样的:

1. 用ChemBERTa把SMILES嵌入成768维向量
2. 把向量+分子属性元数据(分子量、脂水分配系数等)写进Qdrant向量数据库
3. 检索时同时做相似度搜索+payload过滤(在检索阶段就筛选属性)

关键设计:向量负责"长得像",payload负责"符合硬指标"。

这和纯向量搜索的区别在于,属性过滤发生在ANN(近似最近邻)检索过程中,而不是事后二次筛选。Qdrant的Python客户端当时刚支持这个特性,D算是早期尝鲜者。

实测结果:找回那40%的漏网之鱼

实测结果:找回那40%的漏网之鱼

D跑了两组对比实验。同一批查询分子,分别用指纹相似度和向量相似度检索,人工复核结构相关性。

向量系统捞回了一批指纹方法完全遗漏的候选。这些分子的共同特征是:整体拓扑相似,但局部片段哈希冲突严重,导致指纹重叠度低。

打开网易新闻 查看精彩图片

「ChemBERTa似乎捕捉到了某种'化学语法'——不是原子级别的匹配,而是功能基团在序列中的相对位置和上下文。」D在文中写道。

但他也记录了失败案例。某些光学异构体(镜像分子)在SMILES中字符串差异极小,向量距离却拉得很开;而另一些字符串差异大的分子,向量反而靠得很近。嵌入空间的"近"不等于化学意义的"近",这个问题没有消失,只是换了个形式。

系统的裂缝:哪里会崩

系统的裂缝:哪里会崩

D列了三处明确的失效模式:

训练分布外(OOD)分子。 ChemBERTa在ChEMBL等主流化学数据库上训练,遇到新型合成化合物或天然产物中的罕见骨架,嵌入质量断崖下跌。

立体化学敏感度不足。 SMILES本身可以编码立体信息(@符号标记手性中心),但ChemBERTa对这类标记的学习似乎不够精细。两个生物活性截然不同的对映体,向量余弦相似度可能高达0.95。

属性过滤的边界效应。 当payload条件过于严格(比如同时限定分子量<300、脂水分配系数2-3、可旋转键<5),向量检索的候选池被压缩到极小,近似算法的精度优势丧失,退化成暴力扫描。

他在GitHub仓库里放了一个Streamlit演示界面,上传SMILES或手绘结构,实时对比指纹vs向量的Top-10结果。肉眼可见的差异,比任何指标都直观。

D最后提到一个未解的问题:向量空间里的"化学相似性"到底对应什么?是反应性?是靶点结合模式?还是纯粹的训练数据统计偏差?

他现在的实验规模还回答不了。但如果有人想在10亿级分子库里做骨架跃迁筛选,这套方案的漏检率曲线,值得和指纹方法并排画一画。