新药筛选从来不是缺工具,而是缺"串联"。从靶点数据库检索、分子对接计算、ADMET 预测到合成路径规划,每一步都有成熟软件和模型,但它们接口各异、数据格式不统一,研究者不得不在十几个工具之间手动搬运数据。上海 AI 实验室与北京大学联合团队开源的智能体 MolClaw,试图用一套科学智能上下文协议(Scientific Context Protocol,SCP)终结这种碎片化局面。
新药筛选的"拼图困境"
传统药物发现流程大致经历靶点确认 → 苗头化合物筛选 → 先导化合物优化 → 成药性评估四个阶段。每个阶段都有专用工具:
| 阶段 | 常用工具 | 数据格式 |
|---|---|---|
| 靶点检索 | UniProt、PDB | PDB/mmCIF |
| 分子对接 | AutoDock Vina、Glide | PDBQT/SDF |
| ADMET 预测 | ADMETlab、SwissADME | CSV/JSON |
| 合成规划 | RetroSyn、RDKit | SMILES/MOL |
问题在于:PDB 文件要转 PDBQT 才能喂给 Vina;对接结果要转 SMILES 才能做 ADMET;每一步的中间产物都需要人工清洗格式、补全字段。一个完整筛选流程可能涉及 6-8 次格式转换和参数传递,任何一步出错就得重来。
MolClaw 的核心思路是:让智能体代替人做格式适配和流程编排,研究者只关心科学意图。
SCP 协议:科学工具的"通用插头"
SCP(Scientific Context Protocol)是 MolClaw 的底层通信协议,作用类似于 LLM 生态中的 MCP(Model Context Protocol),但面向科学计算场景做了扩展:
- 统一工具描述:每个科学工具(数据库、计算软件、预测模型)用标准 JSON Schema 描述其输入/输出接口、参数约束和资源需求。
- 上下文传递:上游工具的输出自动封装为 SCP Context 对象,下游工具可直接消费,无需手动转换。
- 长程任务追踪:药物筛选流程往往跨数小时甚至数天,SCP 支持任务状态持久化和断点续跑。
这意味着,当你告诉 MolClaw "针对 EGFR T790M 突变筛选候选抑制剂",它自己会去 UniProt 拿靶点结构、调 Vina 做对接、调 ADMETlab 评估毒性——全程数据在 SCP 管道里流转,不再需要你写转换脚本。
多层级技能体系:从原子操作到复合流程
MolClaw 把工具调用能力组织成三层技能:
- 原子技能(Atomic Skill):单个工具的一次调用,如"用 RDKit 计算 LogP"、"用 Vina 对接一个分子到指定靶点"。
- 组合技能(Composite Skill):多个原子技能按固定顺序编排,如"对接 + ADMET 评估"的两步流水线。
- 流程技能(Pipeline Skill):带条件分支和循环的完整筛选流程,如"批量筛选 → 按得分过滤 → 对 Top-K 做深度优化"。
研究者可以按需调用不同层级——快速验证一个分子用原子技能,跑完整筛选用流程技能。技能定义以 YAML 声明,下面是一个实际可改造的示例。
实践:用 MolClaw 搭一条苗头化合物筛选流水线
以下示例展示如何用 MolClaw 的技能定义格式,声明一条"靶点对接 → ADMET 过滤 → Top-K 输出"的组合技能。假设你已经按官方仓库指引完成了安装:
# 克隆仓库并安装
git clone https://github.com/IDEA-XL/MolClaw.git
cd MolClaw
pip install -e ".[all]"
# 验证安装
molclaw --version
定义一条组合技能
# skills/screen_hit_compounds.yaml
name: screen_hit_compounds
description: "针对指定靶点批量筛选苗头化合物,过滤高毒性分子,输出 Top-K 候选"
level: composite
atomic_skills:
- id: fetch_target
tool: uniprot_fetcher
inputs:
uniprot_id: "{{ target_uniprot_id }}"
outputs:
pdb_path: str
- id: batch_dock
tool: vina_docking
inputs:
receptor_pdb: "{{ fetch_target.pdb_path }}"
ligand_library: "{{ ligand_sdf_path }}"
exhaustiveness: 8
outputs:
docking_results: list[dict]
- id: admet_filter
tool: admet_predictor
inputs:
molecules: "{{ batch_dock.docking_results }}"
filters:
hepatotoxicity_threshold: 0.7
logp_range: [0.0, 5.0]
outputs:
filtered_molecules: list[dict]
- id: rank_top_k
tool: mol_ranker
inputs:
candidates: "{{ admet_filter.filtered_molecules }}"
k: "{{ top_k }}"
score_weights:
docking_score: 0.6
admet_score: 0.4
outputs:
top_candidates: list[dict]
pipeline:
- fetch_target
- batch_dock
- admet_filter
- rank_top_k
用 Python 调用这条技能
from molclaw import MolClawAgent
agent = MolClawAgent()
result = agent.run_skill(
skill_name="screen_hit_compounds",
params={
"target_uniprot_id": "P00533", # EGFR
"ligand_sdf_path": "/data/compound_library.sdf",
"top_k": 10,
},
)
# 查看筛选结果
for candidate in result["top_candidates"]:
print(
f"SMILES: {candidate['smiles']}, "
f"Docking: {candidate['docking_score']:.2f}, "
f"ADMET: {candidate['admet_score']:.2f}"
)
运行前需要确认两点:一是本地或远程已配置好 Vina 和 ADMETlab 的服务端(MolClaw 支持本地二进制和 API 两种调用模式),二是 compound_library.sdf 文件路径正确。如果靶点结构在 PDB 上已有现成文件,也可以跳过 fetch_target,直接在 batch_dock 里指定本地 PDB 路径。
自定义原子技能
当你需要接入团队自有的预测模型时,只需写一个原子技能描述:
# skills/my_custom_predictor.yaml
name: my_binding_affinity_model
description: "团队内部训练的结合亲和力预测模型"
tool_type: python_callable
inputs:
- name: smiles_list
type: list[str]
required: true
- name: target_seq
type: str
required: true
outputs:
- name: affinity_predictions
type: list[float]
entrypoint: my_pkg.predict_binding_affinity
resource_requirements:
gpu: 1
memory: 8Gi
MolClaw 会自动把这个原子技能注册到技能池,之后就能在组合技能或流程技能中引用它。
采纳建议与边界提醒
MolClaw 解决的是"工具串联"问题,不是"工具本身"问题——对接精度仍取决于 Vina 的算法,ADMET 预测仍取决于底层模型的训练数据。几点实际考量:
- 起步建议:先用原子技能逐个验证每个工具的输入输出是否正常,再组装成组合技能。不要一上来就跑完整流程,调试成本太高。
- 数据格式仍是痛点:SCP 做了自动封装,但极端情况下(比如 PDB 文件缺链信息、SDF 原子坐标异常),仍需人工介入清洗。建议在
batch_dock之前加一个sanitize_molecule原子技能。 - 长程任务的容错:批量筛选可能跑数小时,中途 Vina 进程崩溃不会导致整个流程丢失——SCP 会记录断点状态,
agent.run_skill支持resume_from参数续跑。 - 开源生态仍在早期:目前内置的原子技能覆盖了主流对接和 ADMET 工具,但合成路径规划、量子化学计算等方向的技能还在社区贡献阶段,接入自有模型是更现实的路径。
药物发现是长周期、高试错的工作。MolClaw 的价值不在于替代某个计算工具,而在于让研究者从"搬数据"回归到"做判断"——把格式转换和流程编排交给智能体,把科学决策留给人。