仿真实验闭环工作流开发教程(1):为什么仿真实验闭环是二次开发的下一站——偏差、孤岛与三件套的缺位
仿真实验闭环工作流开发教程(1):为什么仿真实验闭环是二次开发的下一站——偏差、孤岛与三件套的缺位
版本声明块
- 工具/软件:ASE 3.29.0(2026-06-21)|QuAcc(ASE 官方生态页收录)|opentrons 9.1.2(Protocol API v2,apiLevel 2.27)|benchling-sdk 1.25.0|pylabrobot 0.2.2|sila2 0.14.0|ax-platform 1.3.1|BoTorch 0.18.1|AMICI v1.0.1|pyPESTO v0.6.0|isatools v0.14.3
- 语言/环境:Python 3.11+ / bash / requests / importlib.metadata
- 本文目标:讲清"闭环"为什么是二次开发的必然下一站,并把"我现在到底缺什么"变成一条可执行的体检命令
一句话结论:一个能自转的仿真实验闭环只缺三样东西——数据契约(loop record 的四要素:量名、单位、不确定度、追溯链)、设备控制(先过 opentrons.execute 仿真,再走机器人本机 :31950 HTTP API)、学习算法(ax-platform 的 ax.api.client.Client 用 get_next_trials() / complete_trial() 做建议/回报配对);本篇末尾的 python loop_env_check.py 会在一分钟内打印出你环境里这三条腿各缺哪一块,缺任何一项退出码为 1。
〇、本篇要解决的认知问题
Q1:仿真算出来的结果和真实实验做出来的结果,偏差到底是从哪儿来的?为什么换更准的力场、把收敛阈值调得更小,并不能把它治干净?
Q2:大家都说"数据孤岛",但在一个同时有仿真集群、液体处理机器人和电子实验记录本(ELN,Electronic Lab Notebook)的实验室里,孤岛的代价具体落在哪几个环节上?
Q3:设计-构建-测试-学习(Design-Build-Test-Learn,DBTL)这个循环的权威规范化表述出自哪里?为什么不能写成"源自 KEGG 计划"?
Q4:自动驾驶实验室(self-driving lab,SDL)这条线从 2009 年到 2026 年有哪些标志性工作?引用它们时最容易踩的坑是什么?
Q5:一个真正能跑起来的闭环最少需要哪几件东西?为什么这三件缺一不可?本系列 20 篇按什么顺序把它们接起来?
一、机制解析
1.1 偏差不是一个问题,是四张独立账单
先把最容易被混淆的一件事拆开:"仿真不准"这四个字底下压着四类性质完全不同的误差,它们各自的治理手段、责任方和发生位置都不一样。
| 偏差来源 | 底层机制 | 典型表现 | 靠"算得更久/更准"能治吗 | 真正的治理手段 |
|---|---|---|---|---|
| ① 模型形式误差 | 泛函/力场近似、机理里缺步骤(传质、界面、副反应) | 趋势对、绝对值系统性偏移 | 部分能(换模型),但缺的那一步你永远发现不了 | 扩大模型边界 + 用实验数据反推(标定) |
| ② 参数误差 | 力场参数、速率常数、扩散系数取的是文献值或估算值 | 重复仿真 100 次给出同一个错误答案 | 完全不能——重复仿真只会提高精度,不提高准确度 | 参数估计:AMICI v1.0.1 + pyPESTO v0.6.0(第 13 篇) |
| ③ 湿侧执行误差 | 试剂降解/批次差异、移液系统误差、孔位错位、板边缘效应、温控漂移 | 同配方复测不一致;整板整体偏高或偏低 | 不能——仿真根本不知道你的板上发生了什么 | 设备控制 + 协议版本化(第 4、6、8 篇) |
| ④ 测量与记录误差 | 检出限以下的值被填 0、峰积分规则不一致、读板机光程差、单位漏写 | 学到的"规律"其实是仪器约定 | 不能——而且会把噪声当信号喂给优化器 | 数据契约里强制写不确定度与检出限(第 5 篇) |
看懂这张表,就看懂了本系列的全部动机:①②是科学问题,③④是接口与记录问题。而③④恰恰不在任何一家仿真软件的功能清单里——它们只能由"二次开发工程师"用协议、API 和 schema 去补。换句话说,仿真软件越用越熟之后,你能贡献的边际价值自然就从"把单次算例做对"转移到了"把仿真和实验之间那段路修通"。
为什么这对你重要:如果你的模型误差不来源于力场,那么再等一次"更好的模型"是无解的;能解它的是一轮带不确定度记录的实测数据回灌。这句话决定了你的技能投资方向。
1.2 数据孤岛的成本,从来不体现在"找不到文件"上
多数团队把孤岛理解成"数据没有共享"。太轻了。真正让人流血的是下面这些环节,每一个都能对应到一条工程约束。
| 环节 | 孤岛状态下的具体形态 | 代价性质 | 对应的系列铁律 |
|---|---|---|---|
| 找数 | 同一个化合物在仿真目录、ELN、Excel 台账里是三套编号 | 人力时间(以周计的归并) | 铁律 1:先定契约再写接口 |
| 对齐 | 只知道"浓度 12",不知道单位是 µM 还是 mg/L,也不知道有没有扣空白 | 静默错误,越晚发现越贵 | 铁律 1 的四要素 |
| 复现 | 上一轮用了哪版协议、哪批试剂、哪个参数集无人知晓 | 失败实验无法归因,重复踩坑 | 铁律 8:每轮全链路可追溯 |
| 归因 | 整板读数偏高——是移液精度、读板机漂移,还是模型偏差?无数据可分 | 把设备问题当科学问题解决 | 铁律 2、铁律 7 |
| 审计 | 程序化写入的记录看不出是谁(哪个脚本)改的,时间戳可被覆盖 | 合规风险:21 CFR Part 11 §11.10 要求安全的计算机生成时间戳审计追踪、不得遮盖先前信息 | 铁律 3 |
| 学习 | 优化器建议了 20 组参数,只有 13 组带回报,剩下 7 组被默默丢弃或当成 0 | 模型直接被污染 | 铁律 5:建议/回报成对落库 |
这里值得单独说一句"学习"这一行:闭环里最贵的不是失败实验,是没有被记录的失败实验。一个失败的 trial 如果以"缺失"的形式进入拟合,等价于告诉优化器"这里什么都没有";如果以"0"的形式进入拟合,等价于告诉优化器"这里结果为 0"。两种都是谎言,但都极其常见。第 18 篇会给出用掩码(mask)而不是删除的处置方式。
为什么这对你重要:孤岛成本是不可摊薄的固定成本——你每多一轮迭代就要重付一次。闭环的收益不是"省时间",而是把这笔钱一次性买断。
1.3 DBTL 的权威口径怎么写才不被行家挑刺
设计-构建-测试-学习(Design-Build-Test-Learn,DBTL)这个循环源自合成生物学(synthetic biology)社区的工程化实践语境(iGEM 与 biofoundry 那一脉)。如果你需要在立项书、论文或内训材料里给出一段可引用的规范化表述,用美国国家科学院报告 Biotechnology in the Age of Synthetic Biology(《合成生物学时代的生物技术》)第 2 章:设计一个原型 → 构建出物理实现 → 测试其功能 → 从缺陷中学习 → 反馈进入下一轮。
两个必须知道的细节:
- 该报告正文里主要用的是 DBT 三段式,"learn(学习)"是作为把 DBT 折成闭环的那个环节出现的。写材料时把"DBTL 四段"讲成报告原文,会被读过原文的人抓住。
- 不要把 DBTL 的出处写成 KEGG 计划或某个 Genome Consortium——没有任何证据支持这种说法,属于典型的以讹传讹(在本系列的禁用清单里)。正确引法:
https://www.ncbi.nlm.nih.gov/books/NBK535871/。
1.4 自动驾驶实验室谱系:十三年、五个节点、一个勘误
闭环不是新词,它有一条被 DOI 钉住的时间线:
2009 ─────────── 2020 ─────────── 2023 ────────── 2023 ─────────── 2026
Robot Scientist Mobile A-Lab Coscientist Nature 技术特写
Science 324,85 Robotic Chemist Nature 624 Nature 624,570 Inside the
DOI 10.1126/ Nature 583,237 DOI 10.1038/ DOI 10.1038/ "self-driving"
science.1165620 DOI 10.1038/ s41586-023- s41586-023- lab revolution
s41586-020- 06734-w 06792-0 Nature 652,262
2442-2 +勘误 DOI 10.1038/
10.1038/ d41586-026-00974-2
s41586-025- (含 Eve 机器人实验室)
09992-y
闭环自主科学发现的奠基 移动机器人+流动化学 无机材料自主合成 LLM 自主做化学实验 行业全景
逐条说明口径(这些细节决定了你像不像圈内人):
- Robot Scientist(Science 324, 85–89, 2009,DOI 10.1126/science.1165620):把"假设生成—实验—建模—再假设"完全交给系统的奠基工作,闭环思想的第一次严格实证。
- Mobile Robotic Chemist(Liverpool,Nature 583, 237–241, 2020,DOI 10.1038/s41586-020-2442-2):移动机器人把流动化学与自动决策接上;同组后续的多机器人固相化学发表在 Chemical Science 2024, 15, 2456–2463(DOI 10.1039/D3SC06206F)——不是 2022 年,年份错引是常见事故。
- A-Lab(伯克利国家实验室,Szymanski et al., Nature 624, 2023,DOI 10.1038/s41586-023-06734-w):无机粉末固相自主合成,连续运行 17 天、58 个目标产出 41 个化合物。两条硬性纪律:必须同时引用勘误(Author Correction,Nature 650, 2026,DOI 10.1038/s41586-025-09992-y);正式表述是 inorganic materials(无机材料),不是早期流传的"novel materials(新型材料)"。
- Coscientist(Nature 624, 570–578, 2023,DOI 10.1038/s41586-023-06792-0):大语言模型直接驱动化学实验方案设计并上机执行。
- Nature 技术特写 Inside the “self-driving” lab revolution(Nature 652, 262–264, 2026,DOI 10.1038/d41586-026-00974-2):行业全景,可作为"为什么现在值得投入"的背书。
为什么这对你重要:A-Lab 的勘误同引这条规矩,本质就是铁律 8(每轮迭代全链路可追溯)的学术版。一个连自己引用都不做版本核对的团队,不会把 loop record 的四要素当回事;反过来,把这件事养成肌肉记忆的人,做闭环天然顺手。这也是为什么本系列把它放在第一篇讲。
1.5 闭环三件套:少一条腿,剩下的两条就只是装饰
把上面所有讨论收敛成三件事。这也是本系列的技术骨架。
| 三件套 | 它在闭环里干什么 | 缺了会怎样 | 本系列落点 |
|---|---|---|---|
| 数据契约(data contract) | 规定"一次测量"必须携带什么:量名、单位、不确定度、追溯链 | 学习层拿到的是裸数值,越学越歪;审计层无法回答"谁做的" | 第 5 篇(ISA / AnIML / FAIR) |
| 设备控制(instrument control) | 把仿真给出的建议变成移液动作,再把仪器原始文件收回来 | 优化器只能对着仿真自己打分,闭环退化成自娱自乐 | 第 4、6、8 篇 |
| 学习算法(learning) | 用实测回报修正模型并给出下一批值得做的条件 | 有数据没决策,实验量堆上去结论还是靠直觉 | 第 10、11、12、13 篇 |
端到端架构(本系列 20 篇全都挂在这张图上):
┌──────────────────── 数据契约层(第 5 篇) ────────────────────┐
│ loop record 四要素:量名 · 单位 · 不确定度 · 追溯链 │
│ 序列化:ISA-JSON / AnIML / mzML | 原则:FAIR(F1 · R1.2) │
└───────────────────────────────────────────────────────────────┘
▲ ▲
┌───────────────────┘ └───────────────────┐
┌────────────────────────────┐ ①建议参数 / 候选配方(trial) ┌────────────────────────────┐
│ 仿真层 Simulation │ ────────────────────────────────► │ 学习层 Learn │
│ ASE 3.29.0 · QuAcc │ │ Ax 1.3.1 ask/tell │
│ simulate(params)→pred │ ◄──────────────────────────────── │ BoTorch 0.18.1 采集函数 │
└────────────────────────────┘ ④实测值 + 误差 + 失败标记 │ 标定 AMICI 1.0.1/pyPESTO │
▲ └────────────────────────────┘
│ ②结构、参数、引擎版本 ▲
│ │ ⑥参数回写(版本化)
┌─────────┴───────────────────┐ ③协议(先仿真后实机) ┌────────────────────┴──────────────┐
│ 执行层 Execution │ ───────────────────────► │ 记录层 Record / Trace │
│ Opentrons 9.1.2 :31950 │ │ Benchling {tenant}/api/v2 │
│ 抽象层 PyLabRobot · SiLA 2 │ ◄─────────────────────── │ SENAITE JSONAPI · LabArchives │
└──────────────────────────────┘ ⑤板/孔位/读数原始文件 └───────────────────────────────────┘
▲ ▲
└─────── 仪器:酶标读板 CSV | msconvert → mzML 1.1.1 | OpenChrom ───────┘
注意①→⑥的编号顺序:它恰好是本系列"入门(01-04)→核心(05-08)→进阶(09-12)→高级(13-16)→实战(17-20)"的推进顺序。闭环的难点从来不在算法,在于第①步到第⑤步之间每一次数据换手都不丢信息。
为什么这对你重要:这三件套分别对应三种岗位——数据/标准工程、自动化工程、算法工程。一个团队如果只想买一套软件就"拥有闭环",缺的必然是"数据契约"这一件,而它恰恰是最便宜、最该由内部自己定的那一件。第 2 篇就把这三件套摊成一张选型矩阵。
二、完整代码与逐行剖析
认知问题解决了,接下来必须回答"我现在缺什么"。下面三个文件是一套闭环开发环境体检:查包、查端点、锁版本。
2.1 体检脚本 loop_env_check.py
#!/usr/bin/env python3
"""仿真实验闭环开发环境体检。
用法:python loop_env_check.py --tenant yourlab --robot-ip 10.42.0.10
判定:REQUIRED_PACKAGES 缺包 或 REQUIRED_ENDPOINTS 不可达 → 退出码 1
设计意图:把"三件套缺哪条腿"变成一条可进 CI 的命令,而不是会议上的争论。
"""
from __future__ import annotations # 允许在 3.11 里安全使用新式类型注解
import argparse # 解析命令行参数:租户名与机器人 IP 属于环境,不该硬编码进脚本
import sys # 用退出码向 CI/调度器报告结果,而不是靠人读日志
import importlib.metadata as md # 关键:读【发行包名】的元数据,不 import 包本身
# 发行名 → 期望版本基线(来自本系列版本声明;键是 PyPI 发行名,不是导入名)
# 为什么写发行名而不是导入名:ax-platform/ax、benchling-sdk/benchling_sdk 两者不同名,
# 用 md.version("ax") 会误报缺失——这是新手最常见的一个假阴性。
REQUIRED_PACKAGES: dict[str, str] = {
"ase": "3.29.0", # 仿真层:Atomic Simulation Environment
"opentrons": "9.1.2", # 执行层:Protocol API v2 所在的包
"pylabrobot": "0.2.2", # 硬件无关抽象层
"sila2": "0.14.0", # 设备通信标准官方 Python 实现
"benchling-sdk": "1.25.0", # 记录层:官方 Python SDK(不是 benchling-api,后者不存在)
"isatools": "0.14.3", # 数据契约:ISA-Tab/ISA-JSON 构建、校验与转换
"pydantic": "", # 契约校验的落地工具,版本不敏感
"requests": "", # 端点探测用
}
OPTIONAL_PACKAGES: dict[str, str] = { # 学习层体积大、依赖链重,列为可选而非必需
"ax-platform": "1.3.1", # 导入名是 ax,发行名是 ax-platform
"botorch": "0.18.1", # Ax 的底层,默认生成策略里的 MBM 节点即 BoTorch
"pypesto": "0.6.0", # 参数标定(第 13 篇)
"amici": "1.0.1", # SUNDIALS CVODES/IDAS 内核
"pymzml": "2.6.1", # mzML 读取
}
def check_packages(table: dict[str, str], required: bool) -> list[str]:
"""返回问题清单。空列表表示这一组全部达标。"""
problems: list[str] = []
for dist, want in table.items():
try:
got = md.version(dist) # 只查元数据,导入失败与未安装不再混淆
except md.PackageNotFoundError:
label = "必需" if required else "可选" # 可选项缺失只提示,不影响退出码
problems.append(f"[{label}] 未安装:{dist}")
continue
if want and got != want:
# 为什么这里只警告不判失败:小版本差异通常可用;但必须打印出来,
# 因为跨大版本(如 opentrons 的 apiLevel)行为会真的不同(铁律 4 锁版本)
problems.append(f"[版本漂移] {dist}: 期望 {want},实际 {got}")
print(f" {dist:<14} {got}")
return problems
def check_endpoints(tenant: str, robot_ip: str) -> list[str]:
"""探测三条腿上的两个关键端点:机器人本机 HTTP API 与租户 Benchling REST v2。"""
problems: list[str] = []
try:
import requests # 放在函数里:让"未安装 requests"成为一个被报告的检查项而非崩溃
except ImportError:
return ["[必需] 未安装:requests,无法探测端点"]
# 端点 1:执行层。Opentrons 机器人本机 REST 服务在 31950 端口,
# 权威接口定义在设备本机的 /openapi.json(不是任何在线文档),版本头必须是 3。
url = f"http://{robot_ip}:31950/openapi.json"
try:
r = requests.get(url, headers={"Opentrons-Version": "3"}, timeout=5)
# 为什么 timeout 必须显式给:闭环调度器里"无响应"和"慢响应"必须区分,
# 缺省无限等待会让上层误判为设备健康(第 19 篇详述超时语义)
print(f" {url} -> {r.status_code},字段数≈{len(r.text)}")
if r.status_code != 200:
problems.append(f"[执行层] {url} 返回 {r.status_code},请核对机器人软件版本与网络")
except Exception as exc: # 连不上通常是 DNS/路由/防火墙,不值得区分具体异常类型
problems.append(f"[执行层] {url} 不可达:{type(exc).__name__}")
# 端点 2:记录层。真实形态是 {tenant}.benchling.com/api/v2,租户名写在域名里。
url2 = f"https://{tenant}.benchling.com/api/v2/entries?pageSize=1"
try:
r2 = requests.get(url2, timeout=8) # 故意不带凭据:只验证"路通了没有"
print(f" {url2} -> {r2.status_code}")
# 401 在这里是【好消息】:域名解析、TLS、网关都通了,只差鉴权(第 3 篇解决)
if r2.status_code == 404:
problems.append(f"[记录层] 404:检查租户名 {tenant} 是否正确")
except Exception as exc:
problems.append(f"[记录层] {url2} 不可达:{type(exc).__name__}")
return problems
def main() -> int:
ap = argparse.ArgumentParser(description="仿真实验闭环开发环境体检")
ap.add_argument("--tenant", required=True, help="Benchling 租户子域名,如 yourlab")
ap.add_argument("--robot-ip", default="", help="Opentrons 机器人 IP;留空跳过实机探测")
args = ap.parse_args()
print("== 1) 必需包 ==")
problems = check_packages(REQUIRED_PACKAGES, required=True)
print("== 2) 可选包(学习层) ==")
problems += check_packages(OPTIONAL_PACKAGES, required=False)
print("== 3) 端点可达性 ==")
if args.robot_ip:
problems += check_endpoints(args.tenant, args.robot_ip)
else:
problems.append("[跳过] 未提供 --robot-ip,执行层端点未探测(无实机时属正常)")
print("\n== 结论 ==")
if not problems:
print("全部通过:三件套的依赖面齐备。")
return 0
for p in problems:
print(" " + p)
return 1 # 非零退出码:让 GitLab CI/GitHub Actions 直接拦住未齐备的环境
if __name__ == "__main__":
sys.exit(main())
2.2 运行方式(bash)
python -m pip install --upgrade pip # 老 pip 读不到新元数据,会误报未安装
python -m pip install ase==3.29.0 opentrons==9.1.2 pylabrobot==0.2.2 \
sila2==0.14.0 benchling-sdk==1.25.0 isatools==0.14.3 pydantic requests
# --robot-ip 省略:此刻你可能还没有实机,脚本会明确打印"跳过"而不是报错
python loop_env_check.py --tenant yourlab ; echo "退出码=$?"
# 拿到机器人之后补一次实机探测:
# python loop_env_check.py --tenant yourlab --robot-ip 10.42.0.10
2.3 版本基线锁定 requirements-loop.txt
# 铁律 4:新旧双轨必须显式锁版本。这份文件是闭环项目的"最低共识"。
ase==3.29.0
opentrons==9.1.2 # Protocol API v2 行为与 apiLevel 绑定,跨版本升级要走回归
pylabrobot==0.2.2
sila2==0.14.0
benchling-sdk==1.25.0
isatools==0.14.3
ax-platform==1.3.1 # 现行 API 是 ax.api.client.Client,别混用旧的顶层写法
botorch==0.18.1 # 采集函数为类式 API;functional 命名空间已从现行文档移除
逐段剖析三个设计决策:
- 为什么不 import 而用
importlib.metadata.version:import opentrons会拉起整条依赖链(几秒到几十秒),而且"导入时报错"和"根本没装"是两回事。体检脚本只想知道装了什么版本,元数据足够。 - 为什么键必须写发行名:
ax-platform导入名是ax、benchling-sdk导入名是benchling_sdk。按导入名查元数据必然假阴性——这是最容易让人误判"我环境没问题"的地方。 - 为什么 401 算通过:闭环排查第一步永远是"断在哪一层"。DNS 失败、TLS 失败、网关 404、鉴权 401 是四种完全不同的病;把"只差鉴权"和"路不通"混成一条错误,会白白浪费半天。
三、常见报错与排查
1)现象:脚本一直报"未安装:ax",但 pip list 里明明有。
根因:按导入名查了发行元数据。解法:改用 ax-platform、benchling-sdk、pylabrobot、isatools 这些 PyPI 发行名。顺带记住,benchling-api 这个包不存在,官方 SDK 只有 benchling-sdk。
2)现象:/openapi.json 连不上,但 App 里能看到机器人。
根因:机器人本机的 HTTP API(31950 端口)与 Opentrons App 走的网络路径不同,常见于跨网段、VPN 分流、办公网隔离打印机/设备的策略。解法:在机器人同一子网的机器上 curl http://{ROBOT_IP}:31950/openapi.json 验证;注意接口定义以设备本机 openapi.json 为权威,网上抓到的文档可能落后于你的机器人软件版本。
3)现象:Benchling 域名怎么试都是 DNS 解析失败。
根因:把 API 主机名当成了 api.benchling.com——这个形式不存在。真实形态是 https://{tenant}.benchling.com/api/v2/...,租户名在域名里。解法:登录网页端看浏览器地址栏的那一段子域就是 {tenant}。
4)现象:照着网上某段 Opentrons 代码写,robot.move_to(...) 报属性不存在。
根因:robot 对象与 move_to 属于已被 v2 取代的 v1 命名,而 Opentrons 的 /v1/ 与 /v2/ 文档树是分开的,搜索结果经常把你带进旧树。解法:v2 里唯一的协议入口是 def run(protocol: protocol_api.ProtocolContext),见第 4 篇。
5)现象:Windows PowerShell 里 curl -H "..." -d '...' 报参数错误。
根因:PowerShell 的 curl 是 Invoke-WebRequest 的别名,参数语义完全不同。解法:写全 curl.exe,或者用 bash/WSL 执行本系列的 curl 示例。
四、动手练习
练习 1|把体检跑绿(判据客观)
用你自己的环境跑 python loop_env_check.py --tenant <你的租户>,补齐 REQUIRED_PACKAGES。
判定标准:脚本输出中不再出现任何以 [必需] 开头的行;若未装学习层,允许出现"可选"行;把结论区截图存档。
练习 2|制造并解释一次 401(判据可观察)
把 --tenant 改成一个不存在的子域,再改成正确的但故意不带凭据,各跑一次。
判定标准:你能用一句话分别说出两次的失败层(DNS/网关层 vs HTTP 层),并在日志里指出是哪个输出行支持你的判断(不可达:... 与 -> 404 / -> 401)。
练习 3|给偏差归因(判据为结构化产出)
挑一个你做过的仿真算例,按 1.1 的表把它的已知误差分到①②③④四栏,每栏至少写一条"我需要什么数据才能确认"。
判定标准:产出的清单里必须出现"单位"、“不确定度”、“协议版本”、"仪器原始文件位置"这四项中至少三项——这就是第 5 篇 loop record 四要素的前身。
五、小结与下一篇预告
本篇把"要不要做闭环"这个口号问题拆成三个可回答的问题:偏差从哪里来(四张账单,其中三张不在仿真软件能力内)、孤岛贵在哪里(不可摊薄的固定成本,直接毒害学习层)、闭环最少需要什么(数据契约、设备控制、学习算法)。谱系与口径那一段(NBK535871 的 DBTL、Robot Scientist 2009 → Liverpool 2020 → A-Lab 2023 含勘误 → Coscientist 2023 → Nature 2026 特写)不是文献堆砌,而是在训练"每轮留痕"的职业习惯。体检脚本是你带走的第一个可复用工具,也是后续每一篇的前置检查。
下一篇(第 2 篇《闭环技术栈全景:三层一总线》)把三件套摊成完整技术栈:仿真层的 ASE 与 QuAcc、执行层的 Opentrons/Hamilton/Tecan 加硬件无关的 PyLabRobot 与 SiLA 2、记录层的 Benchling/SENAITE/LabArchives,以及把三层粘在一起的"总线"——数据契约与消息设计,并给出选型矩阵。第 3 篇从记录层握手开始动手,第 4 篇遥控机器人,第 5 篇把本篇反复提到的"四要素"写成代码。
本篇认知问题回显(FAQ)
Q1:仿真实验与湿实验结果偏差的主要来源有哪些,为什么提升算力和收敛阈值解决不了?
A:四类:模型形式误差(机理缺步骤)、参数误差(力场/速率常数取文献或估算值,重复仿真只会稳定地复现同一个错)、湿侧执行误差(试剂批次、移液系统误差、孔位错位、板边缘效应、温控漂移)、测量与记录误差(检出限以下填 0、单位漏写、积分规则不一)。后三类不在仿真软件能力内,只能靠设备控制与数据契约补。
Q2:实验室数据孤岛的成本具体落在哪些环节?
A:落在找数(同一化合物三套编号)、对齐("浓度 12"没有单位与扣空白信息)、复现(不知哪版协议/参数集)、归因(整板偏高时无法区分设备与模型)、审计(程序化写入看不出动作来源,违背 21 CFR Part 11 §11.10 的系统时间戳与不遮盖先前信息)、学习(缺回报的 trial 污染拟合)。其中"未记录的失败实验"最贵。
Q3:设计-构建-测试-学习(Design-Build-Test-Learn,DBTL)的权威表述出自哪里?KEGG 的说法对吗?
A:权威规范化表述见美国国家科学院报告 Biotechnology in the Age of Synthetic Biology 第 2 章(https://www.ncbi.nlm.nih.gov/books/NBK535871/ ):设计原型→构建物理实现→测试功能→从缺陷中学习→反馈下一轮;书中主用 DBT,learn 是闭环环节。"出自 KEGG 计划/Genome Consortium"无任何证据,属错引。
Q4:自动驾驶实验室(self-driving lab)谱系的代表工作与正确引用方式是什么?
A:Robot Scientist(Science 324, 85–89, 2009, DOI 10.1126/science.1165620)→ Mobile Robotic Chemist(Nature 583, 237–241, 2020, DOI 10.1038/s41586-020-2442-2)→ A-Lab(Nature 624, 2023, DOI 10.1038/s41586-023-06734-w,连续 17 天、58 目标得 41 化合物,无机材料固相合成,必须同引勘误 DOI 10.1038/s41586-025-09992-y)→ Coscientist(Nature 624, 570–578, 2023, DOI 10.1038/s41586-023-06792-0)→ Nature 652, 262–264, 2026 特写(DOI 10.1038/d41586-026-00974-2)。
Q5:一个能运行的仿真实验闭环最少需要哪三件套?
A:①数据契约——loop record 四要素:量名、单位、不确定度、追溯链(谁设计、谁执行、仪器原始文件在哪);②设备控制——Opentrons 协议先用 opentrons.execute 本地仿真,再经机器人本机 http://{ROBOT_IP}:31950 的 POST /commands?waitUntilComplete=true(头 Opentrons-Version: 3)下发;③学习算法——ax-platform 1.3.1 的 ax.api.client.Client,用 get_next_trials() 取建议、complete_trial() 回填回报,且二者必须成对落库。
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐




所有评论(0)