4.9 KiB
4.9 KiB
推理接口对材料类型的支持分析与实施方案
根据最新的需求,algorithm_model 表已支持 material_type 字段,用于区分不同材料(如 Pu、U 等)的专用模型。为了在仿真推理阶段能够正确加载对应的模型,需要对现有的推理数据流进行改造,确保“材料类型”这一关键上下文能够从仿真计算传递到推理服务。
1. 现状分析 (As-Is)
1.1 数据流现状
- SimController: 调用
simBuilder.buildUnits构建仿真单元。 - SimBuilder: 从
Topology和MaterialService读取数据,构建SimUnit。- 当前缺失:
SimUnit仅包含materialId,未包含materialType。 - 当前缺失:
Material实体类中也未明确发现materialType字段(仅有name,concentrations等)。
- 当前缺失:
- SimInferService: 将
SimContext转换为DeviceStepInfo,并按deviceType分组。- 当前缺失: 分组逻辑未考虑材料类型。
- DeviceInferService: 接收分组数据,再次按
algorithmType分组,然后调用algorithmModelService.getCurrentModelPath(algo, device)。- 当前缺失: 调用获取模型路径接口时,缺少
materialType参数,导致无法精确定位到特定材料的模型(可能默认返回第一个或报错)。
- 当前缺失: 调用获取模型路径接口时,缺少
1.2 关键断点
- 源头缺失: 仿真单元(SimUnit)不知道自己处理的是什么类型的材料。
- 传递中断: 推理服务(InferService)无法获取材料类型信息。
- 查询不足: 模型匹配逻辑未利用材料类型进行过滤。
2. 实施方案 (To-Be)
2.1 第一步:完善领域模型 (Domain & Model)
1. 不修改 Material 实体
需要根据材料表获取的是U浓度值或者Pu浓度值,决定Material_type = U 或者Pu
这个主要是模型根据材料类型训练来的,所以只能把数据也做了材料分类。
2. 修改 SimUnit Record
在 SimUnit 中增加 materialType 字段,用于在内存中流转该信息。
public record SimUnit(
String unitId,
String deviceId,
String materialId,
String deviceType,
String materialType, // 新增
Map<String, Double> staticProperties
) {}
3. 修改 DeviceStepInfo
在 DeviceStepInfo 中增加 materialType 字段,确保分组时能携带此信息。
public class DeviceStepInfo {
// ... 原有字段
private String materialType; // 新增
// getter/setter ...
}
2.2 第二步:更新构建逻辑 (SimBuilder)
在 SimBuilder.buildUnits 方法中:
- 在查询
Material信息时,根据材料属性(U浓度/Pu浓度等)推导materialType。- 规则示例:若
pu_concentration > 0则为Pu,否则若u_concentration > 0则为U,否则为unknown。
- 规则示例:若
- 在构造
SimUnit时,将material_type注入。
2.3 第三步:更新推理准备逻辑 (SimInferService)
在 SimInferService.asyncInferAndSave 方法中:
- 在将
SimContext转换为DeviceStepInfo时,从对应的SimUnit中提取materialType并赋值给DeviceStepInfo。 - 分组策略变更:
- 原:
Map<String, List<DeviceStepInfo>>(Key: DeviceType) - 新: 保持外层按
DeviceType分组不变,利用DeviceStepInfo内部携带的materialType在下一步进行细分。
- 原:
2.4 第四步:更新推理执行逻辑 (DeviceInferService)
在 DeviceInferService.processDeviceInference 方法中:
- 接收到的数据是按
DeviceType分组的。 - 三级分组: 遍历设备列表,进一步按
AlgorithmTypeANDMaterialType进行分组。- 构造复合键或嵌套 Map:
Map<String, Map<String, List<DeviceStepInfo>>>(AlgoType -> MaterialType -> List)。
- 构造复合键或嵌套 Map:
- 模型匹配:
String modelPath = algorithmModelService.getCurrentModelPath(currentAlgoType, deviceType, currentMaterialType); - 请求构建: 确保找到的模型是与当前批次数据的材料类型匹配的。
2.5 第五步:更新模型查询接口 (AlgorithmModelService)
完善 getCurrentModelPath 方法,增加 materialType 参数,并更新 MyBatis-Plus 查询条件。
String getCurrentModelPath(String algorithmType, String deviceType, String materialType);
3. 任务清单 (Action Items)
- Domain & Model:
- 更新
SimUnit.java增加materialType。 - 更新
DeviceStepInfo.java增加materialType。
- 更新
- Builder:
- 修改
SimBuilder.java,实现材料类型推导逻辑并填充SimUnit。
- 修改
- Service:
- 修改
SimInferService.java,在转换时将materialType传递给DeviceStepInfo。 - 修改
DeviceInferService.java,实现 (Algo + Material) 的组合分组与模型匹配调用。 - 修改
AlgorithmModelService.java及实现类,增加带materialType的路径查询方法。
- 修改
- Controller:
SimController无需修改代码,验证端到端流程。