From ee2a5338bb0e88b50afd17d8b075f60378c2b9b0 Mon Sep 17 00:00:00 2001 From: "2569718930@qq.com" <2569718930@qq.com> Date: Mon, 27 Apr 2026 09:45:11 +0800 Subject: [PATCH] Avoid overstating fallback AI bulletin reads The city decision fallback path is generated when the full DeepSeek city-airport read has not completed, so the reasoning copy now labels the state as fast evidence mode instead of saying the AI read is normal. Constraint: Fallback output may use only DEB, model cluster, and latest observation evidence Rejected: Keep 'AI read normal' wording | it implies a completed AI interpretation when the fallback path is active Confidence: high Scope-risk: narrow Tested: pytest tests/test_web_observability.py::test_city_ai_fallback_reasoning_identifies_fast_evidence_mode tests/test_web_observability.py::test_city_ai_partial_json_trims_dangling_taf_clause tests/test_web_observability.py::test_city_ai_schema_completion_trims_dangling_taf_clause -q --- CHANGELOG.md | 2 +- tests/test_web_observability.py | 6 ++++-- web/scan_terminal_service.py | 4 ++-- 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c4d3f9cf..d736a267 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,7 +3,7 @@ ## 1.5.5 - 2026-04-27 - 城市决策卡新增 AI 机场报文解读缓存说明:页面内存缓存保留 loading / 流式片段 / 最终结果,`localStorage` 保存最终成功 payload,后端 AI 缓存不再因 `local_time` 变化失效 -- 城市决策卡兜底文案明确为“AI 机场报文解读正常”,不再使用“AI 增强可后补 / 不阻塞”这类容易被误解为 AI 未解读的表述 +- 城市决策卡兜底文案明确标记“快速证据模式”,避免在 DeepSeek 未完整返回时误写成“AI 机场报文解读正常” - 城市决策卡市场层改用完整 `all_buckets` 并严格识别 exact / range / or higher / or lower 温度桶方向,避免最高温中枢错配到不合理尾部桶 - 温度桶标签统一规范化 `C/F/°C/°F`,修复 `31°°C` 这类重复单位展示 - 决策卡展示文案将“概率差”收口为“模型-市场差”,明确口径为 `模型概率 - 市场隐含概率` diff --git a/tests/test_web_observability.py b/tests/test_web_observability.py index 90ead482..8bf71ab9 100644 --- a/tests/test_web_observability.py +++ b/tests/test_web_observability.py @@ -100,7 +100,7 @@ def test_metrics_endpoint_returns_prometheus_payload(): assert 'polyweather_http_requests_total' in response.text -def test_city_ai_fallback_reasoning_says_ai_read_is_normal(): +def test_city_ai_fallback_reasoning_identifies_fast_evidence_mode(): payload = scan_terminal_service._build_city_ai_fallback( { "city_display_name": "Tokyo", @@ -128,7 +128,9 @@ def test_city_ai_fallback_reasoning_says_ai_read_is_normal(): reason="preview", ) - assert "AI 机场报文解读正常" in payload["reasoning_zh"] + assert "当前为快速证据模式" in payload["reasoning_zh"] + assert "完整 AI 机场报文解读返回后再合并" in payload["reasoning_zh"] + assert "AI 机场报文解读正常" not in payload["reasoning_zh"] assert "后补" not in payload["reasoning_zh"] assert "AI 增强可作为后续补充" not in payload["reasoning_zh"] diff --git a/web/scan_terminal_service.py b/web/scan_terminal_service.py index 3ee35318..8b58533f 100644 --- a/web/scan_terminal_service.py +++ b/web/scan_terminal_service.py @@ -720,12 +720,12 @@ def _build_city_ai_fallback( reasoning_zh = str(partial_ai.get("reasoning_zh") or "").strip() or ( f"AI {bulletin_zh}解读已用于校准日内节奏;DEB 与多模型集合继续约束最高温中枢,后续{source_name_zh}用于确认是否需要上调或下修。" if partial_ai - else f"AI {bulletin_zh}解读正常;当前结合 DEB、多模型集合和最新{source_name_zh},共同支撑本轮最高温中枢判断。" + else f"当前为快速证据模式;DEB、多模型集合和最新{source_name_zh}共同支撑本轮最高温中枢,完整 AI {bulletin_zh}解读返回后再合并。" ) reasoning_en = str(partial_ai.get("reasoning_en") or "").strip() or ( f"The AI {bulletin_en} read is already used to calibrate the intraday pace; DEB and the model cluster still constrain the high-temperature center, while later {source_name_en} updates confirm whether to revise it." if partial_ai - else f"The AI {bulletin_en} read is available; DEB, the model cluster and latest {source_name_en} jointly support the current daily-high center." + else f"This is the fast evidence mode; DEB, the model cluster and latest {source_name_en} jointly support the current daily-high center, and the full AI {bulletin_en} read will be merged when available." ) risks_zh = [f"后续{source_name_zh}若明显偏离模型路径,需及时修正最高温中枢。"] risks_en = [f"If later {source_name_en} updates diverge from the model path, revise the daily-high center promptly."]