3. 实验对象与数据对象建模

在自驱动实验室中,数据闭环能否真正跑通,首先取决于“实验对象”和“数据对象”是否被一致地建模。实验对象是物理世界里真实存在、可被操作和测量的东西:一个实验单元、一份样本、一瓶试剂、一台仪器、一步操作、一次观测。数据对象则是这些物理对象在信息系统中的结构化投影:它们有唯一标识、有属性、有状态、有与其他对象的关联。若两者没有稳定的映射关系,自动化调度、数据追溯和机器学习建模都会失去基础。

本节的核心任务,是把实验单元、样本、试剂、仪器、操作步骤和观测量这六类对象,用统一的结构化方式表达出来,并说明支撑这种表达的元数据标准。需要强调的是,建模不是给每个对象起个名字,而是明确“它是什么、由什么构成、处于什么状态、与谁发生关系、产生什么数据”。

一、六类核心对象及其结构化字段

实验单元是实验执行的最小可调度单位,通常对应一个孔板孔位、一个反应容器或一个微流控腔室。它的关键字段包括:单元ID、载体类型、几何位置、所属实验批次、当前状态(空闲、已加样、反应中、已测量、已废弃)。样本是实验单元中承载目标物质的输入,字段包括样本ID、来源、浓度、体积、保存条件、批次号。试剂是参与反应的功能性物质,字段包括试剂ID、名称、CAS号、批号、浓度、溶剂、有效期、存储温度。仪器是执行操作或测量的设备,字段包括仪器ID、型号、能力参数(量程、精度、通量)、当前占用状态、校准时间。操作步骤是实验流程中的动作单元,字段包括步骤ID、动作类型(移液、加热、离心、测量)、目标对象、参数、前置条件、后置条件。观测量是实验产生的数据点,字段包括观测ID、关联实验单元、关联步骤、测量类型、数值、单位、时间戳、质量标记。

这六类对象不是孤立的。一个实验单元会关联一个样本、若干试剂、一台仪器、多个操作步骤和一组观测量。建模时,必须用显式的关系字段把这些连接固定下来,而不是靠命名约定或人工记忆。

实验对象与数据对象的结构化关系模型 实验单元 unit_id / 载体 / 位置 / 状态 样本 sample_id / 来源 / 浓度 / 体积 试剂 reagent_id / CAS / 批号 / 浓度 仪器 instrument_id / 量程 / 精度 / 状态 操作步骤 step_id / 动作 / 参数 / 前后条件 观测量 obs_id / 数值 / 单位 / 时间戳 / 质量标记 输入 加入 执行 作用于 产生 元数据标准:唯一标识 · 单位 · 时间戳 · 版本 · 来源 所有对象共享的公共字段层 核心对象 公共元数据层

二、元数据标准:让对象可被机器理解

仅有字段还不够,字段的语义必须被标准化。元数据标准要解决四个问题:唯一标识、单位统一、时间基准、来源可追溯。唯一标识建议采用“类型前缀+全局唯一码”的形式,例如 UNIT-20240513-001、SAMPLE-BLOOD-042,避免不同系统合并时发生冲突。单位统一要求所有数值字段显式携带单位,浓度用 mol/L 或 mg/mL,体积用 μL,温度用 ℃,时间用 ISO 8601 格式。时间基准要区分“实验开始时间”“步骤执行时间”“测量时间”,三者不能混用。来源可追溯要求每个对象记录创建者、创建时间、父对象和版本号。

在自驱动实验室中,推荐采用“公共元数据层+领域扩展层”的两层结构。公共层包含 id、type、created_at、updated_at、version、source、unit、quality_flag。领域扩展层则根据对象类型追加专用字段。例如样本的领域层包含 sample_type、concentration、volume、storage;仪器的领域层包含 measurement_range、resolution、calibration_date。这样既保证跨对象的一致性,又保留专业语义。

三、从物理操作到数据记录的映射示例

假设一个典型实验:将 50 μL 样本加入 96 孔板的 A1 孔,再加入 10 μL 试剂,在 37 ℃ 下孵育 30 分钟,然后用酶标仪在 450 nm 读取吸光度。这个过程中,物理对象和数据对象的映射关系如下:

物理对象 数据对象字段 示例值
实验单元(A1孔) unit_id / carrier / position / state UNIT-20240513-001 / 96孔板 / A1 / 已测量
样本 sample_id / volume / concentration SAMPLE-BLOOD-042 / 50 μL / 2.5 mg/mL
试剂 reagent_id / volume / lot REAGENT-AB-007 / 10 μL / LOT-2304
仪器 instrument_id / mode / wavelength READER-03 / 吸光度 / 450 nm
操作步骤 step_id / action / parameter / duration STEP-003 / 孵育 / 37 ℃ / 30 min
观测量 obs_id / value / unit / timestamp OBS-20240513-088 / 0.842 / AU / 2024-05-13T10:32:15Z

这张表的意义在于:当实验被自动化执行时,每一步操作都会生成对应的数据记录,而这些记录通过 unit_id 和 step_id 被串联起来。后续如果发现某个观测值异常,可以沿着“观测量→步骤→仪器→试剂→样本→实验单元”的链路逐级回溯,定位问题来源。

四、建模时的常见陷阱与处理建议

第一个陷阱是“用名称代替标识”。例如用“A1孔”作为唯一标识,一旦板号变化就会冲突。正确做法是名称仅作显示,标识必须全局唯一。第二个陷阱是“单位隐含”。很多系统默认浓度是 mg/mL,但不同仪器输出可能是 μg/mL,若不显式记录单位,后续计算会出错。第三个陷阱是“时间戳缺失时区”。ISO 8601 要求带时区偏移,例如 2024-05-13T10:32:15+08:00,否则跨时区协作时无法对齐。第四个陷阱是“状态字段缺失”。实验单元如果没有状态字段,调度系统就无法判断它是否可被再次使用。

建议在建模初期就定义一份“对象字段字典”,明确每个字段的名称、类型、单位、是否必填、取值范围和示例值。这份字典是后续数据库建表、API 设计和数据校验的共同依据。

五、可执行的对象字段字典示例

下面给出一份可直接参考的字段字典片段,覆盖实验单元和观测量两类对象。实际使用时可根据实验类型扩展领域字段。

object: experiment_unit
  unit_id:        string, 必填, 全局唯一, 示例 UNIT-20240513-001
  carrier_type:   enum,   必填, 96孔板/离心管/微流控芯片
  position:       string, 必填, 示例 A1
  batch_id:       string, 必填, 关联实验批次
  state:          enum,   必填, idle/loaded/reacting/measured/discarded
  created_at:     datetime, 必填, ISO 8601 带时区
  version:        integer, 必填, 初始为1

object: observation
  obs_id:         string, 必填, 全局唯一
  unit_id:        string, 必填, 外键关联实验单元
  step_id:        string, 必填, 外键关联操作步骤
  measure_type:   enum,   必填, 吸光度/荧光/温度/pH
  value:          float,  必填, 数值
  unit:           string, 必填, 示例 AU、nm、℃
  timestamp:      datetime, 必填, ISO 8601 带时区
  quality_flag:   enum,   必填, valid/suspect/invalid

这份字典的价值在于:它把“应该记录什么”变成了“必须记录什么”。当所有实验对象都按同一套字段字典生成数据时,数据闭环中的采集、存储、查询和建模环节才能无缝衔接。自驱动实验室的“自驱动”能力,本质上依赖于这种结构化、标准化、可追溯的数据对象体系。