仿真实验闭环工作流开发教程(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-platformax.api.client.Clientget_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 章:设计一个原型 → 构建出物理实现 → 测试其功能 → 从缺陷中学习 → 反馈进入下一轮。

两个必须知道的细节:

  1. 该报告正文里主要用的是 DBT 三段式,"learn(学习)"是作为把 DBT 折成闭环的那个环节出现的。写材料时把"DBTL 四段"讲成报告原文,会被读过原文的人抓住。
  2. 不要把 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 命名空间已从现行文档移除

逐段剖析三个设计决策:

  1. 为什么不 import 而用 importlib.metadata.versionimport opentrons 会拉起整条依赖链(几秒到几十秒),而且"导入时报错"和"根本没装"是两回事。体检脚本只想知道装了什么版本,元数据足够。
  2. 为什么键必须写发行名ax-platform 导入名是 axbenchling-sdk 导入名是 benchling_sdk。按导入名查元数据必然假阴性——这是最容易让人误判"我环境没问题"的地方。
  3. 为什么 401 算通过:闭环排查第一步永远是"断在哪一层"。DNS 失败、TLS 失败、网关 404、鉴权 401 是四种完全不同的病;把"只差鉴权"和"路不通"混成一条错误,会白白浪费半天。

三、常见报错与排查

1)现象:脚本一直报"未安装:ax",但 pip list 里明明有。
根因:按导入名查了发行元数据。解法:改用 ax-platformbenchling-sdkpylabrobotisatools 这些 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 的 curlInvoke-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}:31950POST /commands?waitUntilComplete=true(头 Opentrons-Version: 3)下发;③学习算法——ax-platform 1.3.1 的 ax.api.client.Client,用 get_next_trials() 取建议、complete_trial() 回填回报,且二者必须成对落库。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐