最近做完了一个项目——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 核心。每一轮优化大致是这个流程:

  1. 从 PubMed 检索靶点相关文献摘要
  2. 从本地 FAISS 索引检索药化规则(Lipinski、PAINS、Brenk 等)
  3. 把当前最优分子的 SMILES、文献摘要、规则约束一起喂给大模型
  4. 大模型在保留核心 scaffold 的前提下生成若干候选 SMILES
  5. 对候选做多参数评估
  6. 按多目标约束排序,选出下一轮种子分子

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)— 毒性档案预测

没有这两个工具,这个项目的评分层基本上要重写一半。

添加新评论

赞助商