224

CLI Agent 调用 CADD 工具:AI Agent 如何驱动计算流程

用 LLM Agent 通过命令行编排 RDKit、对接、模拟等工具,把零散步骤串成自动化流程。这篇给出可落地的架构、工具封装规范与必须设置的护栏。

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 做编排与重复劳动,科学判断留给人。

延伸资源