项目

一般

简介

0001-Sprint5规划会议纪要 » 历史记录 » 版本 2

Huarui Lin, 2026-04-25 22:37

1 1 Huarui Lin
# Sprint 5 规划会议纪要
2
3
**会议主题**:Sprint 5(第 4 阶段:S5 - 标准化与 Spearman 降维)架构规划与防线确立
4 2 Huarui Lin
**会议时间**:2026年04月25日
5 1 Huarui Lin
**参会角色**:架构师(主讲)、研发负责人(决策)
6
**会议基调**:锁定“空间换时间”全局原则与“内存防爆”底线,确立 S5 阶段的绝对物理拓扑。
7
8
---
9
### 一、 会议核心决议汇总
10
11
**1. 架构基线修正(DRY 原则向内存红线让步)**
12
*   **决议**:正式批准 S5 训练阶段(面对 3000 万行数据)豁免复用 `core.standardization_math`(纯 NumPy 算子),强制采用 Polars 表达式原地 Apply 拓扑,以守住 50GB cgroup 内存红线。
13
*   **闭环动作**:作为豁免代价,必须在 Sprint 5 交付前修改 `2-dry_module_list.md` 中该模块的“被依赖方”说明,明确标注 S5 豁免复用的物理原因,确立 S6 推理作为唯一复用事实。
14
**2. 数据流加载边界与配置契约**
15
*   **决议**:废除任何硬编码年份逻辑。S5 动态时间窗口通过在 `config.yaml` 中新增 `s5.data_start_year` 与 `s5.data_end_year` 收敛,由 `core.config_loader.py` 启动时强校验。
16
*   **决议**:S5.4 Spearman 阶段的按年流式加载,强制复用 `core.stream_engine` 模块实现按年流式加载与内存释放。
17
**3. S5.1 截面聚合与双形态参数拓扑**
18
*   **决议**:推理长表必须基于 S3 全量数据的最小/最大日期极值,在 S5.1 阶段动态生成绝对自然日历表并落盘为 `calendar_dim.parquet`,严禁硬编码。
19
*   **决议**:针对底层物理排序键冲突(默认 `["net_value_date", "fund_id"]` 与推理长表强制要求的 `["feature_name", "date"]` 冲突),同意升级 `core.physical_storage_contract`。在其 `sink_parquet_strict()` 方法签名中新增 `override_sort_keys: Optional[List[str]] = None` 参数,符合开闭原则。
20
**4. `core.stream_engine` 内存断言演进路线**
21
*   **决议**:废除硬编码 3GB 断言的死锁设计。采用“配置化 + 硬天花板”演进方案:阈值抽离至 `config.yaml`(如 `engine.stream_max_memory_peak_gb`),但在引擎内部强制设定 `final_assert_limit = min(config_value, 15.0)`。既释放大机器性能红利,又锁死物理毁灭的绝对底线。
22
**5. S5.4 Spearman 环境自适应开关**
23
*   **决议**:在 `config.yaml` 中落地 `spearman.load_mode` 枚举强校验(仅允许 `yearly_chunked` 或 `full_load`),生产环境默认值强制锁定为 `yearly_chunked`。
24
**6. 纯业务防线确认(无分歧,全员对齐)**
25
*   确认 S5.2 标准化 Apply 严禁将 3000 万行宽表 Unpivot(死刑级禁止项),必须在实体表状态下执行等值 Join。
26
*   确认 S5.3 训练 Join 必须强制锁死三键 `["fund_id", "net_value_date", "segment_id"]`,且毒样本截断基于 `is_feature_complete` 哨兵列在 Join 后强制覆写 `label=0`。
27
**7. 物理产出与持久化契约**
28
*   确认降维后的最终特征子集采用 JSON 格式物理落盘为 `final_feature_list.json`。
29
30
---
31
### 二、 会议待办事项清单
32
33
| 序号 | 待办事项 | 责任方 | 交付物/验证标准 | 关联决议 |
34
| :--- | :--- | :--- | :--- | :--- |
35
| 1 | 架构文档降级更新 | 架构师 | 更新后的 `2-dry_module_list.md` | 决议 1 |
36
| 2 | 配置中心扩展 | 研发 | `config.yaml` 新增 S5 年份配置、流式引擎峰值配置及 Spearman 模式配置;`core/config_loader.py` 增加 Pydantic 校验 | 决议 2, 4, 5 |
37
| 3 | 核心存储模块升级 | 研发 | 升级后的 `core.physical_storage_contract.py` 及对应单测覆盖 | 决议 3 |
38
| 4 | 核心流式引擎演进 | 研发 | 演进后的 `core.stream_engine.py`(包含 15GB 硬天花板拦截逻辑)及对应单测覆盖 | 决议 4 |
39
| 5 | S5.1 自然日历表生成逻辑 | 研发 | 产出 `calendar_dim.parquet` 的代码逻辑及 Schema 校验单测 | 决议 3 |
40
| 6 | S5.2 IEEE 754 拦截防线实施 | 研发 | 封杀 `Inf` 击穿 LightGBM 的 Polars 表达式逻辑及边界测试 | 决议 6 |
41
| 7 | S5.4 Spearman 数学防线实施 | 研发 | 按“按年分块算秩 -> 显式锁定平均秩 -> 强制中心化 -> Pearson 展开项累加 -> 对称化截断”链路实施 | 决议 5 |
42
| 8 | 最终产物交付与 Schema 校验 | 研发/QA | 产出 `standardization_params_wide.parquet`、`standardization_params.parquet`、`final_feature_list.json`,并通过 CI Schema 对称差红线 | 决议 7 |
43
44
---
45
**纪要结语**:本次规划会议成功拆解了 S5 阶段在千万级面板下的所有物理内存陷阱与底层冲突。所有核心防线均实现了“单一真实来源(DRY)”或“空间换时间”的企业级兜底,未遗留任何悬而未决的架构缝隙。研发团队可基于本纪要直接开展排期与编码工作。