LLM 的数据清洗是减法,AI 制药的数据清洗是手术
昨天那篇长文里有一节讲数据清洗,只写了九百字。落笔的时候我就知道那一节撑不起这个话题——它是三次迁移里我踩坑最密集、也最能区分”做过”和”没做过”的地方。所以今天单独展开讲一件事:同样叫”数据清洗”,大语言模型和 AI 制药是两个完全不同的工种。前者是减法,后者是手术。
一、LLM 的清洗为什么”简单”:它已经被工具驯化了
先说清楚我说的”简单”是什么意思——不是不难,而是方法论已经收敛、工具已经工业化。今天做一份预训练语料,流程几乎是标准的:
- 规则保底:Gopher/C4 式启发式,按行过滤过短过长、统计词频分布、砍高比例标点
- 模型打分:训一个小分类器判别”像不像高质量人类文本”,KenCC/FineWeb-Edu 都是这个思路
- 两级去重:精确去重(13-gram hash)+ 模糊去重(MinHash LSH),SlimPajama 靠这套滤掉约 48% 的重复 token
- 防污染:GSM8K/MATH/HumanEval 的 n-gram 指纹,清洗时精确剔除重叠片段
HuggingFace 的 datatrove 把这四步全做成了模块,拼一条 pipeline 就能跑完一个 TB 级语料。整个领域对”什么是干净语料”已经有共识,有基准(FineWeb 就是拿清洗质量当卖点的),有开源参照实现。
更重要的是两件事兜底:
错误成本低。 语料里漏掉一批脏数据,代价只是浪费一点算力、模型稍微笨一点——不会毒化。下一轮迭代换一版清洗规则重来就是,反正 FineWeb 有 15T token,删掉一半还剩一半。
数据是自然存在的。 网页本来就写在互联网上,清洗只是筛选,从头到尾没有改变数据本身。你不需要理解任何一篇文档的内容,就能把它清干净。
记住这两点,下面好戏来了。
二、医药数据的七个深坑
坑 1:标注即实验,错了没法重标
LLM 的 SFT 标注错了?让标注员改一遍就行。医药数据的每条标注背后是一次真实的湿实验:一条 Ki 值意味着有人培养蛋白、配缓冲液、跑滴定、拟合曲线。这条数据错了,你没有任何”重新标注”的选项——要么弃用(数据本来就稀缺),要么带着噪声训练。
我在处理结合数据时最深的无力感就在这里:语言模型的脏数据是”可以争论的”,生化的脏数据是”物理上已经发生的”。
坑 2:测量协议混乱,同一个化合物能差出一个数量级
这是我认为最反直觉的一条。你以为 Ki 就是 Ki,一个数字放哪都一样?ETH Zurich 的 Landrum 和 Riniker 2024 年在 JCIM 上发了一篇专门量化这件事的论文,他们把 ChEMBL 里”同一化合物、同一靶点、不同 assay”的重复测量拿出来对比:
- 最小清洗(只按活性值匹配):65% 的重复测量相差超过 0.3 个对数单位,27% 相差超过一个数量级,两组测量的 Kendall τ 相关性只有 0.51
- 最大清洗(要求 assay 元数据几乎全部匹配):仍有 13% 相差超过一个数量级
也就是说,不做任何清洗直接把文献里的 IC50 混在一起训模型,四分之一以上的标签自带十倍级别的噪声。而模型的任务恰恰是预测这个数值——你在让模型学一个方差比信号还大的目标。
为什么不能只用单一 assay 的数据?因为 ChEMBL32 里 85,000 多个 IC50 assay 中,超过 60,000 个只测了不到 10 个化合物,化合物数超过 100 的只有 650 个,超过 500 的只有 54 个。单一 assay 的干净数据集根本不够训模型——这就是所有人被迫混合数据的结构性原因,也是清洗必须存在的原因。
顺带说单位问题。IC50、Ki、Kd 三种标注混在一起时,要先归一化到同一尺度:
但 pIC50 只解决了”尺度”,没解决”含义”:Ki 是平衡解离常数,IC50 受实验底物浓度影响(Cheng-Prusoff 关系),两者不是一回事。LP-PDBBind 那篇论文的做法更狠——他们的第二级清洗(CL2)直接把 IC50 全部扔掉,只保留 Kd 和 Ki,宁可从 14,324 条砍到 7,985 条。
坑 3:结构数据的缺陷是隐性的
序列数据的脏是一眼能看出来的(非标准氨基酸、长度异常)。结构数据的脏藏在文件里面:
- 结晶伪影:X 射线晶体学里,蛋白被晶格 force 挤着,某些侧链构象是晶体 packing 逼出来的,溶液里根本不长这样。拿这种构象当对接 ground truth,模型学到的是晶格力
- 配体部分占据:电子密度里配体 occupancy 可能只有 0.6,坐标是”六成概率在这”的模糊位置
- 无序区缺失:柔性环没出密度就没建模,PDB 文件里直接缺残基,不知情的人拿去算口袋会得出错误边界
- 共价配体混进非共价集合:PDBBind general set 里有共价抑制剂,它们的”结合模式”和非共价药物完全是两种物理。LP-PDBBind 专门把共价数据单独隔离出来
分辨率 > 3.5Å 删掉、R-free > 0.3 删掉——这只是入门动作,真正的坑都在上面这些地方。
坑 4:负样本不存在
这是我最喜欢跟人聊的一条,因为它荒谬得很优雅:“这个分子不结合这个靶点”的实验结果,几乎没有人发表。
期刊只发阳性结果,药企的失败数据锁在保险柜里。于是所有公开的结合数据集全是正样本——你直接拿去训,模型学到的先验是”万物皆可结合”。虚拟筛选就废了:它的任务恰恰是从几百万个分子里挑出极少数能结合的。
社区的补丁是造诱饵(decoy):DUD-E 给每个活性分子按 1:50 配物理性质相似但结构不同的非活性分子。但诱饵是算法生成的”假阴性”,它们只是大概率不结合,分布和真实世界里的失败分子完全不同——在诱饵上表现好的模型,未必能在真实筛选里活下来。LLM 世界里”负样本不存在”这个问题根本不存在,文本天然有正例也有反例。
坑 5:偏差是系统性的,而且会传染给 benchmark
上篇提过 PDBBind 激酶占比畸高、GPCR 不足 5%。这里补一刀更隐蔽的:LP-PDBBind 指出 core set 的配体平均尺寸比整体小——小配位体更好预测,所以大家最常用的那个测试集,本身就是偏简单的。你的模型在 core set 上刷出的高分,含金量要先打个问号。
LLM 的评测集当然也有偏差,但至少 GSM8K 不会”系统性地比真实考试简单一个难度等级”。
坑 6:防泄漏需要领域知识,切分方式本身就是一门学问
LLM 防泄漏靠 n-gram 指纹,字符串匹配就够了。医药数据的泄漏是”语义级”的:
PDBBind 自己的官方划分就是漏的。 LP-PDBBind 实测:core set 与 general set 之间存在大量完全相同的蛋白和配体(相似度直方图在 1.0 处有尖峰)。也就是说,过去几年所有”在 general set 上训练、core set 上测试”的打分函数,成绩单全部虚高——包括不少发表在高分期刊上的工作。
时间切分(EquiBind 首创,2019 年前的结构训练、之后的测试)堵住了时间维度的泄漏,但堵不住空间维度:不同时间的同源蛋白还是可能同时出现在两侧。
scaffold split(按 Bemis-Murcko 骨架分组切分)保证测试集骨架全新,看起来很严格了?Imperial College 的 Guo 等人 2024 年证明:不同骨架的分子也可能非常相似,scaffold split 依然高估性能。他们用 UMAP 聚类做了更接近真实虚拟筛选场景的切分——hit rate 从 scaffold split 下的约 80% 直接掉到 0%(逻辑回归和随机森林),深度模型也从 ROC-AUC 0.8 掉到 0.63。
一层比一层严,每一层都需要”懂化学的人”来设计。这就是我说”防泄漏需要领域知识”的意思:n-gram 指纹谁都会写,但判断”90% 序列一致度的两个激酶算不算泄漏”、”Tanimoto 0.85 的两个骨架该不该分居两侧”,需要对蛋白家族和化学空间的直觉。
坑 7:过滤规则自相矛盾,你没有”拿量换质”的本钱
LLM 清洗遇到规则冲突时有个万能解法:从严过滤,反正语料管够。RefinedWeb 淘汰率 90%,眼睛都不眨。
医药数据没这个奢侈。LP-PDBBind 的三级清洗是个完美的展示:
| 清洗级别 | 规则 | 剩余数据 |
|---|---|---|
| CL1 | 非共价 + 结构质量过滤 | 14,324 |
| CL2 | CL1 + 只留 Kd/Ki(弃 IC50) | 7,985 |
| CL3 | CL2 + 只留 refined/core 来源 | 4,404 |
每提高一级质量标准,数据量近乎腰斩。你永远在”标签可靠性”和”样本量”之间走钢丝,而且没有中间商帮你兜底。LLM 工程师说”数据质量比数量重要”时是有退路的,医药数据工程师说这句话时是真的在赌命。
三、实战:清洗一份 PDBBind 结合数据
讲完坑,把我实际的清洗流程摊开。目标:构建一份用于亲和力预测的训练集,原则是时间切分防泄漏 + 双重去重 + 物理有效性检查。
第一步:读索引,按时间切分
PDBBind 的 INDEX 文件里有每个复合物的 PDB ID、分辨率、release year 和结合数据。第一刀就用时间切:
1 | import pandas as pd |
这一步对应 LLM 的”评测集指纹防污染”,但粒度是”年份”而不是”字符串重叠”。
第二步:结构与标注质量过滤
1 | def quality_filter(row): |
结合自由能统一换算(298 K 下 KXINL2 kcal/mol,Kd 每变化 10 倍,自由能变化约 1.36 kcal/mol):
第三步:双重去重——序列层面 + 配体层面
蛋白侧用 MMseqs2 做 90% 一致度聚类(命令见上篇),配体侧用 RDKit 算 Morgan 指纹的 Tanimoto 相似度:
1 | from rdkit import Chem, DataStructs |
阈值取 0.85 还是 0.9,取决于你对”多像才算重复”的判断——这个数字没有任何论文能替你定,因为它取决于下游任务的泛化要求。
第四步:共价配体检测
用 SMARTS 模式匹配常见的共价 warhead(丙烯酰胺、氰基等),命中即移入共价子集单独管理:
1 | covalent_smarts = Chem.MolFromSmarts("[C;H1]=C[C;H0](=O)N") # 丙烯酰胺类 |
第五步:物理有效性检查
PoseBusters 一行命令检查键长键角、原子碰撞、手性:
1 | bust pose.lig.sdf protein.pdb ref_ligand.sdf |
RMSD < 1Å 且 PB-Valid 通过的才留下。这一步筛掉的样本往往占 5-15%,都是”坐标存在但物理上不可能”的坏数据。
第六步:Murcko 骨架提取 + scaffold split
最后切分时不用 random split,按骨架分组:
1 | from rdkit.Chem.Scaffolds import MurckoScaffold |
整套流程跑完,refined set 通常只剩六七成。每一刀都有明确理由,每一刀都在损失数据——这就是手术的含义。
四、沉淀:为什么护城河是管线而不是模型
做完这些再看两个领域的差别,我的总结是:
LLM 清洗的对象是自然分布,医药清洗的对象是人工产物。 文本是人类的自然排放,清洗规则可以不懂内容;而每条医药数据背后都站着一个具体的实验方案——buffer 的 pH、底物浓度、晶体怎么长的。不理解实验的人写不出正确的过滤条件,这就是为什么医药数据清洗无法完全工具化:规则本身就是领域知识。
这也解释了一个行业现象。 这两年 AI 制药公司的模型架构快速趋同(上篇讲过:扩散、流匹配、SE(3) 等变,大家都抄得动),但各家对”哪些数据能用、怎么切分、怎么归一化”的管线细节从不公开。原因很简单:模型抄得走,三年清洗经验堆出来的规则集抄不走。在 AI 制药,数据管线就是护城河本身。
给想进入这个领域的人一句实在话:先花两周把 RDKit 的坑和 PDB 文件的怪癖摸熟,再谈模型架构。在这个领域,懂模型的人很多,懂数据的人很少——而决定模型上限的,恰恰是后者。
参考文献
- Landrum, G. A., & Riniker, S. Combining IC50 or Ki Values from Different Sources Is a Source of Significant Noise. J. Chem. Inf. Model. 2024. DOI: 10.1021/acs.jcim.4c00049. https://pubs.acs.org/doi/10.1021/acs.jcim.4c00049
- Wang, Z., et al. Leak Proof PDBBind: A Reorganized Dataset of Protein-Ligand Complexes for More Generalizable Binding Affinity Prediction. arXiv 2023. arXiv:2308.09639. https://arxiv.org/abs/2308.09639
- Guo, Q., Hernandez-Hernandez, S., & Ballester, P. J. Scaffold Splits Overestimate Virtual Screening Performance. arXiv 2024. arXiv:2406.00873. https://arxiv.org/abs/2406.00873
- Li, X., et al. A systematic study of key elements underlying molecular property prediction. Nature Communications 14, 2023. https://pmc.ncbi.nlm.nih.gov/articles/PMC10575948
- Buttenschoen, M., Morris, G. M., & Deane, C. M. PoseBusters: AI-based docking methods fail to generate physically valid poses or recognise them as such. Chemical Science 15, 2024. arXiv:2404.13062. https://arxiv.org/abs/2404.13062
- Stärk, H., et al. EquiBind: Geometric Deep Learning for Drug Binding Structure Prediction. NeurIPS 2022. arXiv:2203.04470. https://arxiv.org/abs/2203.04470
- Wu, Z., et al. MoleculeNet: A Benchmark for Molecular Machine Learning. Chemical Science 9, 2018. arXiv:1703.00564. https://arxiv.org/abs/1703.00564
- Bemis, G. W., & Murcko, M. A. The Properties of Known Drugs. 1. Molecular Frameworks. J. Med. Chem. 39(15), 1996. DOI: 10.1021/jm9602928
- Mysinger, M. M., et al. Directory of Useful Decoys, Enhanced (DUD-E): Better Ligands and Decoys for Better Benchmarking. J. Med. Chem. 55(14), 2012. DOI: 10.1021/jm300687e
- Liu, Z., et al. Forging the Basis for Development of Protein-Ligand Scoring Functions. Acc. Chem. Res. 50(2), 2017. DOI: 10.1021/acs.accounts.6b00491
- RDKit: Open-Source Cheminformatics. https://github.com/rdkit/rdkit