AI 辅助药物发现入门¶
1. 一句话说明¶
AI 辅助药物发现(AI-Aided Drug Discovery, AIDD)是利用机器学习和深度学习技术加速药物研发全流程——从靶点发现、先导化合物筛选、ADMET 预测到临床试验优化——将传统需要 10-15 年、耗资 10-26 亿美元的新药研发周期大幅压缩。
2. 传统药物发现流程 vs AI 加速:白话对比¶
2.1 传统流程(像大海捞针)¶
传统新药研发被称为"双十工程"——平均耗时 10+ 年、花费 10+ 亿美元,且成功率极低(进入临床试验的候选药物仅约 10% 最终获批上市)。
白话:就像从 一亿颗沙子 里找一颗金子。科学家先猜哪个蛋白可能是"坏蛋"(靶点),再从化合物库(几百万个分子)里一个一个试哪个能"治住坏蛋",试完还要看毒性、吸收、代谢……每一步都靠实验,贵且慢。
2.2 AI 加速流程(像用金属探测器找金子)¶
AI 加速流程(并行 + 预筛选,大幅提速):
靶点发现(AI文献挖掘+多组学整合,数周)
→ 虚拟筛选(AI 从十亿分子中筛出 Top 1000,数天)
→ ADMET 预测(AI 模型秒级预测毒性/吸收/代谢)
→ 先导优化(生成式 AI 设计新分子)
→ 临床试验优化(AI 预测患者分层/最佳剂量)
白话:AI 不是"替代"科学家做实验,而是帮你 缩小搜索范围。就像你以前在图书馆翻遍每一本书找答案,现在有了搜索引擎——你还是要亲自读,但搜索引擎帮你定位到了最可能的几本。
2.3 关键数据对比¶
| 维度 | 传统方法 | AI 辅助方法 |
|---|---|---|
| 靶点发现 | 文献人工检索 + 基因敲除实验 | 多组学数据整合 + 知识图谱推理 |
| 化合物筛选 | 高通量筛选(HTS),每次测几百万个 | 虚拟筛选,一次过滤数十亿个 |
| 筛选成本 | 实体库购建+试剂+人工,数百万美元 | 计算资源,数万美元 |
| ADMET 评估 | 体外实验,每个化合物数千美元 | 模型预测秒级完成,几乎零成本 |
| 先导优化 | 凭经验 + 合成-测试循环 | 生成式模型直接设计 + 指导合成 |
| 典型周期 | 发现到临床前 4-6 年 | 可压缩到 1-2 年 |
| 代表案例 | — | Insilico Medicine 的 ISM001-055(AI发现到临床 I 期仅 18 个月,2023年) |
3. AI 在药物发现各阶段的应用¶
3.1 靶点发现(Target Discovery)¶
做什么:找到疾病相关的"关键蛋白"作为药物打击目标。
AI 怎么帮: - 多组学整合:用深度学习整合基因组、转录组、蛋白组、代谢组数据,发现传统分析遗漏的靶点 - 知识图谱:构建"疾病-基因-蛋白-药物"关系网络,用图神经网络(GNN)推理潜在靶点 - 文本挖掘:NLP 模型(如 BioBERT、PubMedBERT)自动从海量文献中提取蛋白-疾病关联
白话:以前靠科学家读 paper 凭经验猜靶点,现在 AI 能一次性"读"完 3000 万篇论文 + 百万条组学数据,帮你列出最可疑的靶点排行榜。
代表工具:BenevolentAI 平台、Open Targets(https://www.opentargets.org/)
3.2 先导化合物筛选(Hit/Lead Discovery)¶
做什么:从海量化合物中找到能跟靶点结合的"种子分子"。
AI 怎么帮: - 虚拟筛选(Virtual Screening):用分子对接(Docking)或机器学习模型预测分子与靶点的结合能力,从数十亿化合物中快速筛选 - 生成式模型:用 VAE(变分自编码器)、GAN、扩散模型直接"发明"新分子,不局限于已有化合物库 - 主动学习(Active Learning):AI 预测 → 实验验证 → 反馈给 AI → 迭代优化,形成智能筛选闭环
白话:传统是"挨个试",AI 是"先算算哪些最有戏,只试那些"。甚至 AI 能"自己画"出自然界不存在的新分子。
代表工具:AutoDock Vina(分子对接)、DiffDock(深度学习对接)、REINVENT(生成式分子设计)
3.3 ADMET 预测(药代动力学性质)¶
ADMET 全称:Absorption(吸收)、Distribution(分布)、Metabolism(代谢)、Excretion(排泄)、Toxicity(毒性)
做什么:预测候选药物在人体内的行为——吃下去能不能吸收?会不会有毒?能不能被肝脏代谢掉?
AI 怎么帮: - 用分子特征(描述符/指纹/图结构)训练预测模型 - 常见预测任务:溶解度(LogS)、脂水分配系数(LogP)、血脑屏障穿透性(BBB)、hERG 毒性(心脏毒性)、CYP450 抑制(药物相互作用) - 多任务学习:一个模型同时预测多个 ADMET 端点,共享分子表征
白话:以前要做几十种实验才知道一个药"能不能用",现在 AI 看一眼分子结构就能给出初步判断——毒性高的直接淘汰,省得白做实验。
代表工具:DeepChem(ADMETNet)、ADMET-AI(MIT 2024 开源)、pkCSM(在线预测)
3.4 临床试验优化(Clinical Trial Optimization)¶
做什么:提高临床试验效率,降低失败率。
AI 怎么帮: - 患者分层:根据基因组/生物标记物数据,AI 将患者分为"最可能响应"和"最可能无效"两组,精准招募 - 剂量优化:用 PK/PD 模型 + 强化学习预测最佳给药方案 - 试验设计:自适应试验设计(Adaptive Trial Design),AI 根据中期结果动态调整试验参数 - 终点预测:预测哪些试验最可能成功/失败,帮药企优化研发管线
白话:以前临床试验是"招一群人吃药看效果",现在 AI 帮你"找最对的人、给最对的量、用最聪明的试验方案"。
4. 分子表示方法(如何让计算机"理解"分子)¶
AI 模型不能直接"看到"分子,需要把分子转成计算机能处理的数字形式。这就是分子表示(Molecular Representation)。
4.1 SMILES 字符串¶
全称:Simplified Molecular Input Line Entry System
原理:用一行 ASCII 字符串表示分子结构,类似分子的"一维文字描述"。
规则: - 大写字母 = 脂肪族原子(C, N, O),小写 = 芳香族(c, n, o) - = 双键,# 三键 - 括号 () 表示分支 - 数字成对出现表示环(如 c1ccccc1 = 苯环,1 和 1 连接成环)
白话:SMILES 就像给分子写了个"文字编码"。就像你用文字"两个氢一个氧"描述水分子一样,SMILES 用字符 O 来表示。
优点:简洁、通用、可直接送入 NLP 模型(Transformer)
缺点:同一个分子可能有多种 SMILES(非唯一),需要 Canonical SMILES 标准化
4.2 分子指纹(Molecular Fingerprint)¶
原理:把分子转成一个固定长度的 二进制向量(0/1 串),每一位代表"有没有某个子结构"。
分子指纹示例(简化版,实际通常 1024/2048 位):
阿司匹林 → [1, 0, 1, 1, 0, 0, 1, 0, ...] (长度 2048)
位 0 = 含苯环? → 1(是)
位 1 = 含氨基? → 0(否)
位 2 = 含酯键? → 1(是)
...
常见类型: | 指纹类型 | 特点 | 适用场景 | |----------|------|---------| | Morgan/ECFP | 基于原子环境,圆形子结构 | 活性预测、相似性搜索(最常用) | | MACCS Keys | 166 个预定义子结构 | 快速粗筛 | | RDKit Fingerprint | 基于路径 | 通用化学信息学 | | Topological Torsion | 基于扭转角 | 3D 相关性质预测 |
白话:分子指纹就像给每个分子拍了张"X光片"——不看细节,只看"有没有苯环、有没有氨基、有没有羟基"这些特征,然后用 0/1 编码。两个分子的指纹越相似,它们的性质越可能相似。
4.3 3D 构象(3D Conformation)¶
原理:分子不是平面的,用每个原子的三维坐标 (x, y, z) 完整描述分子的空间形状。
3D 构象表示:
原子1 (C): x=1.23, y=0.45, z=-0.67
原子2 (O): x=2.11, y=0.98, z=-0.32
原子3 (N): x=0.56, y=-1.02, z=0.89
...
应用场景:分子对接(Docking)——药物分子要像"钥匙插入锁孔"一样嵌入蛋白质口袋,必须考虑 3D 形状匹配。
白话:SMILES 和指纹都是"平面照片",3D 构象是"立体模型"。药物跟蛋白质结合是 3D 的事,所以对接计算必须用 3D。
4.4 分子图(Graph)+ 图神经网络(GNN)¶
原理:把分子看作一个图(Graph)——原子是节点(Node),化学键是边(Edge)。
分子图表示:
节点特征:原子类型、电荷、杂化方式、是否在环中...
边特征:键类型(单/双/三/芳香)、是否在环中、键长...
乙醇 CCO 的图:
C ——(单键)—— C ——(单键)—— O
节点=[C, C, O]
边=[(0,1,单键), (1,2,单键)]
GNN 模型: | 模型 | 特点 | 论文 | |------|------|------| | GCN | 基础图卷积 | Kipf & Welling, 2017 | | GAT | 注意力加权邻居 | Velickovic et al., 2018 | | MPNN | 消息传递框架(最通用) | Gilmer et al., 2017 | | SchNet/DimeNet | 考虑 3D 坐标的 GNN | Schutt et al., 2018 | | GemNet/PaiNN | 最新高精度 3D-GNN | 2021-2022 |
白话:图神经网络把分子"画成一张关系网"——每个原子跟谁连着、连的是什么键,AI 通过"消息传递"(每个原子问邻居"你是什么")来理解整个分子。这种方式天然适合化学结构,比 SMILES 更能捕捉拓扑信息。
4.5 四种表示方法对比¶
| 表示方法 | 输入形式 | 维度 | 优点 | 缺点 | 典型模型 |
|---|---|---|---|---|---|
| SMILES | 字符串 | 1D | 简洁,可用 NLP | 非唯一,丢失 3D 信息 | Transformer, ChemBERTa |
| 分子指纹 | 二进制向量 | 1D | 计算快,相似性搜索好 | 信息有损,不可逆 | RF, XGBoost, SVM |
| 3D 构象 | 原子坐标 | 3D | 保留空间信息 | 构象不唯一,计算贵 | SchNet, DimeNet |
| 分子图 | 图结构 | 拓扑 | 自然表达化学结构 | 需要专门的 GNN | MPNN, GAT, GIN |
5. 常用工具¶
5.1 RDKit —— 化学信息学的"瑞士军刀"¶
- 定位:开源化学信息学工具包,Python/C++ 实现
- 功能:SMILES 解析、分子指纹计算、描述符计算、子结构搜索、分子可视化、反应处理
- 安装:
conda install -c conda-forge rdkit(推荐 conda) - 版本:2025.09.6(截至最新文档)
- 地位:药物发现领域 Python 生态的基石,几乎所有 AI 药物发现项目都依赖它
- 官网:https://www.rdkit.org/
5.2 DeepChem —— 生命科学深度学习框架¶
- 定位:专为药物发现/材料科学/量子化学设计的深度学习库
- 功能:内置数据集(MoleculeNet 基准集)、分子特征化、多种模型(GCN、GAT、AttentiveFP、Weave)、多任务学习
- 安装:
pip install deepchem - 地位:类似"药物发现版的 scikit-learn",入门首选
- 官网:https://deepchem.io/
- 配套书籍:《The DeepChem Book》(免费电子版)
5.3 AutoDock Vina —— 经典分子对接引擎¶
- 定位:开源分子对接(Docking)软件,预测小分子与蛋白质的结合方式和结合能
- 原理:基于评分函数 + 全局搜索算法,在蛋白质结合口袋中搜索配体的最佳姿态
- 版本:v1.2.x(2021 年后由 Scripps 团队持续维护,GitHub: ccsb-scripps/AutoDock-Vina)
- 安装:
conda install -c conda-forge vina或从 GitHub 编译 - 输入:蛋白质结构(PDBQT 格式)+ 配体分子(PDBQT 格式)+ 对接盒子坐标
- 输出:结合姿态(pose)+ 结合亲和力(kcal/mol)
- 白话:AutoDock Vina 就像"模拟钥匙插锁"——它会尝试把药物分子以各种角度"塞进"蛋白质口袋,然后给每种姿态打分,找到最合适的插入方式
5.4 DiffDock —— 深度学习分子对接¶
- 定位:MIT 团队 2022 年发表的基于扩散模型的分子对接方法(ICLR 2023)
- 原理:将对接问题建模为"在配体位姿流形上的扩散生成过程",同时优化平移、旋转、扭转角三个自由度
- 核心优势:
- 在 PDBBind 数据集上 Top-1 成功率 38%(RMSD<2A),显著超越传统对接方法(23%)和之前的深度学习方法(20%)
- 对 AlphaFold 预测的结构也能保持较高精度(21.7% vs 之前方法最高 10.4%)
- 推理速度快,且能给出置信度估计
- vs AutoDock Vina:Vina 是基于物理评分函数的搜索,DiffDock 是学习数据分布后的生成,二者可互补
- 论文:Corso et al., "DiffDock: Diffusion Steps, Twists, and Turns for Molecular Docking", ICLR 2023
- 代码:https://github.com/gcorso/DiffDock
5.5 工具选型速查¶
| 任务 | 首选工具 | 备选 |
|---|---|---|
| 分子读写/描述符 | RDKit | Open Babel |
| 分子性质预测 | DeepChem | scikit-learn + RDKit |
| 传统分子对接 | AutoDock Vina | GOLD, Glide |
| 深度学习对接 | DiffDock | EquiBind, TANKBind |
| 蛋白质结构预测 | AlphaFold2/3 | ESMFold, ColabFold |
| 蛋白质设计 | RFdiffusion(见 42 篇) | Chroma, FrameDiff |
| 分子生成 | REINVENT, MolGPT | 参考 DeepChem 生成模型 |
6. 虚拟筛选实操:RDKit 分子描述符计算 + 简单预测模型¶
以下代码演示完整的虚拟筛选 pipeline:从 SMILES 计算分子描述符,训练一个简单的活性预测模型。
"""
虚拟筛选实操:RDKit 描述符 + 随机森林预测模型
环境:conda activate bioinfo
安装:conda install -c conda-forge rdkit scikit-learn pandas numpy matplotlib
"""
# ============ 第一步:导入必要的库 ============
from rdkit import Chem # RDKit 核心模块,处理分子对象
from rdkit.Chem import Descriptors # 分子描述符计算(分子量、LogP 等)
from rdkit.Chem import AllChem # 高级化学功能(指纹计算等)
from rdkit.Chem import Draw # 分子可视化
from rdkit import DataStructs # 指纹相似度计算
import numpy as np # 数值计算
import pandas as pd # 数据处理
from sklearn.model_selection import train_test_split # 数据集划分
from sklearn.ensemble import RandomForestClassifier # 随机森林分类器
from sklearn.metrics import ( # 评估指标
accuracy_score, roc_auc_score,
classification_report, confusion_matrix
)
import matplotlib.pyplot as plt # 绑图
import warnings # 忽略一些无关紧要的警告
warnings.filterwarnings('ignore')
# ============ 第二步:准备示例数据 ============
# 白话:这里模拟一个"药物活性数据集"
# - SMILES:分子的文字表示
# - active:1=有活性(能跟靶点结合),0=无活性
# 实际项目中,数据来自 ChEMBL / PubChem 等公共数据库
data = {
'smiles': [
# 活性分子(active=1)—— 含有某些有利于结合的子结构
'CC(=O)Oc1ccccc1C(=O)O', # 阿司匹林
'CC12CCC3C(C1CCC2O)CCC4=CC(=O)CCC34C', # 睾酮
'CN1C=NC2=C1C(=O)N(C(=O)N2C)C', # 咖啡因
'CC(C)CC1=CC=C(C=C1)C(C)C(=O)O', # 布洛芬
'OC(=O)C1=CC=CC=C1O', # 水杨酸
'CC(=O)NC1=CC=C(O)C=C1', # 对乙酰氨基酚
'C1=CC=C(C=C1)C(=O)O', # 苯甲酸
'OC1=CC=CC=C1', # 苯酚
'CC(O)CC1=CC=CC=C1', # 1-苯-2-丙醇
'CC1=CC=C(C=C1)C(C)C(=O)O', # 类布洛芬
'CC(=O)OC1=CC=CC=C1C(O)=O', # 乙酰水杨酸变体
'OC(=O)C1=CC=C(O)C=C1', # 4-羟基苯甲酸
],
'active': [1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0]
}
df = pd.DataFrame(data)
print(f"数据集大小:{len(df)} 个分子")
print(f"活性分子:{sum(df['active'])} 个,非活性:{len(df)-sum(df['active'])} 个")
# ============ 第三步:SMILES → RDKit 分子对象 ============
# 白话:把文字描述变成 RDKit 能操作的"分子模型"
def smiles_to_mol(smiles):
"""将 SMILES 字符串转为 RDKit 分子对象"""
mol = Chem.MolFromSmiles(smiles) # 解析 SMILES
if mol is None: # 解析失败返回 None
print(f"警告:无法解析 SMILES: {smiles}")
return mol
df['mol'] = df['smiles'].apply(smiles_to_mol) # 对每行做转换
df = df.dropna(subset=['mol']) # 去掉解析失败的行
print(f"成功解析:{len(df)} 个分子")
# ============ 第四步:计算分子描述符 ============
# 白话:从分子结构中"提取特征",就像从病人身上量体温、血压、心率
def calc_descriptors(mol):
"""
计算常用药物化学描述符(基于 Lipinski 五规则 + 扩展)
Lipinski 五规则:口服药物的"基本门槛"
- 分子量 <= 500
- LogP <= 5(脂水分配系数,太油了穿不过细胞膜)
- 氢键供体 <= 5
- 氢键受体 <= 10
"""
desc = {
'MW': Descriptors.MolWt(mol), # 分子量(Molecular Weight)
'LogP': Descriptors.MolLogP(mol), # 脂水分配系数(越大越"油")
'HBA': Descriptors.NumHAcceptors(mol), # 氢键受体数(能接受氢键的原子)
'HBD': Descriptors.NumHDonors(mol), # 氢键供体数(能提供氢键的原子)
'TPSA': Descriptors.TPSA(mol), # 拓扑极性表面积(影响膜穿透)
'RotBonds': Descriptors.NumRotatableBonds(mol), # 可旋转键数(分子柔性)
'AromaticRings': Descriptors.NumAromaticRings(mol), # 芳环数量
'HeavyAtoms': Descriptors.HeavyAtomCount(mol), # 重原子数(非氢原子)
'Rings': Descriptors.RingCount(mol), # 环的总数
'Fraction_CSP3': Descriptors.FractionCSP3(mol), # sp3 碳比例(3D 复杂度)
}
return desc
# 对每个分子计算描述符
desc_list = [calc_descriptors(mol) for mol in df['mol']]
desc_df = pd.DataFrame(desc_list)
print("\n=== 分子描述符示例(前3个分子)===")
print(desc_df.head(3).to_string())
# ============ 第五步:计算 Morgan 分子指纹 ============
# 白话:除了数值描述符,还可以用"二进制指纹"——每一位代表有没有某个子结构
def calc_morgan_fp(mol, radius=2, n_bits=1024):
"""
计算 Morgan 指纹(也叫 ECFP,Extended Connectivity Fingerprint)
参数:
radius=2 → ECFP4(半径2,考虑每个原子周围2步以内的邻居)
n_bits=1024 → 指纹长度 1024 位
"""
fp = AllChem.GetMorganFingerprintAsBitVect(
mol, # 分子对象
radius, # 半径:决定考虑多远的邻居
nBits=n_bits # 输出向量长度
)
# 将 RDKit 指纹对象转为 numpy 数组
arr = np.zeros((n_bits,), dtype=np.int8) # 创建空数组
DataStructs.ConvertToNumpyArray(fp, arr) # 填充指纹数据
return arr
# 计算所有分子的 Morgan 指纹
fp_array = np.array([calc_morgan_fp(mol) for mol in df['mol']])
print(f"\nMorgan 指纹矩阵形状:{fp_array.shape}") # (n_molecules, 1024)
print(f"阿司匹林指纹中'1'的个数:{fp_array[0].sum()}(共 1024 位)")
# ============ 第六步:合并特征,训练模型 ============
# 白话:把描述符 + 指纹合在一起作为模型的输入特征
# 合并描述符和指纹
X_desc = desc_df.values # 描述符特征 (n, 10)
X_fp = fp_array # 指纹特征 (n, 1024)
X = np.hstack([X_desc, X_fp]) # 横向拼接 (n, 1034)
y = df['active'].values # 标签
print(f"\n合并后特征矩阵:{X.shape}")
print(f"标签分布:活性={sum(y)}, 非活性={len(y)-sum(y)}")
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(
X, y,
test_size=0.3, # 30% 做测试
random_state=42, # 固定随机种子,保证可重复
stratify=y # 分层采样,保持正负样本比例
)
# 训练随机森林模型
rf = RandomForestClassifier(
n_estimators=100, # 100 棵决策树
max_depth=5, # 每棵树最大深度
random_state=42, # 随机种子
class_weight='balanced' # 自动平衡正负样本权重
)
rf.fit(X_train, y_train) # 训练
# 预测和评估
y_pred = rf.predict(X_test) # 预测类别
y_proba = rf.predict_proba(X_test)[:, 1] # 预测概率
print("\n=== 模型评估 ===")
print(f"准确率:{accuracy_score(y_test, y_pred):.2f}")
print(f"分类报告:\n{classification_report(y_test, y_pred, target_names=['非活性','活性'])}")
# ============ 第七步:对新分子做虚拟筛选 ============
# 白话:模型训练好了,现在拿新分子来"预测"它有没有活性
new_smiles_list = [
'CC(=O)OC1=CC=CC=C1', # 乙酸苯酯
'C1=CC=C(C=C1)CC(=O)O', # 苯乙酸
'CCCCCCCCCC', # 癸烷(纯碳链,通常无活性)
]
print("\n=== 虚拟筛选结果 ===")
for smi in new_smiles_list:
mol = Chem.MolFromSmiles(smi) # 解析 SMILES
if mol is None:
print(f" {smi} → 解析失败")
continue
# 计算特征
desc = calc_descriptors(mol) # 描述符
fp = calc_morgan_fp(mol) # 指纹
features = np.hstack([ # 合并
list(desc.values()), fp
]).reshape(1, -1) # reshape 成 (1, n_features)
# 预测
prob = rf.predict_proba(features)[0][1] # 活性概率
label = "活性" if prob > 0.5 else "非活性"
print(f" {smi}")
print(f" → 预测:{label}(活性概率={prob:.3f})")
print(f" → MW={desc['MW']:.1f}, LogP={desc['LogP']:.2f}, HBD={desc['HBD']}, HBA={desc['HBA']}")
print("\n提示:这是教学示例,样本量很小。实际项目中:")
print(" - 数据量:ChEMBL 数据库有数百万条活性数据")
print(" - 特征:可结合 DeepChem 的图神经网络特征")
print(" - 模型:可用 XGBoost、深度学习等更复杂模型")
print(" - 评估:需要交叉验证 + 外部测试集验证")
7. AlphaFold 在药物设计中的角色¶
本篇聚焦 AlphaFold 在药物发现中的应用角色,与第 42 篇 RFdiffusion(蛋白质从头设计)互补不重复。
7.1 AlphaFold 解决了什么问题¶
AlphaFold(DeepMind 开发)解决的是蛋白质结构预测问题:给定氨基酸序列,预测其 3D 结构。
- AlphaFold2(2021,Nature):CASP14 竞赛中准确率达到实验精度(GDT > 90),被认为"解决了"蛋白质折叠问题
- AlphaFold Protein Structure Database:已发布超过 2 亿个 蛋白质结构预测(几乎覆盖所有已知蛋白)
- AlphaFold3(2024,Nature):不仅预测蛋白质,还能预测蛋白质与 DNA、RNA、小分子、离子的复合物结构
7.2 AlphaFold 对药物发现的四大贡献¶
1. 提供靶点结构(最直接的贡献) - 传统获取蛋白质结构:X 射线晶体学/冷冻电镜,耗时数月到数年,成功率有限 - 有了 AlphaFold:对于没有实验结构的靶点,可以直接用预测结构做虚拟筛选 - 白话:以前要"拍照"才能看到蛋白质长什么样,现在 AI 帮你"画"出来,虽然不如照片精确但足够用
2. 揭示药物结合口袋 - AlphaFold 预测的结构可以用来分析"哪里有洞可以塞药"(结合口袋分析) - 配合 FPocket、SiteMap 等口袋检测工具,快速定位可成药位点
3. 作为 DiffDock 等对接工具的输入 - DiffDock 论文证实:在 AlphaFold 预测结构上做对接,DiffDock 的精度(21.7%)远超传统方法(<10.4%) - 这意味着 AlphaFold + DiffDock 可以在没有任何实验结构的情况下完成虚拟筛选
4. 理解突变对药物结合的影响 - 比较野生型和突变型蛋白的 AlphaFold 预测结构,分析突变如何改变结合口袋形状 - 对耐药性研究和个体化用药有直接价值
7.3 AlphaFold vs RFdiffusion:互补关系¶
| 维度 | AlphaFold(本篇) | RFdiffusion(第42篇) |
|---|---|---|
| 任务 | 预测已知蛋白的结构 | 设计自然界不存在的新蛋白 |
| 方向 | 序列 → 结构 | 功能 → 结构 → 序列 |
| 药物发现角色 | 提供靶点结构供筛选 | 设计新型蛋白药物/抗体 |
| 白话类比 | 给你照片,AI 帮你建 3D 模型 | 告诉 AI 你想要什么功能,它帮你设计全新的蛋白 |
| 联合使用 | AlphaFold 预测靶点结构 + DiffDock 对接 → 找小分子药物 | |
| RFdiffusion 设计结合靶点的新蛋白 → 蛋白药物/纳米抗体 |
7.4 AlphaFold 的局限性(面试加分点)¶
- 预测的是"静态"结构:蛋白质实际上是动态的,AlphaFold 给出的是最稳定构象,但药物结合常依赖构象变化
- 置信度不均匀:pLDDT 分数低的区域(通常是无序区域 / loop 区)预测不可靠,而这些区域常常是重要的药物靶点
- 不直接预测结合亲和力:AlphaFold 给出结构,但不能告诉你"药物跟这个蛋白结合有多紧"
- AlphaFold3 限制:虽然能预测复合物,但小分子配体的预测精度仍不如蛋白质主体
8. 面试怎么答¶
Q1:请简述 AI 在药物发现中的主要应用场景¶
答题框架:分阶段 + 具体例子
AI 贯穿药物发现全流程,主要在四个阶段发挥作用: 1. 靶点发现:用多组学数据整合和知识图谱推理发现新靶点,如 BenevolentAI 通过知识图谱发现 baricitinib 可用于治疗新冠 2. 化合物筛选:虚拟筛选(分子对接 + ML 模型)从数十亿分子中筛选候选药物,效率远超传统高通量筛选 3. ADMET 预测:ML 模型预测药物的吸收、分布、代谢、排泄和毒性,减少后期失败风险 4. 临床优化:患者分层、剂量优化、自适应试验设计
成功案例:Insilico Medicine 的 ISM001-055,从 AI 发现靶点到进入临床 I 期仅用 18 个月,传统流程通常需要 4-6 年。
Q2:SMILES、分子指纹、分子图各有什么优缺点?什么场景用哪种?¶
答题框架:列表对比 + 场景匹配
- SMILES:文本形式,简洁通用,可直接送入 Transformer 等 NLP 模型;缺点是非唯一、丢失 3D 信息。适用于大规模化合物库存储和基于 NLP 的分子生成。
- 分子指纹(如 Morgan/ECFP):固定长度二进制向量,计算快速,适合传统 ML 模型(随机森林、XGBoost)和相似性搜索;缺点是信息有损且不可逆。适用于快速虚拟筛选和活性预测基线。
- 分子图 + GNN:原子为节点、键为边,天然表达化学拓扑结构,能捕捉子结构信息;需要专用 GNN 模型。适用于需要高精度的性质预测和端到端学习。
- 3D 构象:保留空间信息,适用于对接和需要考虑空间构型的预测(如手性药物)。
实际项目中常组合使用:指纹做快速粗筛,GNN 做精细排序。
Q3:AlphaFold 对药物发现有哪些贡献和局限?¶
贡献: 1. 为没有实验结构的靶点提供预测结构,使虚拟筛选成为可能 2. AlphaFold DB 覆盖 2 亿+ 蛋白质,极大扩展了可成药靶点空间 3. DiffDock 证明在 AlphaFold 结构上对接效果远超传统方法 4. AlphaFold3 可预测蛋白-小分子复合物结构
局限: 1. 预测是静态结构,无法反映蛋白质动力学和构象变化 2. 无序区域(低 pLDDT)预测不可靠,而这些区域常是药物靶点 3. 不直接预测结合亲和力 4. 小分子配体在复合物中的预测精度仍有待提高
Q4:什么是虚拟筛选?请描述一个基本的虚拟筛选流程¶
虚拟筛选(Virtual Screening)是用计算方法从大规模化合物库中筛选可能与靶点结合的候选分子,减少实验筛选量。
基本流程: 1. 准备靶点结构:从 PDB 获取实验结构,或用 AlphaFold 预测 2. 准备化合物库:从 ZINC/Enamine 等数据库获取,通常百万到十亿量级 3. 粗筛(类药性过滤):Lipinski 五规则、PAINS 过滤器去除明显不合适的分子 4. 计算筛选: - 基于配体的方法:分子指纹相似性搜索、ML 活性预测模型 - 基于结构的方法:分子对接(AutoDock Vina / DiffDock) 5. 排序和精筛:对 Top 候选分子做 ADMET 预测、可合成性评估 6. 实验验证:购买/合成 Top 50-200 个分子做体外实验验证
关键指标:命中率(Hit Rate)和富集因子(Enrichment Factor)。
Q5:RDKit 中如何计算分子描述符和指纹?简述代码思路¶
from rdkit import Chem from rdkit.Chem import Descriptors, AllChem # 1. SMILES → 分子对象 mol = Chem.MolFromSmiles('CC(=O)Oc1ccccc1C(=O)O') # 2. 计算描述符 mw = Descriptors.MolWt(mol) # 分子量 logp = Descriptors.MolLogP(mol) # LogP hba = Descriptors.NumHAcceptors(mol) # 氢键受体 # 3. 计算 Morgan 指纹(ECFP4) fp = AllChem.GetMorganFingerprintAsBitVect(mol, radius=2, nBits=2048) # 4. 用于 ML:转为 numpy 数组 import numpy as np from rdkit import DataStructs arr = np.zeros((2048,)) DataStructs.ConvertToNumpyArray(fp, arr)核心流程:SMILES → MolFromSmiles() → 描述符/指纹 → numpy 数组 → 送入 ML 模型。
9. 速查表¶
9.1 药物发现 AI 工具速查¶
| 工具 | 功能 | 安装 | 一句话 |
|---|---|---|---|
| RDKit | 化学信息学基础库 | conda install -c conda-forge rdkit | 分子读写/描述符/指纹/可视化 |
| DeepChem | 生命科学 DL 框架 | pip install deepchem | 内置数据集+模型+特征化 |
| AutoDock Vina | 分子对接 | conda install -c conda-forge vina | 经典物理评分函数对接 |
| DiffDock | DL 分子对接 | GitHub 源码安装 | 扩散模型对接,精度最高 |
| AlphaFold | 蛋白质结构预测 | Docker / ColabFold | 2亿+结构,药物靶点来源 |
| Open Babel | 分子格式转换 | conda install -c conda-forge openbabel | SMILES/SDF/PDB/MOL2 互转 |
9.2 分子描述符速查¶
| 描述符 | 含义 | Lipinski 阈值 | RDKit 函数 |
|---|---|---|---|
| MW | 分子量 | <= 500 | Descriptors.MolWt(mol) |
| LogP | 脂水分配系数 | <= 5 | Descriptors.MolLogP(mol) |
| HBD | 氢键供体数 | <= 5 | Descriptors.NumHDonors(mol) |
| HBA | 氢键受体数 | <= 10 | Descriptors.NumHAcceptors(mol) |
| TPSA | 拓扑极性表面积 | <= 140 A^2(口服) | Descriptors.TPSA(mol) |
| RotBonds | 可旋转键数 | <= 10 | Descriptors.NumRotatableBonds(mol) |
| QED | 类药性综合评分 | 越接近1越好 | Chem.QED.qed(mol) |
9.3 分子指纹类型速查¶
| 指纹 | 函数 | 典型参数 | 适用 |
|---|---|---|---|
| Morgan/ECFP4 | GetMorganFingerprintAsBitVect | radius=2, nBits=2048 | 活性预测、相似搜索 |
| MACCS | GetMACCSKeysFingerprint | 166 位固定 | 快速粗筛 |
| RDKit FP | RDKFingerprint | fpSize=2048 | 通用 |
| Atom Pair | GetAtomPairFingerprintAsBitVect | nBits=2048 | 子结构多样性 |
9.4 SMILES 常用符号速查¶
| 符号 | 含义 | 示例 |
|---|---|---|
| C, N, O, S | 脂肪族原子 | CCO = 乙醇 |
| c, n, o | 芳香族原子 | c1ccccc1 = 苯 |
| = | 双键 | C=O = 甲醛 |
| # | 三键 | C#N = 氰化氢 |
| () | 分支 | CC(=O)O = 乙酸 |
| [] | 指定电荷/同位素 | [Na+] = 钠离子 |
| 数字对 | 成环 | C1CCCCC1 = 环己烷 |
| / \ | 顺反异构 | /C=C\ = 顺式 |
| @ @@ | 手性 | C@@H = R/S构型 |
10. 延伸资源¶
书籍¶
- 《Deep Learning for the Life Sciences》(O'Reilly)—— DeepChem 团队著,AI 药物发现入门首选
- 《Artificial Intelligence in Drug Design》(Springer, 2022)—— 系统综述 AI 在药物设计各阶段的应用
公开课¶
- MIT 6.S897: Machine Learning for Healthcare(含药物发现模块)
- Coursera: AI for Medicine(deeplearning.ai,Andrew Ng 团队)
- DeepChem Tutorials:https://deepchem.io/tutorials/ (免费,覆盖分子性质预测、分子生成、对接)
数据库¶
- ChEMBL:https://www.ebi.ac.uk/chembl/ —— 最大的药物活性数据库(>2百万化合物,>20百万活性数据点)
- PubChem:https://pubchem.ncbi.nlm.nih.gov/ —— NIH 化合物数据库(>1亿化合物)
- ZINC:https://zinc.docking.org/ —— 用于虚拟筛选的化合物库(>2.3亿可购买分子)
- PDBBind:http://www.pdbbind.org.cn/ —— 蛋白-配体复合物结合亲和力数据
- MoleculeNet:https://moleculenet.org/ —— ML 分子性质预测基准数据集
论文¶
- Jumper et al., "Highly accurate protein structure prediction with AlphaFold", Nature 2021(AlphaFold2)
- Abramson et al., "Accurate structure prediction of biomolecular interactions with AlphaFold 3", Nature 2024(AlphaFold3)
- Corso et al., "DiffDock: Diffusion Steps, Twists, and Turns for Molecular Docking", ICLR 2023
- Stokes et al., "A Deep Learning Approach to Antibiotic Discovery", Cell 2020(AI 发现新抗生素 Halicin,里程碑论文)
- Zhavoronkov et al., "Deep learning enables rapid identification of potent DDR1 kinase inhibitors", Nature Biotechnology 2019(Insilico Medicine 早期工作)
相关知识库文档¶
- 第 42 篇:AI 蛋白质设计 —— RFdiffusion(蛋白质从头设计,与本篇互补)
- 第 13 篇:蛋白质结构预测基础(如有)
- 第 01-05 篇:Python/Linux/生信基础
最后提醒:AI 辅助药物发现是生信领域最火的交叉方向之一。面试时不需要你精通药物化学,但要能说清楚:(1) AI 解决了药物发现中的哪些痛点;(2) 分子怎么表示成计算机能处理的数据;(3) 至少能用 RDKit 做基础的描述符计算和虚拟筛选。这三点覆盖了,AIDD 相关问题基本都能应对。