
最近在不少技术群里看到一类很典型的课程标题“【2026版】已经替大家付费了花7980买的AI虚拟筛选drug生信最新全套教学视频视频代码数据一应俱全从零基础到进阶学习看这套就够了”。说实话这类信息对刚接触生信的朋友诱惑力很大因为标题里的每一个词都踩在了“怕走弯路”的痛点上AI、虚拟筛选、药物发现、生信、全套资料。但如果你在计算化学或生物信息学这个方向待过一阵子就会意识到一个关键事实AI虚拟筛选课程真正值钱的不是那几十个小时的视频而是它帮你把一条跨学科的流水线串了起来。分子对接、化学信息学、机器学习打分、ADMET预测、数据结构获取这些工具和数据集大部分都是公开的真正的门槛在于你能否理解它们的适用边界能不能跑通一个最小闭环以及拿到结果后是否具备判断力。这篇文章不评价付费课程值不值。我更想做的事是站在一个做生信分析的人角度把这类课程通常会让学员掌握的“AI虚拟筛选 药物发现”技术栈彻底拆开。从基础概念、学习路线、环境搭建到分子对接代码、机器学习打分模型、公开数据集和排查方法全部整理成一篇可收藏、可跟着操作的内容。就算你一分钱不花也能通过这篇文章判断自己缺在哪一环然后照着学。1. 这篇文章真正要解决的问题如果你正在学习AI药物发现或者被领导安排去做虚拟筛选又或者只是对“AI 药”这个方向感兴趣你大概率会遇到下面几种情况课程目录看起来什么都讲但真正实操时连环境都装不起来。拿到一个分子对接脚本却不知道受体和配体文件怎么准备。跑完对接生成了几十个打分却不知道哪个分子值得进一步做湿实验验证。知道机器学习可以做 ADMET 预测但不知道特征怎么构造、数据集去哪找、评估指标怎么选。最尴尬的是收藏了几百个 GitHub 仓库却始终没有完整跑通过一条“从分子到打分”的流程。这篇文章要解决的就是这些“看起来简单、做起来断链”的问题。我给出的明确判断是AI虚拟筛选是一条多工具串联的计算管线不是某个单一模型或软件。你能不能在真实项目中用起来取决于你是否具备四个层面的能力化学信息学层面能处理分子表示、SMILES、SDF、分子指纹。结构生物学层面能获取并预处理蛋白质结构。计算化学层面能跑分子对接并理解打分函数。机器学习层面能构造特征、训练模型、选择评价指标。下面所有章节都会围绕这四层展开。2. AI虚拟筛选的基础概念与核心原理2.1 什么是虚拟筛选虚拟筛选Virtual Screening简单说就是通过计算方法从几百万甚至上千万个化合物分子里挑出最有可能与靶点蛋白结合、且性质相对友好的候选分子从而降低实验筛选的成本。没有虚拟筛选时药物发现早期阶段通常靠高通量实验筛选High-Throughput Screening需要把几百万个化合物物理放到孔板里测试成本高、周期长。虚拟筛选的定位不是替代实验而是在做实验之前先用计算把候选集压缩到几百个让后续实验验证更聚焦。2.2 三类主流方法虚拟筛选的方法论大致分成三类方法类型原理适用场景典型工具基于配体的虚拟筛选LBVS从已知活性分子出发通过相似性搜索寻找结构相近、性质相似的分子靶点结构未知但已有已知活性化合物RDKit、OpenBabel、DeepChem基于结构的虚拟筛选SBVS拿到靶点蛋白三维结构通过分子对接预测配体结合模式和亲和力有晶体结构或高质量同源建模结构AutoDock Vina、Glide、GOLD基于AI的增强筛选用机器学习模型预测活性、ADMET性质或用生成模型设计新分子需要跨多个性质过滤海量候选分子DeepChem、Chemprop、DiffSBDD在实际项目中这三类方法通常不是互斥的而是串成一条流水线。2.3 AI在虚拟筛选中的位置这里需要破除一个误区AI不是替代分子对接而是和传统方法互补。在传统流程里分子对接负责预测“配体能不能放进口袋、大概结合得多紧”但对接打分函数往往对溶剂效应、诱导契合等复杂物理化学过程简化得比较厉害。AI的作用主要出现在三个位置第一用机器学习模型构建更准确的打分函数替代或融合传统打分函数称为基于机器学习的打分ML-based scoring。例如用卷积神经网络直接学习蛋白-配体复合物的三维结构特征。第二用分类或回归模型预测化合物的ADMET性质比如是否透过血脑屏障、是否有肝毒性、水溶性如何。这能在对接之前就把“虽然有活性但性质太差”的分子过滤掉。第三用生成式AI设计新分子。这一步比筛选更进一步不是从已有分子库里挑而是生成全新的分子结构再配合对接和性质预测进行迭代优化。用一个通俗类比传统分子对接像相亲时看眼缘AI性质预测像查户口、问职业、看健康状况生成式AI像帮你按条件设计一个理想对象。只看眼缘不靠谱只查户口也见不到面真正高效的做法是每一层都用上。3. 从零基础到进阶的完整学习路线很多新手学这个方向失败不是因为笨而是因为按错误的顺序学习。比如一上来就啃《分子动力学模拟》或者直接跑深度学习模型结果概念崩了。更合理的路径是分六个阶段推进。3.1 阶段零编程与Linux基础目标能看懂 Python 代码能熟练用命令行操作文件。这个阶段不要追求高深掌握以下内容即可Python 基础语法尤其是 list、dict、Numpy 数组操作。Pandas 读写 CSV、筛选数据、分组统计。Linux 基本命令cd、ls、cp、tar、conda。能通过 SSH 登录服务器跑脚本。3.2 阶段一分子表示与化学信息学目标理解计算机怎么表示一个分子。你需要掌握SMILES 表示法例如阿司匹林的 SMILES 是CC(O)Oc1ccccc1C(O)O。SDF/MOL 文件格式包含原子坐标、键连接信息。分子指纹ECFP/Morgan指纹把分子转成向量用于相似度计算和机器学习。产出能力用 RDKit 读取、清洗、转换分子结构。3.3 阶段二蛋白结构获取与预处理目标拿到一个可以用于对接的蛋白质结构。你需要掌握从 PDB 数据库下载蛋白晶体结构。理解 Resolution、配体、水分子、链的基本概念。使用 PyMOL 或 OpenBabel 去除水分子、添加氢原子、分离受体与共晶配体。这个阶段最大的坑是直接用原始 PDB 做对接结果口袋被水分子和水合离子干扰打分完全失真。3.4 阶段三分子对接目标跑通第一个对接流程。常用工具是 AutoDock Vina。你需要理解盒子grid box的设置、打分函数、构象搜索的参数。先跑一个已知活性分子的复现实验判断你的流程是否可靠再去做大规模虚拟筛选。3.5 阶段四机器学习与ADMET预测目标能训练一个分类器判断化合物是否为活性分子或是否具有良好药代性质。你需要掌握特征构造RDKit描述符、分子指纹。模型选择随机森林、XGBoost、Graph Neural Network。评估指标ROC-AUC、PR-AUC、召回率。3.6 阶段五生成式AI与主动学习目标用生成模型设计新分子并和筛选流程组合成闭环。这个阶段需要掌握生成对抗网络、变分自编码器或扩散模型在分子生成上的使用同时了解强化学习和主动学习如何迭代优化生成结果。这是“进阶”部分适合已经能独立完成前四步的人。4. 环境准备与前置条件在学习虚拟筛选和生信分析之前建议先统一环境。Windows 用户强烈建议安装 WSL2 或使用云服务器因为很多生信工具在 Linux 下兼容性更好。4.1 创建 conda 环境conda create -n vscreen python3.9 -y conda activate vscreenPython 版本建议 3.9 或 3.10部分旧版分子对接工具链在新版本 Python 下可能存在兼容问题。如果你安装时遇到网络问题可以更换 conda 镜像源。4.2 安装核心 Python 库conda install -c conda-forge rdkit -y pip install numpy pandas scikit-learn matplotlibRDKit 是化学信息学的核心库负责分子读取、指纹计算、描述符计算。建议通过 conda 而不是 pip 安装 RDKit因为 conda 会帮你处理底层依赖。4.3 安装分子对接工具AutoDock Vina 可以直接通过官方 GitHub 或 conda 安装conda install -c bioconda autodock-vina -yOpenBabel 用于格式转换conda install -c conda-forge openbabel -y4.4 验证环境python -c from rdkit import Chem; print(Chem.MolFromSmiles(c1ccccc1) is not None) vina --version obabel -V如果上述命令都能正常输出说明基础环境已准备好。5. AI虚拟筛选核心代码示例这一章是整个文章的核心实操部分。我们通过三个代码示例跑通“分子处理 - 分子对接 - 机器学习预测”的最小闭环。5.1 用RDKit处理分子并生成指纹这个示例演示读取 SMILES、清洗分子、计算分子量/LogP、生成Morgan指纹并把分子写入SDF文件。# 文件路径scripts/01_rdkit_basics.py from rdkit import Chem from rdkit.Chem import Descriptors, AllChem, SDWriter # 1. 从 SMILES 创建分子对象 smiles CC(O)Oc1ccccc1C(O)O # 阿司匹林 mol Chem.MolFromSmiles(smiles) if mol is None: print(SMILES 无法解析) exit(1) # 2. 添加氢原子使分子更接近真实状态 mol Chem.AddHs(mol) # 3. 计算基础属性 mw Descriptors.MolWt(mol) logp Descriptors.MolLogP(mol) hbd Descriptors.NumHDonors(mol) hba Descriptors.NumHAcceptors(mol) print(f分子量: {mw:.2f}) print(fLogP: {logp:.2f}) print(f氢键供体: {hbd}) print(f氢键受体: {hba}) # 4. 生成 Morgan 指纹ECFP4 fp AllChem.GetMorganFingerprintAsBitVect(mol, radius2, nBits1024) print(fMorgan 指纹长度: {fp.GetNumBits()}) # 5. 写入 SDF 文件 writer SDWriter(output_aspirin.sdf) writer.write(mol) writer.close() print(已输出 output_aspirin.sdf)这段代码的核心价值在于在对接之前先把分子标准化避免因 SMILES 写法不一致导致结构差异。实际项目中建议批量读取 CSV 中的 SMILES 列逐条清洗并生成 3D 坐标。5.2 用AutoDock Vina跑分子对接分子对接前需要准备受体和配体文件。下面先用 RDKit 生成配体的 3D 坐标再通过 OpenBabel 转换为 PDBQT 格式最后调用 Vina 对接。# 文件路径scripts/02_prepare_ligand.py from rdkit import Chem from rdkit.Chem import AllChem from rdkit.Chem import SDWriter # 读取 SMILES 并生成 3D 坐标 smiles CC(O)Oc1ccccc1C(O)O mol Chem.MolFromSmiles(smiles) mol Chem.AddHs(mol) # 生成3D构象 result AllChem.EmbedMolecule(mol, AllChem.ETKDGv3()) if result 0: AllChem.MMFFOptimizeMolecule(mol) print(3D 构象生成成功) else: print(3D 构象生成失败请检查 SMILES) exit(1) # 保存为 SDF writer SDWriter(ligand_3d.sdf) writer.write(mol) writer.close()用 OpenBabel 转成 Vina 需要的 PDBQT 格式obabel ligand_3d.sdf -O ligand.pdbqt --gen3d这里需要说明一点RDKit 已经生成了 3D 坐标OpenBabel 的--gen3d会重新生成 3D 结构。如果你的输入已经是合理的三维结构可以去掉--gen3d避免结构被重新构建。更稳妥的方式是obabel ligand_3d.sdf -O ligand.pdbqt受体蛋白的 PDBQT 准备通常用 AutoDock Tools 或 ADFR 套件完成。核心操作是去除水分子、加氢、合并非极性氢。这一步手动操作较多建议你在 PyMOL 里先完成“去水 - 提取链 - 导出 PDB”再交给 OpenBabel 加氢。准备完成后执行对接vina \ --receptor receptor.pdbqt \ --ligand ligand.pdbqt \ --out docking_result.pdbqt \ --center_x 10.0 --center_y 20.0 --center_z 30.0 \ --size_x 20 --size_y 20 --size_z 20 \ --exhaustiveness 8参数解释参数含义--receptor受体蛋白的 PDBQT 文件路径--ligand配体分子的 PDBQT 文件路径--center_x/y/z对接盒子中心坐标通常位于蛋白口袋中心--size_x/y/z盒子尺寸需要覆盖整个口袋区域--exhaustiveness搜索充分度值越大结果越稳定时间也越久--out输出文件路径如果不知道活性口袋的坐标有两个方法一是查找文献中该蛋白的共晶配体坐标以共晶配体为中心二是使用 FPocket 或 DoGSiteScorer 预测口袋。对接完成后结果文件中会包含多个构象和打分。Vina 打分单位为 kcal/mol通常认为分数越负代表结合越强。但需要强调不能只看分数还要看对接构象是否合理比如氢键距离、疏水接触、是否与关键残基相互作用。5.3 用机器学习构建ADMET分类器虚拟筛选的进阶操作是用机器学习模型过滤候选分子。下面演示一个最简单的分类流程计算分子描述符作为特征训练 RandomForest 分类器输出 ROC-AUC 评估。# 文件路径scripts/03_admet_classifier.py import numpy as np import pandas as pd from rdkit import Chem from rdkit.Chem import Descriptors from sklearn.model_selection import train_test_split from sklearn.ensemble import RandomForestClassifier from sklearn.metrics import roc_auc_score, accuracy_score # 构造一个小型示例数据实际项目中请从 ChEMBL/BindingDB 获取更大规模数据 data [ (CC(O)Oc1ccccc1C(O)O, 1), # 阳性 (CCN(CC)CC, 0), # 阴性 (OC(NCc1ccc(Cl)cc1)CCC(O)O, 1), (c1ccccc1, 0), (CC(C)Cc1ccc(cc1)C(C)C(O)O, 1), (CCO, 0), ] def mol_features(smiles): mol Chem.MolFromSmiles(smiles) if mol is None: return None return [ Descriptors.MolWt(mol), Descriptors.MolLogP(mol), Descriptors.NumHDonors(mol), Descriptors.NumHAcceptors(mol), Descriptors.TPSA(mol), ] # 构造特征矩阵 X, y [], [] for smiles, label in data: feats mol_features(smiles) if feats is not None: X.append(feats) y.append(label) X np.array(X) y np.array(y) # 划分训练集和测试集 X_train, X_test, y_train, y_test train_test_split( X, y, test_size0.2, random_state42, stratifyy ) # 训练随机森林分类器 model RandomForestClassifier(n_estimators100, random_state42) model.fit(X_train, y_train) # 预测与评估 y_proba model.predict_proba(X_test)[:, 1] y_pred model.predict(X_test) print(ROC-AUC:, round(roc_auc_score(y_test, y_proba), 3)) # 输出特征重要性 feature_names [MolWt, LogP, NumHDonors, NumHAcceptors, TPSA] for name, importance in zip(feature_names, model.feature_importances_): print(f{name}: {importance:.3f})这里有一点必须说明上面只是一个流程演示真实场景中训练数据量至少需要几千甚至几万条样本并且要使用更丰富的分子指纹特征或图神经网络。6条数据训练出的模型没有实际预测价值但这个骨架可以迁移到真实项目中。6. 数据集获取与数据管理AI虚拟筛选和生信分析离不开数据。如果你正在学这个方向下面这几个数据库应该收藏起来。数据库用途常用操作PDB蛋白质三维结构按蛋白名称/UniProt ID检索下载PDB文件ChEMBL生物活性数据下载IC50/EC50/Ki数据构造分类标签BindingDB蛋白-配体结合数据用于训练打分函数或活性预测模型ZINC可购买化合物库大规模虚拟筛选的候选分子来源PubChem化合物信息查询SMILES、结构式、物化性质UniProt蛋白序列与功能查询靶点信息6.1 数据版本和版权问题从这些数据库下载数据时建议记录数据集名称、下载日期、版本号并保留原始文件。原因有两个一是复现实验时能追溯来源二是某些数据集的更新会改变模型评估结果这在实际项目中很容易被忽视。6.2 数据清洗规范生信分析中流传一句话垃圾进垃圾出。拿到分子数据后至少要做这些清洗操作去除无机盐片段、去除金属离子部分情况除外。中和电荷或明确记录 pH 条件下的主要形态。处理重复分子按标准SMILES InChIKey去重。去除无法解析的 SMILES。RDKit 提供了MolStandardize模块处理标准化问题建议在进入模型训练前统一执行。7. AI虚拟筛选常见问题与排查思路学习过程中你一定会遇到报错。这里整理了最常见的问题按“现象 - 可能原因 - 排查方式 - 解决方案”的思路拆解。问题现象可能原因排查方式解决方案RDKit 安装失败pip 下载的网络问题或依赖冲突查看完整报错信息改用conda install -c conda-forge rdkitSMILES 解析返回 NoneSMILES 写法有误或包含不在周期表内的原子单独复制 SMILES 到 RDKit 验证检查原子类型使用标准 SMILES 规范对接报错 “Error: could not open receptor”受体文件缺失或 PDBQT 格式错误检查文件路径查看文件头部内容重新用 AutoDock Tools 或 ADFR 生成 PDBQT对接结果打分全部是正值盒子位置没有对准活性口袋或受体结构异常可视化盒子与蛋白结构用共晶配体坐标定位口袋中心机器学习模型 ROC-AUC 接近 0.5特征不够或数据量太小或正负样本划分有问题检查训练集分布、特征数量增加分子指纹特征、扩大数据集、使用分层采样模型训练时显存不足分子图数据过大或 batch size 过大检查显存占用减小 batch size或简化分子图表示生成分子时全部生成相似结构生成模型训练不充分或强化学习奖励函数单一观察生成分子多样性指标增加多样性奖励、调整温度参数8. 最佳实践与工程建议AI虚拟筛选和生信分析不是“跑完脚本出结果”的流程而是需要工程化管理的研发过程。下面几条建议能帮你避开很多实际项目中的坑。8.1 设计清晰的目录结构建议每个虚拟筛选项目都使用这样的目录结构vscreen_project/ ├── data/ │ ├── raw/ # 原始数据禁止修改 │ ├── processed/ # 清洗后的数据 │ └── results/ # 对接和模型输出 ├── scripts/ # Python 和 Shell 脚本 ├── models/ # 训练好的模型文件 ├── docs/ # 实验记录和说明文档 └── logs/ # 运行日志这样做的好处是别人接手你的项目时能快速定位文件你不会出现“模型文件被覆盖”这种低级事故。8.2 固定随机种子训练机器学习模型时一定要固定随机种子。否则每次运行结果都不一样你很难判断模型效果的变化来自算法改进还是来自随机波动。推荐在脚本开头统一设置import random import numpy as np SEED 42 random.seed(SEED) np.random.seed(SEED)8.3 代码版本控制与备份代码和数据是研究生信的重要资产。建议使用 Git 做版本管理并定期推送到私有仓库。对于重要的数据集和训练好的模型至少做异地备份。生信任务往往要跑很长时间如果代码和数据因为误操作丢失重新运行的代价非常高。8.4 不要把对接分数当作最终结论这是 AI 虚拟筛选最容易误导新人的一点。AutoDock Vina 的打分函数基于简化的物理模型它的价值是排序和压缩候选集合而不是告诉你某个分子一定有效。更可靠的流程是用对接把所有候选分子排序。取 Top 100 做聚类分析保证多样性。对 Top 分子做更精确的 MM/PBSA 或 FEP 计算。结合 ADMET 预测和可合成性评估。最终交给实验验证。8.5 注意合法合规使用资源最后提一句网上的付费课程和数据集有版权限制。学习时建议优先使用官方教程、开源仓库、公开论文和数据库本身提供的资源。对于要价很高的课程先用本文的知识框架判断自己缺在哪一环再决定是否购买。很多时候你缺的不是课程而是一条明确的学习路径和反复练习的耐心。9. 总结与后续学习方向这篇文章从一套“售价不低的 AI 虚拟筛选 drug 生信课程”切入实际拆解了 AI 辅助虚拟筛选这条技术栈的完整知识体系。核心收获可以归纳为四点虚拟筛选是一条从分子表示、结构预处理到分子对接、AI 预测的流水线。真正难的不是装软件而是理解每个环节的输入输出和边界。从零基础到进阶的路线应当按“编程 - 化学信息学 - 蛋白结构 - 分子对接 - 机器学习 - 生成式AI”推进不要跳步。最小闭环可以通过 RDKit AutoDock Vina scikit-learn 实现本文全部给了可运行示例。数据和代码的管理能力决定你能走多快对打分函数和模型局限性的理解决定你能走多远。下一步建议你直接动手做一个小项目从 PDB 下载一个激酶蛋白结构从 ZINC 下载 1000 个分子用本文的代码完成一次虚拟筛选输出 Top 10 分子并分析它们的共同结构特征。这个项目做完你对 AI 虚拟筛选的理解会比看任何课程都深入。学完基础之后如果想继续进阶可以关注三个方向分子生成模型与强化学习结合、基于图神经网络的蛋白质-配体亲和力预测、以及 AlphaFold 类结构预测工具与虚拟筛选的串联。每个方向都有大量开源工具和公开数据集足以支撑长期学习。这篇内容建议收藏备用。等技术栈跑通了欢迎回来交流你的虚拟筛选实践经验和踩坑记录。