CADD 的日常是大量零散的命令行步骤:拉数据、清洗、生成构象、准备受体、对接、分析、出图。用 LLM Agent 把这些工具编排起来,让研究者用自然语言描述目标、由 Agent 拆解并调用工具,是当前很有实践价值的一个方向。但要做得可靠,关键不在模型,而在工具封装与护栏设计。
基本架构
| 层 | 职责 |
|---|---|
| 工具层 | 把每个 CADD 操作封装成参数明确、可独立测试的 CLI 或函数 |
| 描述层 | 为每个工具写清楚用途、参数、前置条件、失败模式 |
| 编排层 | LLM 负责拆解任务、选工具、串流程、读结果决定下一步 |
| 执行层 | 沙箱环境、资源限制、日志与产物归档 |
| 校验层 | 每步产物的自动检查,不合格就停下或重试 |
工具封装的规范
这是整个系统可靠性的地基。每个工具应满足:
- 单一职责:一个工具只做一件事。「准备受体」和「跑对接」要分开,便于定位失败。
- 参数显式:不要依赖隐含的当前目录或环境变量,所有输入输出路径显式传入。
- 结构化输出:返回 JSON 而非自由文本,让 Agent 能可靠解析。
- 失败要响亮:出错时返回明确的错误类型和原因,而不是静默产出空文件——静默失败是 Agent 流程最危险的情况。
- 幂等且可复现:固定随机种子,同样输入给同样输出。
#!/usr/bin/env python3
"""prepare_ligand.py —— 单一职责的工具示例"""
import json, sys, argparse
from rdkit import Chem
from rdkit.Chem import AllChem
def main():
ap = argparse.ArgumentParser()
ap.add_argument("--smiles", required=True)
ap.add_argument("--out", required=True)
ap.add_argument("--seed", type=int, default=0xf00d)
a = ap.parse_args()
mol = Chem.MolFromSmiles(a.smiles)
if mol is None:
print(json.dumps({"ok": False, "error": "invalid_smiles",
"detail": a.smiles})); sys.exit(1)
mol = Chem.AddHs(mol)
if AllChem.EmbedMolecule(mol, randomSeed=a.seed) != 0:
print(json.dumps({"ok": False, "error": "embed_failed"})); sys.exit(1)
AllChem.MMFFOptimizeMolecule(mol)
Chem.MolToMolFile(mol, a.out)
print(json.dumps({"ok": True, "out": a.out,
"n_atoms": mol.GetNumAtoms(),
"formula": Chem.rdMolDescriptors.CalcMolFormula(mol)}))
if __name__ == "__main__":
main()
必须设置的护栏
- 资源上限:对接分子数、模拟时长、GPU 时间都要设硬上限。Agent 判断失误可能提交一个跑几天的任务。
- 写入范围限制:只允许在指定工作目录内写文件,禁止删除操作或需人工确认。
- 关键步骤人工确认:提交大规模计算、决定候选分子清单、写入共享数据库前,应有人过目。
- 每步自动校验:对接完检查姿势是否在盒子内、是否有严重冲突;模拟完检查能量是否发散。校验不通过就中断,别让错误往下游传播。
- 完整留痕:记录每一步的命令、参数、版本、输入输出哈希。没有留痕的自动化流程无法排查,也无法作为结论依据。
现实的能力边界
- Agent 擅长:流程编排、参数格式转换、批量重复操作、根据报错调整命令、生成汇总报告。这些是明确的机械劳动。
- Agent 不擅长:判断结果是否有科学意义。它不会知道对接分数 −11 的分子其实是个不可能合成的怪物,也不会质疑一个明显错误的口袋定义。
- 所以:把它用在「把研究者从重复劳动里解放出来」,而不是「替研究者做判断」。科学判断必须留在人这一侧,Agent 负责把选项和证据准备好。
关键要点
- 系统可靠性取决于工具封装质量,不取决于模型多强;
- 工具要单一职责、结构化输出、失败响亮——静默失败最危险;
- 必设护栏:资源上限、写入范围、关键步骤人工确认、每步校验、完整留痕;
- Agent 做编排与重复劳动,科学判断留给人。
延伸资源
- 工程化落地:225《AI 制药工具工程化》;工具栈:171《RDKit》、182《AutoDock Vina》、200《OpenMM》;
- 实战流程见「实战流程」模块。