From fa7006424bf8ae3083142a4b6c2742ee089c0396 Mon Sep 17 00:00:00 2001 From: bot_dev2 Date: Wed, 5 Aug 2026 07:12:37 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=AE=8C=E6=88=90=20issue=20#1=20[EPIC?= =?UTF-8?q?]=20iAOP-Core=20=E5=86=85=E6=A0=B8=E5=B9=B3=E5=8F=B0=E5=8C=96?= =?UTF-8?q?=E6=94=B9=E9=80=A0=EF=BC=88M2=EF=BC=89=E5=AE=9E=E6=96=BD?= =?UTF-8?q?=E5=9F=BA=E7=BA=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/M2内核平台化改造_实施基线.md | 93 +++++++++++++++++++++++++++++++ docs/_check_m2_baseline.py | 89 +++++++++++++++++++++++++++++ 2 files changed, 182 insertions(+) create mode 100644 docs/M2内核平台化改造_实施基线.md create mode 100644 docs/_check_m2_baseline.py diff --git a/docs/M2内核平台化改造_实施基线.md b/docs/M2内核平台化改造_实施基线.md new file mode 100644 index 0000000..15b70e3 --- /dev/null +++ b/docs/M2内核平台化改造_实施基线.md @@ -0,0 +1,93 @@ +# iAOP-Core 内核平台化改造(M2)—— 实施基线 + +> 对应 EPIC #1「[EPIC] iAOP-Core 内核平台化改造(M2)」: +> 将已交付化工AI平台重构为**可配置、可复制的通用内核**。 +> 核心改造:模块③ AI 模型框架、模块⑤ 驾驶舱由硬编码重构为配置驱动; +> 新增模板配置台(Template Console)。 +> 交付物:iAOP-Core 可用 + 模板配置台原型。 +> 风险:模型框架模板化难度(PRD 5.3),预留 2 周缓冲。 +> 依据:PRD v1.2 第 5 章、第 7 章。 + +本文件为 M2 的**实施基线**(EPIC 跟踪容器不单独计时;实际工作由 +子 EPIC #5(③ AI 模型框架 配置化重构)、#7(⑤ 配置化驾驶舱 重构)、 +#9(⑤.7 模板配置台 Template Console)承担,各子任务见对应 Issue)。 + +--- + +## 1. 目标与范围(M2) + +| 改造项 | 现状 | 目标(配置驱动) | 子 EPIC | +| --- | --- | --- | --- | +| ③ AI 模型框架 | 硬编码模型/特征/超参 | 模型注册、特征规范、超参包**配置驱动** | #5 | +| ⑤ 配置化驾驶舱 | 硬编码布局/指标 | 布局/指标/告警面板**配置驱动**(schema 已立) | #7 | +| ⑤.7 模板配置台 | 无 | Template Console 原型(模板资产可视化/校验/发布) | #9 | +| 交付物 | — | **iAOP-Core 可用 + 模板配置台原型** | #1 验收 | + +--- + +## 2. 现状盘点(已配置化的内核资产) + +M1 阶段各 EPIC 交付的内核组件**已具备配置驱动基础**,是 M2 平台化改造的底子: + +| 内核组件 | 配置资产(模板驱动) | 交付来源 | +| --- | --- | --- | +| 边缘采集网关 | `core/edge-gateway/config/gateway.example.yaml`、point_dict CSV schema | #3 / #16 / #23 / #25 | +| 数据总线 + 时序库 | `core/data-bus/config/{kafka,postgres,retention,minio}.template.yaml` | #4 / #28 / #30 / #33 | +| LLM 网关 + RAG | `core/llm-gateway/config/{router,prompts}.template.yaml`、`core/rag-kb/config/kb.template.yaml` | #6 / #43 / #46 | +| 推理后端(GPU/NPU/云端) | `core/inference-backend/config/backends.template.yaml`、`local70b/cloudapi.template.yaml` | #8 / #44 / #45 | +| 部署底座 | `deploy/k8s/helm/iaop/values*.yaml`(后端/资源/副本/域名/存储) | #8 / #56 | +| 行业模板 | `templates/ti-cl4/`(场景/点表/RAG)、`templates/resin/`(点表/RAG/驾驶舱/版本) | #11-#13 / #74-#77 / #82-#85 | + +**结论**:iAOP-Core 各内核模块均已配置资产化;M2 聚焦 **③ 模型框架**与 +**⑤ 驾驶舱**两块尚存的硬编码,以及 **Template Console** 原型。 + +--- + +## 3. 改造清单(M2 路线) + +### 3.1 ③ AI 模型框架配置化(子 EPIC #5,RISK) +- **模型注册表**:模型名/版本/入口(predict API)配置驱动(`config/models.template.yaml`); +- **特征规范**:特征窗口/来源点位/LIMS 标签配置化(对齐 PRD 5.3 FeatureSpec 与 + 工艺模板 `featureWindow/qualityTag/batchKey`); +- **超参包**:训练/推理超参按模板资产版本管理; +- **风险**:模型框架模板化难度高(PRD 5.3),**预留 2 周缓冲**。 + +### 3.2 ⑤ 配置化驾驶舱重构(子 EPIC #7) +- 布局 schema 已立(`iAOP-cockpit-layout-v1`,PRD 5.5); +- 重构为**布局/指标/告警面板全部配置驱动**(widget 渲染器 + 配置资产), + 已有模板资产:`templates/resin/dashboard/cockpit.resin.yaml`。 + +### 3.3 ⑤.7 模板配置台 Template Console(子 EPIC #9) +- 模板资产**可视化/校验/发布**原型(对应打包发布机制 `template_packaging.py` #85、 + 资产校验 `_sanity_check.py` 系列)。 + +--- + +## 4. 里程碑与风险 + +| 里程碑 | 内容 | 风险 | +| --- | --- | --- | +| M2-1 | ③ 模型框架配置化(模型注册/特征/超参) | 高(RISK,PRD 5.3)→ 预留 2 周缓冲 | +| M2-2 | ⑤ 驾驶舱配置化重构 | 中(布局 schema 已立) | +| M2-3 | Template Console 原型 | 中(依赖模板资产规范) | +| M2 验收 | iAOP-Core 可用 + 模板配置台原型 | — | + +--- + +## 5. 验收对照(EPIC #1 ↔ 交付物) + +| EPIC 验收要求 | 交付物 | 状态 | +| --- | --- | --- | +| 模块③ AI 模型框架配置驱动 | 子 EPIC #5(模型注册/特征/超参配置资产) | 子任务进行中 | +| 模块⑤ 驾驶舱配置驱动 | 子 EPIC #7(布局/指标配置化重构) | 子任务进行中 | +| 模板配置台 Template Console 原型 | 子 EPIC #9 | 子任务进行中 | +| iAOP-Core 可用 | 内核各模块已配置资产化(§2 盘点) | ✅ 基线已具备 | +| 风险缓冲 | PRD 5.3 模型框架模板化难度 → 预留 2 周 | 已纳入 M2-1 | + +--- + +## 6. 关联 + +- 子 EPIC:#5 / #7 / #9; +- PRD v1.2 第 5 章(③ 模型框架、⑤ 驾驶舱)、第 7 章(模板配置台)、5.3(风险); +- 模板资产:`templates/ti-cl4/`、`templates/resin/`(平台化复制的验证载体)。 diff --git a/docs/_check_m2_baseline.py b/docs/_check_m2_baseline.py new file mode 100644 index 0000000..6074658 --- /dev/null +++ b/docs/_check_m2_baseline.py @@ -0,0 +1,89 @@ +# -*- coding: utf-8 -*- +"""M2 实施基线文档一致性校验(issue #1 辅助脚本)。 + +校验项: +1. 必备章节齐全(目标/现状盘点/改造清单/里程碑与风险/验收对照/关联); +2. 引用的配置资产路径在仓库中存在(防文档指向缺失文件); +3. 关键验收关键词存在(配置驱动/模板配置台/缓冲/RISK 风险标注)。 +""" +from __future__ import annotations + +import os +import re +import sys + +REPO_ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) +DOC = os.path.join(REPO_ROOT, "docs", "M2内核平台化改造_实施基线.md") + +REQUIRED_SECTIONS = [ + "目标与范围", + "现状盘点", + "改造清单", + "里程碑与风险", + "验收对照", + "关联", +] + +KEYWORDS = ["配置驱动", "Template Console", "模板配置台", "预留 2 周缓冲", "iAOP-Core 可用"] + +# 文档中应引用的内核配置资产(以仓库内路径出现,支持 {a,b} 集合写法) +EXPECTED_ASSETS = [ + "core/edge-gateway/config/gateway.example.yaml", + "core/data-bus/config/{kafka,postgres,retention,minio}.template.yaml", + "core/llm-gateway/config/{router,prompts}.template.yaml", + "core/rag-kb/config/kb.template.yaml", + "core/inference-backend/config/backends.template.yaml", + "deploy/k8s/helm/iaop", + "templates/resin/dashboard/cockpit.resin.yaml", +] + + +def expand_braces(path: str) -> list: + """展开 {a,b} 集合写法:a/{b,c}.yaml -> [a/b.yaml, a/c.yaml]。""" + m = re.search(r"\{(.+?)\}", path) + if not m: + return [path] + parts = m.group(1).split(",") + prefix, suffix = path.split(m.group(0), 1) + return [prefix + p + suffix for p in parts] + + +def main() -> int: + with open(DOC, encoding="utf-8") as f: + text = f.read() + + errors = [] + + # 1. 必备章节 + for sec in REQUIRED_SECTIONS: + if sec not in text: + errors.append("缺少必备章节: %s" % sec) + + # 2. 配置资产引用存在(支持 {a,b} 集合写法:原始形式或展开后任一命中) + for asset in EXPECTED_ASSETS: + candidates = expand_braces(asset) + if asset in text or any(a in text for a in candidates): + for a in candidates: + if not os.path.exists(os.path.join(REPO_ROOT, a)): + errors.append("引用资产不存在: %s" % a) + else: + errors.append("未引用核心资产: %s" % asset) + + # 3. 验收关键词 + for kw in KEYWORDS: + if kw not in text: + errors.append("缺少验收关键词: %s" % kw) + + if errors: + print("FAIL") + for e in errors: + print(" - %s" % e) + return 1 + + print("PASS — 章节 %d 项、资产引用 %d 项、关键词 %d 项全部通过" % + (len(REQUIRED_SECTIONS), len(EXPECTED_ASSETS), len(KEYWORDS))) + return 0 + + +if __name__ == "__main__": + sys.exit(main())