我做了一个药物 lead 优化 Agent:从一条 SMILES 到多轮候选筛选
最近做完了一个项目——Pharma Target Agent,一个面向药物化学早期筛选场景的 AI Agent,核心功能是给定靶点名称和一条起始 SMILES,自动生成候选分子并按多目标约束排序,支持持续迭代。
这篇文章记录一下它解决了什么问题、架构怎么设计的。
背景:lead optimization 为什么难用 AI 做?
药物发现里有一个阶段叫 lead optimization(先导化合物优化):你已经找到了一个对靶点有初步活性的分子,现在要在保持活性的前提下,把它的 ADME 性质、毒性、口服开发性都调到一个可接受的范围。
这件事难在哪里?
第一,它不是单目标优化。你不能只追 QED 高或者只追 LogP 合理,真实的药化优化需要同时盯着十几个指标,而且这些指标经常互相矛盾——把溶解性调好了,渗透性可能变差;降低毒性风险,活性可能跟着下去。
第二,它是迭代的过程,不是一次性筛选。药化学家不会看一轮候选就下结论,他们会根据这一轮的结果调整方向,选一个最有希望的分子作为下一轮的起点,一轮一轮往前推。
现有的 AI 工具大多是单次打分:扔进去一批分子,输出一个综合分,排个序。这对于"我想沿着某条 SAR 方向持续优化"的需求来说帮助有限。
Pharma Target Agent 想解决的就是这个问题。
架构设计
整体技术栈:LangChain ReAct + FAISS RAG + RDKit + SwissADME + ProTox3 + Streamlit。
Agent 层
用 LangChain 的 ReAct 框架搭 Agent 核心。每一轮优化大致是这个流程:
- 从 PubMed 检索靶点相关文献摘要
- 从本地 FAISS 索引检索药化规则(Lipinski、PAINS、Brenk 等)
- 把当前最优分子的 SMILES、文献摘要、规则约束一起喂给大模型
- 大模型在保留核心 scaffold 的前提下生成若干候选 SMILES
- 对候选做多参数评估
- 按多目标约束排序,选出下一轮种子分子
Agent 有两种运行模式。自动模式:系统自己选下一轮种子,满足目标或达到最大轮数后停止,适合快速跑通一个靶点。手动模式:每轮输出候选池,由用户指定下一轮种子,适合需要人工判断 SAR 方向的场景。
RAG 层
本地 FAISS 索引存的是药化规则库(drug_rules.txt),按块嵌入后检索。
嵌入目前走的是本地 hash 模式(LOCAL_EMBEDDING_MODE=hash),不依赖外部 embedding 服务,离线可用。如果有更好的嵌入模型,换一下配置就行。
评分层
评分是这个项目里最花时间的部分,涉及三个数据源:
SwissADME 负责 ADME 性质:GI absorption、Bioavailability score、Lipinski / Veber / Ghose / Egan / Muegge 规则检查、PAINS / Brenk alerts、合成可及性、CYP 抑制、P-gp 情况。
RDKit 负责结构层面:合法性检查、理化性质补充、Bemis-Murcko scaffold 提取、指纹相似性、QED 计算和结构图渲染。
ProTox3 负责毒性档案:Toxicity Class(1–6)、LD50、active toxicity model 数量、organ toxicity active 数量、toxicity target binding。
这三个数据源的输出最终整合成四个内部分数:基础综合分、风险分、ProTox3 毒性分、最终综合分。
多目标约束排序
系统不是简单地按综合分排序,而是用五个目标参数做多目标约束:
| 参数 | 方向 |
|---|---|
| 目标综合分 | 越高越好 |
| 目标风险分上限 | 越低越好 |
| 目标 ProTox3 分 | 越高越好 |
| 目标 Bioavailability | 越高越好 |
| 目标毒性等级下限 | 越高越好(对应 ProTox3 的 Class 1–6) |
排序逻辑是:先看满足了多少个目标,再看综合分,再看风险分和毒性分。一个综合分略低但更安全、更满足约束的分子,会排在前面。这比"只追高分"更接近药化真实优化逻辑。
当前限制
说清楚这几点比较重要:
这套评分是早期药化筛选的经验型指标,不是实验结论。SwissADME 的 Bioavailability Score 不等于真实体内暴露,ProTox3 的 Toxicity Class 不等于真实毒性实验结果。高综合分不代表真实活性强,也不代表体内 PK 理想。
大模型生成的候选 SMILES 在结构合法性上做了检查,但化学合理性仍需人工核查。
代码和使用
项目开源在 GitHub:github.com/MaLanhui/pharma_agent
依赖 Python 3.10 / 3.11,候选生成默认走 DeepSeek API,.env.example 里有完整配置说明。
py -3.11 -m venv .venv
.venv\Scripts\activate
pip install -r requirements.txt
copy .env.example .env
python -m pharma_agent.rag.build_index
.\start_app.ps1结果展示
致谢
评分层依赖了两个非常好用的免费工具:
- SwissADME(Daina et al., Scientific Reports, 2017)— ADME 和药化规则预测
- ProTox 3.0(Banerjee et al., Nucleic Acids Research, 2024)— 毒性档案预测
没有这两个工具,这个项目的评分层基本上要重写一半。
