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

16 KiB
Raw Permalink Blame History

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。原有强信号清单保持不变。

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 端到端验收。