16 KiB
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 识别成功;极低阈值下的高触发率不能忽略正常误报。
动态规则采用独立版本,初始实验方案如下:
- 每个测点仅用事件前 15 天完整正常数据拟合,15 分钟间隔要求 1440 点;有缺点时报告历史未就绪。
- 按日内时段建立正常压力中位数参考,避免将正常早晚变化当成事故;用去除日内模式后的
1.4826×MAD表示相对波动。 - 测点相对阈值取
max(3%, 3×相对波动),与绝对压降至少 0.5 m、连续两帧同时成立。3%、0.5 m 是首轮实验参数,需结合测点精度和正常误报结果校准。 - 在事件前冻结参考、阈值和规则版本;拟合函数拒绝事件时刻及之后的观测。评估遇到采样中断会重置连续计数。
- 压力异常后仍需流量或独立压力证据交叉验证。实验函数目前只覆盖压力层,未接入生产监测 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 端到端验收。