Files
next-tjwater-server/docs/tjwater2-v2-burst-balanced-design.md
T

186 lines
16 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# tjwater2_v2 多距离、弱信号爆管场景
状态(2026-11-07):完成四区域、三档破口、四时段的 48 组本地水力校准与固定阈值敏感性分析,并从中选出 4 个演示 case。4 个爆管方案已保存,压力、流量和正常水质数据已写入隔离项目与 `tjwater2_v2` 的 IoT 库。动态阈值尚未接入真实监测 worker,正式 benchmark Runner、真实工单和 SCADA Agent 链路、评分及归档仍待实现。
同日管网 ID 修复后,R1 管段当前 ID 为 `564345`,流量设备 `542121` 的绑定管段当前 ID 为 `570995`。管段属性、几何、拓扑和 SCADA 测量值未变化。隔离 benchmark 的 BizDB、852,960 条正常实时结果,以及清单直接引用的 2,016 条方案管段结果已同步。以下清单统一使用新 ID。
48 个历史方案保存了全管网结果,其中未被当前 benchmark 清单引用的长管段仍属于迁移前的校准归档,不进入 Agent 输入或当前 scorer。完整历史结果的全量迁移因压缩块重写耗时过长而回滚;如需把旧方案用于全管网地图展示,应重新生成方案或另行离线迁移,不能混用新模型 ID 与旧结果 ID。
## 当前演示数据集
演示数据使用隔离项目 `tjw_bench_tjwater2_20261105`,项目 UUID 为 `66ce6b1a-4415-4cd0-b68f-bf1505576c79`。`tjwater2_v2` 与隔离项目的 IoT 库均写入相同数据,便于在完整系统中演示,也便于 benchmark 指定隔离数据源运行。后续自动评测默认使用隔离项目,避免业务操作、清洗结果或回放状态互相影响。
每个月写入 1 日 00:00 至 18 日 00:00 前的数据,共 17 天、1,632 个 15 分钟时刻。设备包括 83 台压力设备、35 台流量设备和 50 台水质设备,共 168 台。每台设备每月 1,632 点,每月 274,176 行,四个演示窗口合计 1,096,704 行。`cleaned_value` 初始为空,由真实清洗和回放流程产生。
每个事件前都有精确的 15 天同时间点历史,即 1,440 个时刻。按全部 168 台设备计算,每个 case 的事前基线为 241,920 行。检测算法使用事件时刻之前 15 天的同时间点数据,不要求自然月内其余日期全部正常或完整。
### 4 个演示 case
时间均为北京时间(UTC+8)。事件持续 5 小时,包含起止点共 21 帧;事件结束后的下一个 15 分钟时刻恢复正常数据。
| Case | 事件时间 | 入口 | 管段 | 破口面积 | 等效圆孔直径 |
| --- | --- | --- | --- | ---: | ---: |
| `B26-severe` | 2026-05-16 08:00 至 13:00 | SCADA 自动发现 | `564345` | 22.089323 cm² | 53.03 mm |
| `B28-severe` | 2026-06-16 20:00 至 06-17 01:00 | SCADA 自动发现,跨日 | `564345` | 22.089323 cm² | 53.03 mm |
| `B30-severe` | 2026-07-16 08:00 至 13:00 | 工单在事件发生 60 分钟后上报 | `541725` | 353.429174 cm² | 212.13 mm |
| `B35-severe` | 2026-08-16 12:00 至 17:00 | 工单在事件发生 120 分钟后上报 | `538540` | 245.436926 cm² | 176.78 mm |
四个 case 均使用管道截面积的 1/8,比例不是管径的 1/8。B26 和 B28 复用同一物理位置,用来比较早间与晚间跨日条件。B30、B35 使用更大口径和更远压力测点,用来覆盖区域、信号强度和工单发现延迟的差异。
| Case | 破口坐标 WGS84 | 管径 / 长度 | 最近压力设备 / 沿网距离 |
| --- | --- | --- | --- |
| B26 / B28 | 121.471119, 31.005631 | DN150 / 249.176 m | `92724` / 约 0.205 m |
| B30 | 121.569785, 30.956880 | DN600 / 495.368 m | `170486` / 约 1.19 km |
| B35 | 121.487510, 30.823888 | DN500 / 121.485 m | `102837` / 约 2.67 km |
### 泄漏真值与 SCADA 流量响应
破口泄漏量来自水力模拟,是隐藏评测真值,不能直接进入 Agent 的提示词、任务上下文或可见工具结果。SCADA 流量是 Agent 可见证据,单位为 m³/h,已完成 L/s 到 m³/h 的换算并加入确定性仪表噪声。
| Case | 泄漏量 L/s | 泄漏量 m³/h | 代表性 SCADA 流量变化 |
| --- | ---: | ---: | --- |
| B26 | 21.60 至 23.49 | 77.76 至 84.58 | `449417` +37.32 m³/h;`516234` +15.63 m³/h |
| B28 | 21.99 至 25.81 | 79.15 至 92.90 | `449417` +49.42 m³/h;`542121` +102.68 m³/h |
| B30 | 424.15 至 446.33 | 1,526.95 至 1,606.79 | `524529` +296.26 m³/h;`541061` +241.34 m³/h |
| B35 | 236.97 至 261.11 | 853.08 至 940.01 | `508453` +926.08 m³/h;`527865` +46.96 m³/h |
三个主要水厂计量设备的 5 小时最大变化如下。百分比按同时间正常值计算;小流量管段的基线接近 0 时,百分比会失真,评分必须同时看绝对变化量和流向。
| Case | `542017` | `486033` | `542121` |
| --- | ---: | ---: | ---: |
| B26 | +50.11 m³/h,1.23% | -82.44 m³/h,1.27% | +32.15 m³/h,3.47% |
| B28 | -81.51 m³/h,3.37% | +129.10 m³/h,3.65% | +102.68 m³/h,19.10% |
| B30 | +713.91 m³/h,19.13% | +293.30 m³/h,4.75% | +258.24 m³/h,27.95% |
| B35 | +212.19 m³/h,5.43% | +491.69 m³/h,8.01% | +102.87 m³/h,11.64% |
### 正常水质数据
50 台水质设备使用 EPANET 化学水质模拟生成正常余氯数据,没有用固定常数补值。13 个水库和 15 个正常入流水源设置为 0.50 mg/L,全网初始余氯为 0.35 mg/L,体相衰减为 -0.05/天,管壁衰减为 -0.02/天。模型预热 6 天后取第 7 天的正常日曲线,按 15 分钟间隔重复到各 case 窗口。
仪表噪声使用固定种子,标准差为读数的 0.5%,最低标准差为 0.001 mg/L,并截断在正负 3 倍标准差内。最终数据约为 0.071 至 0.507 mg/L,没有零值、负值或求解警告。当前四个爆管 case 内的水质保持正常,只用于保证设备读数完整,不作为爆管响应或判分指标。
## 管段与监测距离
保留一个近测点强信号对照,其余改用中远距离候选。距离取爆管节点到全部压力设备中的最近沿网距离,不是到任意挑选的某个测点的距离。按管道模型长度累计,阀门连接按近零长度处理,表中取近似值。
| 组别 | 管段 ID | 管径 / 长度 | 最近压力设备 / 沿网距离 | 破口经纬度 WGS84 | 边界阀 / 分区节点 |
| --- | --- | --- | --- | --- | --- |
| R1 近点对照 | `564345` | DN150 / 249.176 m | `92724` / 约 0.205 m | 121.471119, 31.005631 | 5 / 11 |
| R2 中距干管 | `541725` | DN600 / 495.368 m | `170486` / 约 1.19 km | 121.569785, 30.956880 | 4 / 64 |
| R3 远距多点响应 | `538540` | DN500 / 121.485 m | `102837` / 约 2.67 km | 121.487510, 30.823888 | 2 / 10 |
| R4 远距弱信号 | `541116` | DN200 / 228.424 m | `406444` / 约 2.91 km | 121.441641, 30.982725 | 4 / 9 |
四处均经过后端隔离算法和水源连通校验,关闭所列边界阀后可在模型拓扑上切断水源。分区节点数不等于用户数、实际停水范围或现场阀门可操作性。
上轮贴近测点的 DN110、DN315、DN500 候选及其结果仍保留,不能因本轮换管段而重用其 case ID。
## 破口面积与发生时间
比例均指管道截面积,不是管径;不再只选一个最容易触发的面积。
| 管段 | 1/32 面积 cm² | 1/16 面积 cm² | 1/8 面积 cm² |
| --- | ---: | ---: | ---: |
| R1 DN150 | 5.522331 | 11.044662 | 22.089323 |
| R2 DN600 | 88.357293 | 176.714587 | 353.429174 |
| R3 DN500 | 61.359232 | 122.718463 | 245.436926 |
| R4 DN200 | 9.817477 | 19.634954 | 39.269908 |
发生时间统一为北京时间 2026-10-08 的 02:00、08:00、12:00、20:00,分别覆盖夜间、早间、日间、晚间。每个事件持续泄漏 5 小时,15 分钟一步,共 21 帧;20:00 场景结束于次日 01:00。3/4 小时视图按前缀截取。
R1 至 R4 分别对应 B25 至 B28、B29 至 B32、B33 至 B36、B37 至 B40;三档面积作为 case 的独立维度,例如 `B29-medium`。共 4×3×4=48 个物理场景,后续再派生 SCADA 与 WO-30/60/120/180 等入口 case,不能把这些派生用例当成不同物理事件。
所有场景有相同起始时间、模型状态、需求模式和 PDA 参数的无爆管对照。三个主要水厂出口设备 `542017`、`486033`、`542121` 均保留;压力单位 m,流量结果 L/s 映射 SCADA 时转为 m³/h。
## 观测结果与动态阈值
各场景在 5 小时内的最大监测压降,以下取四个发生时段的范围。这是相同时间正常/事故模拟的差异,不是运行告警直接可用的未来对照。
| 管段 | 1/32 | 1/16 | 1/8 |
| --- | ---: | ---: | ---: |
| R1 | 11.58% 至 12.69% | 26.37% 至 28.08% | 52.84% 至 54.65% |
| R2 | 4.48% 至 5.57% | 9.92% 至 11.90% | 22.05% 至 25.14% |
| R3 | 3.95% 至 6.24% | 7.91% 至 12.21% | 14.65% 至 21.58% |
| R4 | 0.10% 至 0.13% | 0.19% 至 0.26% | 0.37% 至 0.50% |
48 组均完成求解,未出现求解警告、指定监测点负压或结果缺失。R2 至 R4 因未达到旧 30% 门槛而被标为 `weak_signal_candidate`,仍然是有效爆管正例;不当成无爆管样本,也不为让所有 case 通过而增大破口。
固定阈值复用实际清洗/回放相对变化规则,使用四帧预热和连续两帧,未加入绝对压降门槛。16 个正常对照按“管段×时间”去重:
| 固定压降阈值 | 触发的爆管场景 / 48 | 误报的正常对照 / 16 |
| --- | ---: | ---: |
| 3% | 47 | 13 |
| 5% | 41 | 8 |
| 10% | 25 | 3 |
| 20% | 11 | 0 |
| 30% | 4 | 0 |
这里的“触发”只是规则预览,不是 Agent 识别成功;极低阈值下的高触发率不能忽略正常误报。
动态规则采用独立版本,初始实验方案如下:
1. 每个测点仅用事件前 15 天完整正常数据拟合,15 分钟间隔要求 1440 点;有缺点时报告历史未就绪。
2. 按日内时段建立正常压力中位数参考,避免将正常早晚变化当成事故;用去除日内模式后的 `1.4826×MAD` 表示相对波动。
3. 测点相对阈值取 `max(3%, 3×相对波动)`,与绝对压降至少 0.5 m、连续两帧同时成立。3%、0.5 m 是首轮实验参数,需结合测点精度和正常误报结果校准。
4. 在事件前冻结参考、阈值和规则版本;拟合函数拒绝事件时刻及之后的观测。评估遇到采样中断会重置连续计数。
5. 压力异常后仍需流量或独立压力证据交叉验证。实验函数目前只覆盖压力层,未接入生产监测 worker。
本次水力包只有四帧事件前预热,因此尚不能给出真实项目动态规则的检测率。当前新增的学习与评估函数仅通过合成正常历史验证;不能把上表固定阈值结果说成动态规则已验收。
## 复现与数据边界
清单:[tjwater2-v2-burst-balanced.json](../resources/benchmarks/tjwater2-v2-burst-balanced.json)。原有强信号清单保持不变。
```bash
conda run -n server python scripts/check_burst_simulation_design.py \
--design resources/benchmarks/tjwater2-v2-burst-balanced.json
conda run -n server python scripts/calibrate_burst_benchmark.py \
--design resources/benchmarks/tjwater2-v2-burst-balanced.json --all-severities
conda run -n server python -m pytest \
tests/unit/test_burst_benchmark_calibration.py \
tests/unit/test_regional_burst_selection.py \
tests/unit/test_burst_pressure_thresholds.py -q
```
`scripts/analyze_burst_thresholds.py --calibration-dir <某次校准目录>` 复用已冻结结果做阈值敏感性分析,无需重跑水力。`scripts/prepare_regional_burst_design.py` 输出的 GeoJSON 包含管段、实际破口点和边界阀,位于被忽略的本地数据目录。
源管网模型在准备阶段保持只读。当前已建立隔离 BizDB、IoT 库和模型模板,并通过正常模拟与保存的爆管方案按设备绑定生成最终 `scada.measurements`。为支持完整系统演示,同一份 SCADA 数据也写入 `tjwater2_v2` 的 IoT 库。动态拟合和 Agent 评测只能读取各自知识截止时刻以前的数据;模拟真值及方案信息不进入 Agent 可见上下文。
## 正式生成优先本地后端方法
本地执行优先复用 `app.services.simulation_scenarios.burst_analysis()`。MCP 的 `run_burst_simulation` 适配器和 `save_simulation_scenario` 保存入口也调用这个函数,分别设置 `persist_results=False` 和 `True`。固定模型、SCADA 边界输入、时间、破口与单位后,两条入口共用水力计算实现;MCP 额外承担权限、上下文、任务和审计等流程。
此前直接修改 INP 的结果只用于选管校准。正式 4 个演示 case 已在隔离路由下保存方案,保留正式 `run_id`、模型和结果摘要,再按设备绑定写入 SCADA。Agent 评测仍需使用真实工具链,数据生成成功不能替代 MCP 工具成功率、计划过程和最终业务效果评分。
## 方案结果到 SCADA 的映射
先分配日期窗口,再按该时间运行正常模拟和爆管方案;默认沿用计算结果的真实时间戳写入 SCADA,不在写入时悄悄平移日期。
| SCADA 设备类型 | 绑定字段 | 正常数据源 | 事故数据源 | 写入值 |
| --- | --- | --- | --- | --- |
| 压力 | `asset.scada_devices.node_id` | `realtime.node_results.pressure` | 指定 `run_id` 的 `analysis.node_results.pressure` | 单位核验后写 m |
| 管道流量 | `asset.scada_devices.link_id` | `realtime.link_results.flow` | 指定 `run_id` 的 `analysis.link_results.flow` | 本模型 L/s × 3.6,写 m³/h |
最终键使用 SCADA 的 `device_id`,不能使用模型节点 ID 代替;写入 `scada.measurements.monitored_value`,`cleaned_value` 初始为空,由真实清洗流程计算。压力和管道流量来自正常与爆管水力计算,水质来自独立的正常化学水质模拟。设备列表、绑定、单位和排除原因在生成前冻结,不为了补齐数据自动移动或改绑设备。
`analysis` 的 `run_id` 能区分多个方案,SCADA 的主键只有 `(time, device_id)`,不能区分同一设备同一时刻的多个场景。因此,同管段的不同破口面积也必须分配独立日期,不能只给不同管段分日期。
每个物理 case 的保留窗口覆盖事前 15 天正常历史、5 小时事故、末点采样和恢复缓冲。当前 4 个演示 case 分配在 2026 年 5 月至 8 月,每月一个 case,基线不会混入其他事故。
当前日期映射已冻结在 `resources/benchmarks/tjwater2-v2-burst-demo.json`。B26、B28、B30、B35 分别使用 2026 年 5 月、6 月、7 月、8 月窗口。工单时间、发现检查点和知识截止随日期统一生成。更换提示词、工具或 MCP 版本时复用同一冻结数据,不重新分配日期或重新生成噪声。
5 小时事故结果包含起止点,共 21 帧;当前正常在线模拟为右端不含,直接运行 5 小时仅有 20 帧。若保留事故末点,正常对照须额外生成该时刻,不能将缺失的正常值补零或与上一时刻配对。SCADA 记录使用带时区时间,按北京时间规划、按 UTC 存储和比较;回放查询的右端不含时,查询终点需覆盖最后一帧。
写入前检查整个保留窗口和 `(time, device_id)` 冲突;发现已有记录时停止并重新分配日期,不使用覆盖式 upsert 或 `ON CONFLICT DO NOTHING` 隐藏碰撞。写入采用事务和生成器之间的排他锁,唯一约束兜底。重复执行依据数据集清单和内容摘要验证幂等,不重复插入。
提交后已使用新连接按设备、日期、行数、单位和数值摘要读回校验。生成状态保存在 Git 忽略目录 `data/benchmark-generation/tjwater2-20261105/`,包括 `demo-scada-state.json` 和 `normal-quality-state.json`。这些文件记录 `case_key`、方案 `run_id`、实际日期、单位、行数与指纹,属于本地生成证据,不提交 Git,也不向 Agent 暴露方案真值。
## Benchmark 执行边界
当前数据集已经满足 4 个演示 case 的数据输入要求,但还不能据此声称 Agent benchmark 已完成。后续自动化执行需要按 case 恢复初始业务状态,设置知识截止和入口触发时间,运行真实工单或 SCADA 发现链路,记录计划、工具调用、MCP 调用、任务结果和展示结果,再统一评分和归档。
建议将评分拆成四部分:事件识别与时间得分、定位与影响分析效果得分、工具调用成功率与参数正确性得分、计划和证据链完整性得分。泄漏量、真实管段、方案 `run_id` 和无噪声模拟结果只供 scorer 使用。Agent 可见输入限于当时可查询的 SCADA、工单和正常业务配置。
当前仍有两个运行配置缺口:`tjwater2_v2` 只设置了 `scada_monitoring_interval_seconds=900`,尚未配置 `scada_monitoring.pressure_device_ids` 和 `outlet_flow_device_ids`,联合爆管监测会报告角色未配置;新的 4 个 case 尚未执行完整 SCADA 回放和真实 Agent 端到端验收。