
在化学信息学和计算化学领域里“in silico chemistry”已经不是新鲜词但如何设计一个真正贴近实验室场景的基准测试仍然是一块难啃的骨头。近期开始看到 onepot-Bench 这类方向被讨论它把目光从“标准数据集上的分数”拉回到“实验台上到底发生了什么”。这篇文章会围绕 onepot-Bench 0 所代表的 lab-aware in silico chemistry benchmarks梳理核心概念、设计思路、最小可运行示例以及实际搭建评估体系时容易踩的坑。适合正在做反应预测、条件推荐、化学数据建模的开发者阅读也适合想了解基准测试设计逻辑的初学者作为入门参考。1. 背景为什么需要实验室感知的化学基准1.1 关于 onepot-Bench 0“onepot”在化学里通常指一锅法也就是多个反应步骤在同一个反应容器中连续完成不需要中间分离。它能够减少操作步骤、节约试剂和设备消耗特别适合串联反应、多组分反应和自动化合成场景。而 Bench 0 在这里可以理解为该基准方向的初始版本面向的是 lab-aware 的基准测试设计不仅评估模型是否能在标准数据上预测准确还希望模型能感知实验室中的实际操作条件比如溶剂、温度、催化剂、当量比、反应时间、加料顺序等。换句话说onepot-Bench 0 的核心主张是一个有用的化学模型不能只在干净整齐的 benchmark 上表现好还应该能回答“如果我在实验室里按这个条件去做结果会怎样”的问题。1.2 in silico chemistry 解决什么问题in silico chemistry 泛指通过计算机模拟、计算化学、机器学习等手段来研究化学反应和分子性质。常见的应用包括反应产物预测。反应条件推荐。产率预测。选择性预测。催化剂和溶剂筛选。分子逆合成路线设计。这些任务如果只在标准数据集上做评测很容易出现高分低能的情况。因为实验记录中的条件参数、数据噪声、批次效应往往会被简化而真实实验室环境中这些因素恰恰是决定成败的关键。1.3 传统基准测试的局限性传统基准测试通常以公开数据集为依托把反应简化为“反应物 产物”的形式。这样做的好处是便于统一比较不同模型但坏处也很明显生产环境中的很多变量被抹掉了。具体来看常见问题有以下几点。条件信息缺失很多数据集只保存反应 SMILES 和产率不使用溶剂、温度、催化剂的完整信息。数据分布偏差公开数据集中的反应多来自文献专利和自家实验室的底物空间、试剂偏好差异很大。可重复性不足同一反应在不同仪器、不同批次试剂下产率差异明显但基准没有建模这种不确定性。指标过于单一只看 top-1 准确率或平均绝对误差无法反映模型在“实际合成可行性”上的优劣。1.4 lab-aware 基准的含义lab-aware实验室感知的意思是把实验室中的物理化学条件纳入基准设计和模型评估当中。例如训练集中是否包含完整的实验条件测试集的负样本是否来自真实失败的实验评估时是否考虑条件扰动带来的波动模型推荐的反应条件是否符合安全操作范围当基准设计开始关注这些问题它就不再只是一个静态分数排行榜而更像是连接计算模型和实验验证的桥梁。2. onepot-Bench 的核心概念拆解2.1 什么是 in silico chemistry benchmarkbenchmark 是一套用于评估算法性能的标准化任务、数据集和指标。in silico chemistry benchmark 则是面向化学计算模型的标准测试环境通常包括输入格式例如反应物 SMILES、条件向量、分子图。任务定义例如二分类、回归、排序。数据划分例如按反应类型划分、按模板划分、按时间划分。评估指标例如 RMSE、MAE、Top-k Accuracy、ROC-AUC。基线方法例如基于指纹的随机森林、基于图的 GNN、大语言模型微调。一个好的 benchmark 应当具备公开可复现、指标清晰、数据划分合理、任务贴近实际。2.2 传统基准与 lab-aware 基准的差异对比维度传统化学基准lab-aware 化学基准输入信息反应 SMILES、产物 SMILES反应 SMILES 条件参数 实验元数据任务目标预测产物/产率预测实验可行性、条件影响、波动范围数据来源文献/专利数据库实验室电子记录、自动化平台数据评估方式固定测试集指标留一实验、批次划分、条件扰动测试失败样本很少记录明确记录失败反应和实验闭环弱强支持主动学习从表格能看出lab-aware 基准不只是对已有数据进行重新打包而是从实验数据产生方式开始重新设计评估逻辑。2.3 “一锅法”场景为什么适合作为首个基准onepot-Bench 0 选择一锅法场景是有道理的。一方面一锅法合成在工业界有真实需求步骤短、效率高适合自动化筛选另一方面一锅法反应比单步反应更复杂涉及中间体兼容性、催化剂/试剂混用、加料顺序等条件这对模型是更有挑战的测试场。例如一个经典的两步一锅反应第一步生成中间体 A第二步加入新试剂继续反应得到最终产物 B。如果模型不清楚第一步结束后是否需要调 pH、是否必须降温它给出的反应条件就不具备实验可操作性。因此one-pot 场景天然适合作为“lab-aware”的试金石只有模型真正理解实验条件之间的依赖关系才能在该任务上取得好结果。3. 环境准备与项目结构3.1 运行环境下面要实现的示例是一个简化的 lab-aware 基准构建与评估脚本。建议环境如下操作系统Windows / Linux / macOS 均可。Python 版本3.9 或以上。核心依赖numpy、pandas、scikit-learn、rdkit。开发工具Jupyter Notebook 或 VS Code。如果你还没有安装相关依赖可以在命令行中执行pip install numpy pandas scikit-learn rdkit如果 RDKit 安装遇到问题推荐使用 Anaconda 安装conda install -c conda-forge rdkit3.2 项目结构规划我们把代码组织成一个小型项目便于后续扩展lab_aware_bench/ ├── data/ │ └── reactions_sample.csv ├── src/ │ ├── __init__.py │ ├── data_loader.py │ ├── features.py │ └── evaluate.py ├── scripts/ │ └── run_benchmark.py └── README.md其中data存放基准数据。src存放加载、特征化和评估代码。scripts存放入口脚本。README记录任务定义和运行方式。这个结构不是唯一的但能帮助你把数据、逻辑和入口解耦后续扩展新任务时不用改动太多。4. 完整实战构建一个实验室感知基准的最小示例4.1 定义任务为了不过度依赖真实化工数据本文使用“模拟反应记录”演示基准构建流程。任务定义为根据反应物结构信息、温度、溶剂极性、催化剂用量预测一锅法反应的产率区间。这是一个回归任务但也可以转换成三分类高产率70%、中产率30%70%、低产率30%。通过多分类指标我们能更直观对比不同条件组合下的模型表现。4.2 反应数据格式设计lab-aware 基准的数据格式建议至少包含三部分信息反应物结构、实验条件、结果标签。这里以 CSV 为例reaction_id,reactant_smiles,condition_temp,condition_solvent,condition_catalyst,condition_time,yield rxn001,CC(O)Oc1ccccc1C(O)O,80,toluene,DMAP,2,78.5 rxn002,CC(C)(C)OC(O)NCc1ccccc1,60,DCM,TEA,1,85.2 rxn003,COC1CCC(CC1)Br,100,DMF,Pd(PPh3)4,4,32.1这在真实项目中可以扩展为 JSON 嵌套格式把加料顺序、压力、溶剂体积等都包含进去。但 CSV 格式最直观适合做第一版。4.3 生成示例数据为了演示我们写一个脚本生成模拟数据。注意这里是模拟数据目的只是让流程跑通不代表任何真实化学实验结果。# scripts/generate_sample_data.py import pandas as pd import numpy as np np.random.seed(42) data [] solvents [toluene, DCM, DMF, THF] catalysts [DMAP, TEA, Pd(PPh3)4, None] for i in range(200): temp np.random.choice([60, 80, 100, 120]) solvent np.random.choice(solvents) catalyst np.random.choice(catalysts) time np.random.choice([1, 2, 4, 8]) reactant fR{i:03d} # 模拟一个简单的产率公式注意这里仅为演示 yield_val 50 if solvent DMF: yield_val 10 if catalyst Pd(PPh3)4: yield_val 15 if temp 100: yield_val - 8 yield_val np.random.normal(0, 5) yield_val max(0, min(100, yield_val)) data.append({ reaction_id: frxn{i:03d}, reactant_smiles: reactant, condition_temp: temp, condition_solvent: solvent, condition_catalyst: catalyst, condition_time: time, yield: round(yield_val, 2) }) df pd.DataFrame(data) df.to_csv(data/reactions_sample.csv, indexFalse) print(数据生成完成共, len(df), 条记录)运行方式python scripts/generate_sample_data.py这段代码生成了 200 条带有反应物编号、条件参数和模拟产率的记录。实际项目中你应该从电子实验记录本ELN导出数据保证反应器类型、搅拌速度等关键信息也是完整的。4.4 数据加载与特征化我们需要把 CSV 中的文本类条件编码成数值特征。# src/data_loader.py import pandas as pd from sklearn.preprocessing import LabelEncoder def load_reaction_data(path): df pd.read_csv(path) return df def encode_conditions(df): df df.copy() solvent_encoder LabelEncoder() catalyst_encoder LabelEncoder() df[solvent_code] solvent_encoder.fit_transform(df[condition_solvent]) df[catalyst_code] catalyst_encoder.fit_transform(df[condition_catalyst]) return df, solvent_encoder, catalyst_encoder这里使用 LabelEncoder 把溶剂和催化剂名称映射成整数。对于树模型这种编码方式够用如果后续使用神经网络建议改成 one-hot 编码或嵌入向量。4.5 构建特征矩阵我们采用经典的特征组合方式条件参数 条件间交互项。虽然这个示例没有真实分子结构但足够演示如何为模型准备输入。# src/features.py import pandas as pd def build_feature_matrix(df): features pd.DataFrame() features[temp] df[condition_temp] features[time] df[condition_time] features[solvent_code] df[solvent_code] features[catalyst_code] df[catalyst_code] # 增加温度和时间的交互项 features[temp_time] df[condition_temp] * df[condition_time] features[solvent_temp] df[condition_temp] * df[solvent_code] return features这个示例可以继续扩展如果你有分子 SMILES可以使用 RDKit 计算分子指纹、分子量、LogP 等描述符作为反应物结构特征。4.6 编写评估脚本评估流程包括数据划分、模型训练、指标计算。# src/evaluate.py import numpy as np from sklearn.ensemble import RandomForestRegressor from sklearn.model_selection import train_test_split from sklearn.metrics import mean_absolute_error, r2_score import pandas as pd from src.data_loader import load_reaction_data, encode_conditions from src.features import build_feature_matrix def evaluate_model(data_path): df load_reaction_data(data_path) df, _, _ encode_conditions(df) X build_feature_matrix(df) y df[yield].values X_train, X_test, y_train, y_test train_test_split( X, y, test_size0.2, random_state42 ) model RandomForestRegressor(n_estimators200, random_state42) model.fit(X_train, y_train) pred_train model.predict(X_train) pred_test model.predict(X_test) train_mae mean_absolute_error(y_train, pred_train) test_mae mean_absolute_error(y_test, pred_test) r2 r2_score(y_test, pred_test) print(训练集 MAE: {:.3f}.format(train_mae)) print(测试集 MAE: {:.3f}.format(test_mae)) print(测试集 R2: {:.3f}.format(r2)) return model这里我们选择随机森林作为基线模型。随机森林对异常值不敏感也能捕捉部分非线性关系是化学性质预测里很常见的 baseline。4.7 入口脚本最后写一个入口脚本串联整个流程。# scripts/run_benchmark.py import sys import os sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) from src.evaluate import evaluate_model if __name__ __main__: evaluate_model(data/reactions_sample.csv)运行命令python scripts/run_benchmark.py4.8 预期输出因为数据是模拟的每次随机种子固定后输出应该稳定。类似结果如下训练集 MAE: 4.123 测试集 MAE: 4.876 测试集 R2: 0.512这个结果说明两点流程本身已经跑通。模型在模拟数据上的预测能力有限说明特征和任务之间关系并不简单。真实场景中如果测试集 R2 很低需要重新审视特征设计、数据质量、样本量和模型选择。5. 常见问题与排查思路5.1 表格化排查问题现象常见原因解决思路RDKit 安装失败Python 环境冲突使用 Anaconda 创建独立环境并安装 rdkit数据读取时报错找不到文件工作目录不对使用绝对路径或在项目根目录运行脚本模型 R2 很低特征不足以解释产率补充真实分子指纹、工艺参数增加特征维度交叉验证结果波动大样本量过少或划分方式不合理使用分层采样或按反应类型分组划分训练集指标好但测试集差模型过拟合增加正则化、减少特征、增加数据量催化剂编码重复LabelEncoder 只适合训练集保存 encoder 对象并在预测时复用5.2 避免条件数据泄漏在真实 lab-aware 基准中最需要注意的问题是数据泄漏。比如把实验批次号作为特征模型可能学到“同一批实验产率相似”而不是学到化学规律。使用全局归一化时统计量来自全部数据导致测试集信息提前暴露。同一个反应在不同日期重复多次直接随机划分会让同一反应同时出现在训练集和测试集。解决办法是使用按反应模板或反应物骨架分组的 GroupKFold保证同一底物或同一反应系列不跨组。5.3 如何处理缺失条件实验室记录中经常出现缺失值例如某个催化剂用量没有记录。可以用以下方式处理删除缺失比例过高的字段。使用中位数/众数填充。使用 “unknown” 单独标记缺失类别让模型自己学习缺失信息。不建议对所有缺失条件做全局均值填充因为某些条件下缺失可能和实验失败相关直接填充会掩盖这种信息。6. 最佳实践与工程建议6.1 数据记录规范lab-aware 基准的好坏很大程度取决于原始实验数据的完整程度。建议从数据源头规范记录字段反应物 SMILES 必须经过标准化例如去除盐、中和电荷。记录每种试剂的当量而不是只记录体积/质量。记录加料顺序尤其是多步一锅反应。记录实际温度波动范围而不是只记录设定温度。记录设备类型和搅拌方式这些会影响传质和结果。记录失败实验这一点容易被忽略但对模型理解“什么条件不 work”至关重要。6.2 版本管理与可复现性基准数据也在不断迭代建议采用数据版本管理bench_data/ ├── v0/ │ ├── reactions.csv │ ├── README.md └── v1/ ├── reactions.csv ├── condition_schema.json └── README.md每次发布新版本时记录版本变更例如新增了多少条反应记录。修正了哪些 SMILES 错误。条件字段有哪些新增或废弃。在代码侧固定核心依赖版本pip freeze requirements.txt这样别人在复现模型结果时环境一致减少“明明代码一样结果却不同”的困扰。6.3 指标设计要多视角产率预测不能只用一个 MAE 指标。建议在基准中同时输出多个指标MAE / RMSE评估整体误差。R2评估拟合程度。Top-1 条件推荐命中率判断模型是否能把最优条件排在最前面。低产率识别召回率判断模型能否识别高风险条件。对于条件推荐任务还可以使用 NDCG归一化折损累计增益评估排序质量。这比单一准确率更能反映模型在实验筛选中的实用价值。6.4 基线模型选择第一版基准不要一上来就上复杂模型。建议至少跑三个 baseline随机森林/梯度提升树处理表格特征强训练快。支持向量回归SVR在样本量小时表现稳定。图神经网络或基于 Transformer 的反应预测模型在真实分子结构上表现更好但实现成本高。只有多个 baseline 都在同一数据划分和指标下比较才能判断新方法的提升是真实效果还是评估设置不同引起的。6.5 安全与合规注意事项处理化学数据进行模型训练时需要注意涉及公司内部实验室数据时要先做好脱敏和授权。涉及危险化学品类信息避免在公开代码仓库中记录。使用开源数据时注意其许可证不能简单“拿来就用”。模型预测结果不能替代真实实验验证尤其是涉及危险反应条件时仍需要安全审查。6.6 面向生产环境的扩展在真实业务中lab-aware 基准可以和工作流自动化结合实验平台每次运行后自动导出结构化数据。数据进入特征化管道更新特征库。模型在每周固定时间重新评估。当模型指标低于阈值时触发主动学习采样挑选信息量最大的一组实验推荐给实验人员。实验人员反馈新结果完成闭环。这种闭环是 lab-aware 基准的最终价值让计算模型成为实验设计的助推器而不是停留在论文里的“离线评测”。7. 总结与后续方向回到 onepot-Bench 0 的定位它代表的不只是一个新的数据集而是一套更贴近实验事实的评估思路。我们在本文中梳理了从概念到代码实现的完整路径理解 lab-aware 基准的意义、设计数据格式、构建特征、训练基线模型、评估结果并讨论了数据泄漏、版本管理和指标设计等工程问题。如果你准备在自己的研究或项目里实践这个方向可以参考下面的路线图继续扩展使用真实实验数据替换模拟数据。加入 RDKit 计算分子描述符或指纹。将条件信息编码为结构化向量。引入多任务学习同时预测产率、选择性和副产物。添加主动学习模块让模型参与实验设计。对不同模型和特征组合做 ablation study形成完整报告。下一步可以重点关注“条件扰动评估”在测试集中修改温度、溶剂、催化剂等条件观察模型预测是否发生合理变化。这是判断模型是否真正理解化学条件最直接的测试方式也是 lab-aware 基准区别于传统基准的核心优势。如果你对自动化合成、反应条件推荐或者化学数据工程感兴趣欢迎自己动手实现一版最小 lab-aware benchmark再从数据质量、特征工程、模型评估三个方向逐步完善。先让流程闭环再追求模型性能是这条路上最务实的做法。