3. 实验对象与数据对象建模
在自驱动实验室中,数据闭环能否真正跑通,首先取决于“实验对象”和“数据对象”是否被一致地建模。实验对象是物理世界里真实存在、可被操作和测量的东西:一个实验单元、一份样本、一瓶试剂、一台仪器、一步操作、一次观测。数据对象则是这些物理对象在信息系统中的结构化投影:它们有唯一标识、有属性、有状态、有与其他对象的关联。若两者没有稳定的映射关系,自动化调度、数据追溯和机器学习建模都会失去基础。
本节的核心任务,是把实验单元、样本、试剂、仪器、操作步骤和观测量这六类对象,用统一的结构化方式表达出来,并说明支撑这种表达的元数据标准。需要强调的是,建模不是给每个对象起个名字,而是明确“它是什么、由什么构成、处于什么状态、与谁发生关系、产生什么数据”。
一、六类核心对象及其结构化字段
实验单元是实验执行的最小可调度单位,通常对应一个孔板孔位、一个反应容器或一个微流控腔室。它的关键字段包括:单元ID、载体类型、几何位置、所属实验批次、当前状态(空闲、已加样、反应中、已测量、已废弃)。样本是实验单元中承载目标物质的输入,字段包括样本ID、来源、浓度、体积、保存条件、批次号。试剂是参与反应的功能性物质,字段包括试剂ID、名称、CAS号、批号、浓度、溶剂、有效期、存储温度。仪器是执行操作或测量的设备,字段包括仪器ID、型号、能力参数(量程、精度、通量)、当前占用状态、校准时间。操作步骤是实验流程中的动作单元,字段包括步骤ID、动作类型(移液、加热、离心、测量)、目标对象、参数、前置条件、后置条件。观测量是实验产生的数据点,字段包括观测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,否则跨时区协作时无法对齐。第四个陷阱是“状态字段缺失”。实验单元如果没有状态字段,调度系统就无法判断它是否可被再次使用。
五、可执行的对象字段字典示例
下面给出一份可直接参考的字段字典片段,覆盖实验单元和观测量两类对象。实际使用时可根据实验类型扩展领域字段。
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
这份字典的价值在于:它把“应该记录什么”变成了“必须记录什么”。当所有实验对象都按同一套字段字典生成数据时,数据闭环中的采集、存储、查询和建模环节才能无缝衔接。自驱动实验室的“自驱动”能力,本质上依赖于这种结构化、标准化、可追溯的数据对象体系。