feat: 修复 AI 风险语义并隔离 Mock 数据

This commit is contained in:
weijuesen
2026-08-14 01:16:50 +08:00
parent 839ba91354
commit 74d1948d68
29 changed files with 650 additions and 113 deletions
+30
View File
@@ -921,3 +921,33 @@ MVP 沿用 IoTDB(现状);TDengine 作为生产规模化候选(先基准
- 本任务前分支提交为 `1a29def`;回滚可还原 Task 5 提交;
- WS/AI 改动无数据库 schema 变更;若已部署,恢复旧二进制并重启即可,但需同步回滚客户端 WS 连接方式。
## 2026-08-14 整改 Task 6:修复 AI 风险语义并隔离 Mock 数据
### 做了什么
- AI 服务 `/detect` 响应新增 `modelVersion``isMock``status``abnormalProbability``healthy` 高置信度不再贡献异常概率,空检测或 `unknown` 返回 `unknown`,不自动当健康;
- Go 风险评分改为只消费 AI 异常概率:`RiskInput` 四个组件全部可空,缺失项不填 0;可用权重归一化后输出 `RiskAssessment`score/level/confidence/modelVersion/ruleVersion/components/missing);
- 巡检记录新增 `risk_assessment``model_version``is_mock` 字段和 `000002_risk_assessment` 迁移;健康画像统计默认排除 mock,Mock 结果不触发微信告警;
- `APP_ENV=production` 时收到 `isMock=true` 按失败记录并输出 error 日志,避免把联调数据当作生产检测结论;
- Web/小程序巡检页显示 Mock 标识;交叉验证中空检测/`unknown` 不再被当作 healthy
- 新增只读历史评估 SQL `scripts/risk_historical_review.sql`,统计历史 healthy 高置信度记录与风险分布,未执行批量重算。
### 设计思路与决策依据
- 规格书 AI-INS-002 要求只用 `abnormalProbability` 计算 AI 风险,因此修复了原先取最大 confidence 导致 healthy=0.95 也能得 47.5 分的问题;
- RISK-002 要求缺失数据不能以 0 冒充正常,所以环境/阶段/整齐度改为指针输入,缺失项进入 `missing` 并在 JSON 中返回 null
- 权重沿用 0.5/0.2/0.15/0.15 并标记为 `risk-v2-2026.08.14` 待试点校准规则;`confidence` 只输出 low/medium/unknown,不声称未校准结论为 high;
- `000007_inspection_idempotency` 未另建迁移,因为 `000001_baseline` 已包含 `idempotency_key` 唯一索引;本次只补风险语义相关字段。
- 历史旧记录没有 `is_mock` 标识,不能自动判别是否来自 mock;只读 SQL 报告用于人工审阅,未批量重算或改写旧数据。
### 验证结果
- `scripts/verify.ps1` exit 0Go test/vet/build、Web test/lint/build、小程序 typecheck/build、APP typecheck/lint、AI pytest 15/15 均通过;
- 新增测试覆盖 healthy/sick/unknown 异常概率、缺失组件归一化、风险分级边界、AI 响应解析、空检测 unknown、handler 风险输入和迁移版本;
- 未部署开发服务器,未对现有库执行 `000002` 迁移;历史只读 SQL 报告未执行。
### 回滚点
- 本任务前分支提交为 `839ba91`;回滚可还原 Task 6 提交;
- 数据库回滚执行 `migrate -path ... -database ... down 1` 或手工执行 `000002_risk_assessment.down.sql`,可移除新增三列和索引;`risk_score/risk_level` 仍保留,历史数据不回写。