feat(#38): 跨工序寻优模型模板化(固定主干+配方加载,PRD 5.3 ③跨工序寻优)

This commit is contained in:
2026-08-05 00:57:46 +08:00
parent 793dd0a3b8
commit 11ab182bd5
9 changed files with 1461 additions and 0 deletions
+92
View File
@@ -0,0 +1,92 @@
# iAOP-Core · 模型框架层(AI Model Framework)
对应 PRD 5.3「③ AI 模型框架」与 EPIC #5「内核平台化改造」。
本层把化工 AI 的「模型」从硬编码改造为**模板化**实现:同一主干代码不变,
切换行业 / 工况只改 *配方(recipe)* —— 一个声明式 JSON 包,对齐 PRD 5.3
「**固定主干 + 可配置超参**」默认模式。
## 当前已交付
| 模块 | 对应 issue | PRD 5.3 模型 | 说明 |
|------|-----------|-------------|------|
| `cross_process_optimizer` | #38 | ③ 跨工序寻优 | 多串联工序协同寻优,可解释优化建议(采纳率≥60%) |
## 跨工序寻优(`cross_process_optimizer.py`)
化工产线由多道**串联工序**组成(氯化→精制→还原、反应→水洗→干燥)。单工序
局部最优 ≠ 全局最优:上游操作参数通过中间品指标传递到下游,影响最终收率 /
能耗 / 质量。跨工序寻优在**满足工艺约束**前提下,**协调多个工序的可调变量**,
使全流程目标达到最优,并给出**可解释的优化建议**。
### 配方(Recipe)结构
```jsonc
{
"name": "ti-cl4-cross-process-opt",
"industry": "海绵钛氯化车间",
"solver": "grid", // grid / random / analytic / stub
"solver_params": {"max_per_var": 6, "max_total": 5000},
"stages": [ // 顺序串联工序
{
"name": "氯化",
"decision_vars": [ // 本工序可调决策变量
{"name": "chlorination_temp", "low": 850, "high": 950, "step": 20, "default": 870, "unit": "℃"}
],
"transfer_vars": ["ti_cl4_yield"], // 传给下游的中间品指标
"proxy": "0.4 * (chlorination_temp - 850) / 100 + ..." // 上游如何影响下游(算术表达式)
}
],
"constraints": [ // 物料平衡 / 安全限值 / 产能上下界
{"expr": "chlorination_temp", "op": "<=", "bound": 950, "label": "安全上限"}
],
"objective": { // 最大化收率 / 最小化能耗 / 加权多目标
"expr": "purity - 0.01 * cl2_flow - 0.005 * chlorination_temp",
"sense": "max", "label": "综合收率"
},
"acceptance_floor": 0.60 // PRD 第6章里程碑:采纳率 ≥ 60%
}
```
### 快速开始
```python
from cross_process_optimizer import build_from_recipe
# 切换行业/工况只改配方文件,模型代码零改动
opt = build_from_recipe("samples/cross-process-opt/recipe.ti.json")
result = opt.optimize()
print(result.objective_score, result.accepted)
for sug in result.suggestions:
print(f"{sug.stage}/{sug.variable}: {sug.old_value}→{sug.new_value} ({sug.direction})")
```
### 求解策略
| solver | 适用 | 说明 |
|--------|------|------|
| `grid` | 离散变量少 | 决策变量离散网格笛卡尔积枚举,组合过大自动降级为 random |
| `random` | 变量多 / 连续 | 范围内随机采样 N 个候选解取最优(可设 seed 可复现) |
| `analytic` | 单变量线性 | 边界判定最优方向,最可解释(明确指出变量该往哪调) |
| `stub` | CI / 离线校验 | 取默认值,保证无依赖环境可加载 |
### 安全性
约束 / 目标 / proxy 表达式在**受限命名空间**里 eval(`__builtins__` 置空,
仅放行 `abs/min/max/round/pow/sum` 与已声明的变量名),禁止 `__import__` /
`open` / 任意属性访问,防止配方注入危险代码。
## 测试
```bash
cd core/model-framework
python -m unittest discover -s tests -v
python _sanity_check.py # 离线基本验证
```
## 与规划模块的关系
接口风格对齐 issue #34 `model_recipe`(Model Recipe 插件接口)与 #36
`quality_forecast`(质量预测模板化)。本模块**自包含、不依赖未合并分支**;
待 #34 / #36 合入后,跨工序寻优可注册为 `ModelRecipe` 的一个具名模板,
业务侧零改动。