跳转至

AI 辅助药物发现入门

1. 一句话说明

AI 辅助药物发现(AI-Aided Drug Discovery, AIDD)是利用机器学习和深度学习技术加速药物研发全流程——从靶点发现、先导化合物筛选、ADMET 预测到临床试验优化——将传统需要 10-15 年、耗资 10-26 亿美元的新药研发周期大幅压缩。


2. 传统药物发现流程 vs AI 加速:白话对比

2.1 传统流程(像大海捞针)

传统新药研发被称为"双十工程"——平均耗时 10+ 年、花费 10+ 亿美元,且成功率极低(进入临床试验的候选药物仅约 10% 最终获批上市)。

传统流程(串行,每步都慢):

靶点发现(2-3年)→ 先导化合物筛选(1-2年)→ 先导优化(1-2年)
  → 临床前研究(1-2年)→ 临床I/II/III期(5-7年)→ 审批上市

白话:就像从 一亿颗沙子 里找一颗金子。科学家先猜哪个蛋白可能是"坏蛋"(靶点),再从化合物库(几百万个分子)里一个一个试哪个能"治住坏蛋",试完还要看毒性、吸收、代谢……每一步都靠实验,贵且慢。

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 字符串表示分子结构,类似分子的"一维文字描述"。

# SMILES 示例
水:O
乙醇:CCO
苯:c1ccccc1
阿司匹林:CC(=O)Oc1ccccc1C(=O)O
咖啡因:Cn1c(=O)c2c(ncn2C)n(C)c1=O

规则: - 大写字母 = 脂肪族原子(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
分子图图结构拓扑自然表达化学结构需要专门的 GNNMPNN, 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 工具选型速查

任务首选工具备选
分子读写/描述符RDKitOpen Babel
分子性质预测DeepChemscikit-learn + RDKit
传统分子对接AutoDock VinaGOLD, Glide
深度学习对接DiffDockEquiBind, TANKBind
蛋白质结构预测AlphaFold2/3ESMFold, 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经典物理评分函数对接
DiffDockDL 分子对接GitHub 源码安装扩散模型对接,精度最高
AlphaFold蛋白质结构预测Docker / ColabFold2亿+结构,药物靶点来源
Open Babel分子格式转换conda install -c conda-forge openbabelSMILES/SDF/PDB/MOL2 互转

9.2 分子描述符速查

描述符含义Lipinski 阈值RDKit 函数
MW分子量<= 500Descriptors.MolWt(mol)
LogP脂水分配系数<= 5Descriptors.MolLogP(mol)
HBD氢键供体数<= 5Descriptors.NumHDonors(mol)
HBA氢键受体数<= 10Descriptors.NumHAcceptors(mol)
TPSA拓扑极性表面积<= 140 A^2(口服)Descriptors.TPSA(mol)
RotBonds可旋转键数<= 10Descriptors.NumRotatableBonds(mol)
QED类药性综合评分越接近1越好Chem.QED.qed(mol)

9.3 分子指纹类型速查

指纹函数典型参数适用
Morgan/ECFP4GetMorganFingerprintAsBitVectradius=2, nBits=2048活性预测、相似搜索
MACCSGetMACCSKeysFingerprint166 位固定快速粗筛
RDKit FPRDKFingerprintfpSize=2048通用
Atom PairGetAtomPairFingerprintAsBitVectnBits=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 相关问题基本都能应对。