Files
zyt/artifacts/prescription-ai-runtime/slow-and-error-fixes-20260910.md
2026-09-10 15:19:17 +08:00

38 lines
3.6 KiB
Markdown
Raw Permalink 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.
# 处方 AI:慢与报错的排障记录(2026-09-10)
只记录元数据与结论,不含患者资料、报告正文、附件地址或凭据。
## 现场测量
| 观察 | 数据 |
| --- | --- |
| 准备资料耗时 | 批次 1~4 均为 303~304 秒;其中资料组装约 3~4 秒,其余为转写等待窗口 |
| 触发等待的原因 | 诊单 1391 有 25 条已结束通话,`transcription_status` 为空、无会话号、0 分段;旧判断把"空状态"视为可能到达 |
| OpenAI 失败 | 批次 2/3/4 连续 `UPSTREAM_TIMEOUT`,每次恰好 90 秒 = `prescription_ai.timeout` |
| 千问失败 | 批次 2/3/4 均为 `INVALID_REPORT_OUTPUT`(60~64 秒),单次格式不符即整支失败 |
| 首份成功候选方 | 批次 5 千问 `available_for_review`(v3 提示词),9 味 |
| 该候选方为何仍无百分比 | 医生方 19 味无逐味单位(处方级 `dosage_unit=g`、`dose_unit=剂`、剂型浓缩水丸);候选方剂型"中药配方颗粒"不在受支持剂型内、基准 per_day;9 味中 5 味药名无法唯一映射机构字典(机构为"生麦冬/生五味子/麸炒白术/生地骨皮/麸炒苍术") |
| 机构数据分布 | `dosage_unit`:g 9389 张、ml 92 张、空 126 张;剂型:浓缩水丸 9507、饮片 92、汤剂 7、丸剂 1;药材字典单位:克 497/500 |
## 修复
1. 只在通话进行中、转写 pending/running、或刚结束且在等待窗口内时才等待转写;旧通话保留为缺口。
2. 后台分析单次请求超时独立配置,默认 240 秒(同步页面仍 90 秒),必须小于任务租约 600 秒。
3. 每个阶段允许一次受控格式修复(重申结构、不放宽校验);无效回答不入缓存;`INVALID_EVIDENCE_OUTPUT`、`INVALID_REPORT_OUTPUT` 改为可重试。
4. 比较器读取医生处方级 `dosage_unit` 与 `dose_unit=剂/付`;快照新增"调配约定"(剂型/单位/基准)下发给两个模型;候选阶段下发机构药材名清单,要求逐字选用;剂型仅做写法归一,不做任何剂量换算。
5. 提示词预算默认 24000 → 48000 字节,减少分片与压缩轮次。
6. 界面未设置的时间戳显示"—"。
## 验证
- 后端离线测试 11 个全部通过(比较器 262 项、进度 38 项、策略 20 项、统计 64 项等)。
- 独立 MySQL(端口 13379)上 Queue 68 / Pipeline 80,旧结构 Queue 66 / Pipeline 75 通过;测试结束后已停止该实例。
- 桌面 `test_issued_prescription_ai.py` 等相关测试通过,Ruff 通过。`tests/test_busy_overlay.py::test_shell_construction_never_shows_orphan_business_controls` 在本次改动前后同样失败,属既有问题,未在本轮处理。
- 真实链路:批次 4 的 OpenAI 第 3 次尝试在新超时下已越过 90 秒继续执行(单次调用实测约 174 秒),不再固定在 90 秒失败。
## 追加(13:00 后)
- 首份可比结果:批次 6 千问 一致度 14.35%、药味重合 14.81%(医生 17 味 / AI 10 味 / 共同 2 味,0 个不可比问题)。
- OpenAI 消费者从 12:24 起持续 `storage_or_configuration_error`:MySQL `wait_timeout=120` 秒 < 新的 240 秒请求超时,长调用期间连接被服务端关闭,之后所有查询失败且无法恢复。已在消费者进程打开断线重连、失败后主动关闭连接,并把失败输出改为"异常类@文件:行号 + SQLSTATE"。
- 截断假设被实测否定:千问可返回 13204 tokens 的完整 JSON;合成病例的候选阶段 9.3 秒通过,零修复。真实病例的失败改从来源编号引用入手,最终提示词新增 `ALLOWED_EVIDENCE_IDS`,并记录具体校验规则。