技术选型与第一阶段架构方案
经建模方法、实验设计、工程化部署三路并行调研验证:企划书的技术路线整体成立,无需推翻;本次共形成 9 项选型决策,其中新增 TabPFN 第四模型候选与 Conformal Prediction 统一不确定性层两项增强, 明确主动学习框架采用 Ax/BoTorch(避开已停止维护的方案),GPR 的 ONNX 导出列为受控风险项。 第一阶段(当前)搭建范围为数据层与工程底座,按 8 周里程碑推进。
1. 执行摘要:决策一览
下表汇总本次技术选型的全部核心决策。,其余为调研确认沿用。
| 决策项 | 调研后决策 | 关键理由 |
|---|---|---|
| 建模主力 | 沿用 GPR + XGBoost + 随机森林三模型对比,GPR 为主推 | 小样本(300–500 组)下 GPR 天然输出均值与方差,不确定性估计最直接[2] |
| 新增候选 | 增加 TabPFN 作为第四候选 | 预训练表格 Transformer,免调参,2025 年小样本基准表现突出[1][3] |
| 不确定性量化 | 增加 Conformal Prediction 统一包装层(MAPIE 实现),与 GPR 原生区间并行输出 | 模型无关的覆盖保证,使四种模型置信区间可公平对比[4] |
| 多输出策略 | MultiOutputRegressor 独立建模三个输出(功率/速率/频率) | 三输出相关性弱,链式回归无益;多任务学习留待 2027 扩展[6] |
| 主动学习框架 | 明确采用 Ax/BoTorch(qEI / qNEI 批量采集);避开 scikit-optimize 与 modAL | Ax 活跃维护(2026.06 发布 1.3.0),原生批量采集匹配物理实验批次模式[7];skopt 已于 2024.02 归档[8] |
| 超参调优 | Optuna(TPE 采样器) | 成熟活跃,TPE 适合中小搜索空间;与 Ax 职责分离、不重复造轮子 |
| 模型导出 | 沿用 ONNX + joblib 双格式;GPR 导出后强制做 float64 精度对比 | sklearn-onnx 官方支持 GPR,但需 DoubleTensorType,存在精度差异风险[11][12] |
| 数据管理 | 沿用 SQLite + CSV;不引入 DVC / MLflow | 500 组规模、5 人团队下为零运维方案;版本追踪交给 Git |
| 工程规范 | 明确工程骨架标准:uv + src layout + pydantic-settings + pytest + ruff | 2025–2026 Python 社区共识工具链,学生团队可长期维护 |
下一步行动
确认本方案后,即可按第 7 节的工程结构初始化代码仓库,并启动第 8 节的 W1–W2 里程碑:工程骨架、数据模型(pydantic)、SQLite 库表三项先行。
2. 调研背景与方法
企划书确定的技术路线为「数据采集 → 模型训练 → 封装交付」三阶段闭环:阶段一(2026.05–12)完成 5 类材料、300 组以上的物性-参数-效果映射数据;阶段二(2027)完成 GPR / XGBoost / 随机森林三模型对比与留一材料交叉验证,并扩展深度学习方法;阶段三(2028)完成 ONNX + FastAPI 推理服务封装与厂商试用。项目当前处于阶段一执行期(2026.09)。
企划书中已给出的技术方案属于初期调研,允许中途调整。为在正式开发前锁定第一批技术决策,本次围绕三个方向展开并行调研:
- 建模方法:小样本表格回归的模型基准、不确定性量化、跨材料泛化与多输出策略;
- 实验设计与主动学习:支持物理实验批次采集的框架现状与维护状态;
- 工程化部署:ONNX 导出可行性(特别是 GPR)、API 服务、数据管理与工程规范。
调研重点覆盖 2024–2026 年公开资料,结论以「确认沿用 / 修改 / 新增」三类标注,与企划书方案逐项对照。
3. 建模层选型
3.1 模型池:保留三基线,新增 TabPFN
企划书提出的 GPR(RBF 核 + WhiteKernel)、XGBoost、随机森林三种模型组合在 2026 年仍是小样本表格回归的合理基线。GPR 在小样本场景下可同时输出预测均值与方差,是置信区间需求下最直接的方案[2];XGBoost 与随机森林提供精度与稳健性参照,且随机森林可输出特征重要性,辅助验证物性特征筛选[3]。
本次新增 TabPFN 作为第四候选。TabPFN 是在合成表格数据上预训练的 Transformer,无需调参即可在中小样本表格任务上取得强结果,且推理速度快;2025 年基准评测中表现突出[1]。材料信息学方向的工作(如 ICL-FM 将 TabPFN 与材料嵌入结合)也验证了 in-context learning 方法在小样本材料属性预测中的潜力[5]——这与本项目「留一材料」的跨材料泛化目标天然契合。TabPFN 仅作对比候选,不作为主线依赖(见第 9 节风险表)。
LightGBM 在小样本场景下相对不利,不纳入首轮对比[3];CatBoost 留作 2027 年数据量扩展后的备选。
3.2 不确定性量化:GPR 原生区间 + Conformal 统一包装
预测置信区间是本系统对外的核心承诺(企划书要求覆盖率 ≥ 90%)。决策采用双轨:
- 主线:GPR 后验分布直接输出均值 ± 95% 区间,无需额外校准;
- 统一层:对四种候选模型统一追加 Conformal Prediction(保形预测)包装(MAPIE 的 SplitConformalRegressor),使 GPR、XGBoost、RF、TabPFN 的区间输出在同一覆盖率标准下公平对比[4]。
Conformal Prediction 在有限校准集下提供覆盖率保证,不依赖模型形式,是当前小样本回归不确定性量化的主流做法[4]。NGBoost(参数化分布输出)作为备选记录,不纳入首轮实现。
3.3 多输出策略:独立建模
系统输出为三维连续值(功率百分比、走光速率、脉冲频率)。三者的物理相关性较弱(分别受能量耦合、扫描机械、脉冲时序主导),调研确认小样本表格场景下独立建模三个输出(MultiOutputRegressor)是最务实的选择[6];链式回归(RegressorChain)仅在输出强相关时有增益。企划书中 2027 年的多任务学习架构规划保留不变,作为数据量突破 500 组后的扩展方向。
3.4 跨材料泛化:特征工程优先
留一材料交叉验证(LOMO CV)是本项目区别于常规回归任务的核心评估协议。提升 LOMO 泛化的优先手段是特征工程:以物理意义明确的物性参数(反射率、吸收率、熔点/Tg、热导率、密度、粗糙度)构成统一特征空间,保证数值跨材料可比、量纲标准化一致。企划书提出的「大类独立训练 + 子类微调」分层策略保留为数据量不足时的备选方案;TabPFN 的 in-context 特性为跨材料泛化提供了额外一条低成路验证路径[1]。
4. 实验设计与主动学习选型
4.1 框架现状与决策
本项目数据采集的特殊性在于:实验是串行批次的物理过程(一批做完再决定下一批),而非纯数字模拟,因此框架必须支持批量采集函数(batch acquisition)。调研对比如下:
| 框架 | 维护状态 | 批量采集 | 结论 |
|---|---|---|---|
| Ax / BoTorch | 活跃(Ax 1.3.0,2026.06[7]) | 原生 qEI / qNEI / qEHVI[9] | 主选 |
| Optuna | 活跃 | 较弱 | 超参调优专用 |
| scikit-optimize | 2024.02 已归档[8] | — | 避开 |
| modAL | 基本停滞 | 有限 | 避开 |
| scikit-activeml | 活跃(1.0.0,2025.12) | 有限 | 备选 |
| Dragonfly / SMAC3 | 维护中 | 支持并行 / 弱 | 不采用 |
决策:主动学习环节采用 Ax/BoTorch。其 GPR 内核与建模层主力模型同源,采集函数直接复用训练好的 GPR 不确定性;qNEI 等批量采集函数支持「一次推荐一批 10–20 组参数」的物理实验节奏[9]。超参调优独立使用 Optuna(TPE),两者职责清晰互不干扰。材料实验领域的自主优化平台(如 NREL ALchemist[10])验证了此类工作流在实验科学中的可行性,可作为架构参考。
4.2 采集工作流:LHS 冷启动 → 主动学习
- 初始采样:使用
scipy.stats.qmc.LatinHypercube生成每种材料 30–40 组初始参数组合(拉丁超立方保证低维空间覆盖均匀); - 主动学习循环:初始数据训练 GPR 后,Ax 以 qNEI 推荐下一批 10–20 组实验,模型不确定性高的参数区域优先被探索;
- 停止条件:留一材料验证误差收敛或单材料实验预算(80 组)耗尽。
该工作流将企划书「主动学习引导的高效实验采集」创新点落实为可执行方案,且与阶段二的建模管线共享同一套 GPR 基础设施,无额外维护成本。
5. 工程化栈选型
5.1 模型导出:ONNX 保留,GPR 列为受控风险
sklearn-onnx 官方支持 GaussianProcessRegressor 的导出[12],但官方示例明确要求使用 DoubleTensorType(float64)而非默认 float32,因为 GPR 的矩阵运算在 float32 下存在精度差异[11]。XGBoost 与随机森林的 ONNX 导出成熟[12]。决策:
- 沿用 ONNX + joblib 双格式交付方案;
- GPR 导出流程中强制插入精度对比环节(同一测试集上 sklearn 原生预测 vs ONNX Runtime 预测,误差超过阈值即回退 joblib + FastAPI 直载方案);
- 该风险不阻塞第一阶段开发,2027 年模型定型时再验证。
5.2 API 服务与数据管理
FastAPI 方案确认可行:pydantic v2 承担请求/响应校验,模型在 lifespan 钩子中单次加载(避免每请求重复加载),CPU 推理走同步 endpoint 由 FastAPI 线程池处理,满足 ≤100ms 响应要求。数据管理沿用 SQLite + CSV:单文件零运维、5 人团队可直接共享,CSV 作为对外交付格式;DVC 与 MLflow 在当前数据规模(≤500 组)下属过度工程,明确不引入,数据版本追踪由 Git 提交记录承担。
5.3 设备采集与工程规范
串口通信采用 pyserial(活跃维护,支持 Python 3.10+[13]),按 producer-consumer 模式组织:后台读线程持续读取设备状态,主逻辑通过队列消费[14]。工程规范一次性定标准,避免后期重构:
- 包管理:uv(2025–2026 Python 社区主流,速度快、锁文件确定性);
- 项目结构:src layout(
src/lmpm/,包名取 laser-material-parameter-matching 缩写); - 配置:pydantic-settings(类型安全的环境变量与配置文件管理);
- 测试与质量:pytest + ruff(lint 与格式化二合一)。
6. 系统架构设计
系统按「数据层 → 模型层 → 服务层」三层组织,工程底座贯穿全程。主动学习闭环是架构中的关键反馈路径:模型层的不确定性评估反向驱动数据层的下一批实验设计。图中实线为数据流,蓝色虚线为主动学习反馈。
flowchart TB
IN1(["材料物性测量
光谱仪 · 粗糙度仪 · DSC"])
IN2(["激光加工实验
HZZ-M300U · 355nm"])
subgraph P1["阶段一 · 数据层(2026.05–12 · 本次搭建)"]
direction LR
D1["实验设计 DoE
LHS + Ax 主动学习"]
D2["数据采集
pyserial + 显微镜"]
D3["数据存储
SQLite + CSV"]
D1 --> D2 --> D3
end
subgraph P2["阶段二 · 模型层(2027)"]
direction LR
M1["模型训练
GPR · XGB · RF · TabPFN"]
M2["评估与 UQ
LOMO CV · Conformal"]
M3["超参调优
Optuna TPE"]
M1 --> M2
M3 -.-> M1
end
subgraph P3["阶段三 · 服务层(2028)"]
direction LR
S1["推理引擎
ONNX + joblib"]
S2["REST API
FastAPI · pydantic v2"]
S3["容器交付
Docker"]
S1 --> S2 --> S3
end
OUT(["激光设备控制软件 / 厂商数据产品"])
IN1 --> P1
IN2 --> P1
D3 --> M1
M2 --> S1
S3 --> OUT
M2 -. 主动学习反馈 .-> D1
classDef neutral fill:#F5F8FC,stroke:#DCE3EC,color:#1B2430;
classDef focus fill:#EAF2FC,stroke:#0969DA,color:#05468C,stroke-width:1.5px;
classDef external fill:#FFFFFF,stroke:#66717F,color:#3D4756;
class IN1,IN2,OUT external;
class D1,D2,D3 focus;
class M1,M2,M3,S1,S2,S3 neutral;
style P1 stroke:#0969DA,stroke-width:2px,fill:#FFFFFF,color:#05468C;
style P2 stroke:#DCE3EC,fill:#FFFFFF,color:#3D4756;
style P3 stroke:#DCE3EC,fill:#FFFFFF,color:#3D4756;
linkStyle 11 stroke:#0969DA,stroke-width:1.8px;
6.1 模块职责
| 模块 | 所属阶段 | 职责 |
|---|---|---|
| domain(领域模型) | 阶段一 | pydantic 定义材料物性、实验记录、加工参数、质量评分四类实体,全链路类型校验 |
| doe(实验设计) | 阶段一 | LHS 初始采样、参数空间定义、主动学习批次推荐(对接 Ax) |
| data(数据存取) | 阶段一 | SQLite 读写、CSV 导入导出、数据校验与清洗 |
| device(设备采集) | 阶段一 | pyserial 串口状态读取、实验参数自动同步记录 |
| ml(模型管线) | 阶段二 | 四模型训练、LOMO 交叉验证、Conformal 包装、超参调优 |
| api(推理服务) | 阶段三 | FastAPI REST 接口、ONNX Runtime 推理、置信区间输出 |
7. 项目工程结构
第一阶段按以下骨架初始化仓库(阶段二、三的目录预留占位,随进度填充):
lemdb/ ├── pyproject.toml # uv 管理:依赖声明、ruff/pytest 配置 ├── README.md ├── .gitignore # data/*.db 等产物不入库 ├── src/lmpm/ # 主包:laser material parameter matching │ ├── config.py # pydantic-settings:路径、设备、参数范围 │ ├── domain/ # 领域数据模型(第一阶段核心) │ │ ├── material.py # MaterialProperty:反射率/吸收率/熔点/热导率/密度/粗糙度 │ │ ├── experiment.py # ExperimentRecord / ProcessingParams / QualityMetrics │ │ └── doe.py # ParameterSpace / ExperimentDesign │ ├── data/ │ │ ├── store.py # SQLite 读写层 │ │ ├── io_csv.py # CSV 导入导出(交付格式) │ │ └── validate.py # 入库前校验:范围/缺失/重复 │ ├── doe/ │ │ ├── initial.py # LHS 初始采样(scipy QMC) │ │ └── active.py # Ax 主动学习批次推荐(阶段一末启用) │ ├── device/ │ │ └── serial_recorder.py # pyserial 采集(协议确认后开发) │ ├── ml/ # 阶段二:train / evaluate / uq │ └── api/ # 阶段三:main.py(FastAPI) ├── scripts/ │ ├── init_db.py # 初始化 SQLite 库表 │ ├── generate_doe.py # 生成参数网格 CSV │ └── record_experiment.py # 实验记录录入 CLI ├── tests/ # pytest:domain 校验 / store 读写 / doe 生成 ├── data/ # SQLite 库文件与 CSV(gitignore) └── docs/ └── data_dictionary.md # 数据字典:字段、单位、测量方法、溯源
7.1 依赖清单(按阶段引入)
| 阶段 | 依赖 | 用途 |
|---|---|---|
| 阶段一 | pydantic pydantic-settings pyserial scipy pandas typer |
数据模型 / 配置 / 串口 / LHS 采样 / 数据处理 / CLI |
| 阶段二 | scikit-learn xgboost tabpfn optuna ax-platform botorch mapie |
四模型训练 / 调优 / 主动学习 / Conformal 区间 |
| 阶段三 | fastapi uvicorn skl2onnx onnxruntime |
REST 服务 / 模型导出与推理 |
| 全程 | pytest ruff |
测试 / 代码质量 |
分阶段引入依赖可保持前期环境轻量(阶段一无需安装 PyTorch 系的 Ax/BoTorch),也避免了当前 Windows/Linux 混合环境下的编译问题。
8. 第一阶段实施路线(8 周)
对齐企划书「2026.05–12 完成数据采集与首批 300 组数据」的目标,从当前时点起按 8 周里程碑推进:
| 周次 | 交付物 | 验收标准 |
|---|---|---|
| W1–W2 | 工程骨架 + 领域模型 + SQLite 库表 | uv sync 可装、pytest 全绿、库表可建可写 |
| W3 | DoE 生成器(LHS 初始采样) | 生成亚克力 40 组参数网格 CSV,范围符合设备量程 |
| W4–W5 | 实验记录工作流(CLI 录入 + 串口采集) | 单条实验记录全字段校验入库,重复/越界被拦截 |
| W6 | 首批数据:亚克力 + 椴木 ≥120 组,数据字典 v1 | 完整率 100%,EDA 快照可复现 |
| W7 | 基线模型试跑(GPR / XGBoost) | LOMO 交叉验证管线跑通(不考核精度) |
| W8 | 主动学习接口预留 + 中期检查文档 | Ax 环境可运行 qNEI 批量推荐 demo |
进度风险提示
串口自动采集依赖厂商提供 HZZ-M300U 的通信协议文档;若 W4 前未取得,立即切换为「CLI 手工录入」模式兜底,不影响 W6 数据目标。企划书中 2026.06 完成串口开发的计划以此风险开关为条件。
9. 风险登记表
| 风险 | 等级 | 影响 | 缓解措施 |
|---|---|---|---|
| GPR 的 ONNX 导出精度差异 | 中 | 线上推理结果偏离训练基线 | 导出后强制 float64 对比验证;备选 joblib + FastAPI 直载[11] |
| HZZ-M300U 串口协议未知 | 中 | 自动采集延期,拖累数据目标 | W1 起向厂商索取协议;CLI 手工录入兜底 |
| 小样本 LOMO 精度不达标 | 中 | 新材料推荐误差超 8% 目标 | 特征工程优先;大类分层训练备选;主动学习提高单数据信息量 |
| TabPFN 适用边界 | 低 | 第四候选失效 | 仅作对比不依赖;主线仍是 GPR / XGBoost |
| 5 人团队协作冲突 | 低 | 代码互踩、数据覆盖 | Git 分支规范 + ruff 统一格式 + SQLite 单写入口(store.py) |