POST /api/h5/refractive-records/records/{record_id}/analysis(真实调用,非本地脚本模拟)abb7fe03-3b10-4f0b-a0fd-3eafb7630e4b),org_id=26 下唯一一个"双眼裸眼视力+验光+眼轴+角膜曲率"六类字段都填全的档案(org 26 共 6 个患儿,其余 5 个均缺裸眼视力字段,触发分析会被 409 拒绝,见文末"未能覆盖"节)本仓库当前 worktree(bridge-cse_0191ibokJiVdFRa7R13dJbJi)的 app/services/refractive_record_service.py 里,generate_record_analysis() 只拼接本条记录自己的 5 类字段做纯文本对话(≤200字,不比历史),显式注释写明"不复用 FourLSummaryService"。但本次在 test 环境实测拿到的真实返回,是结构化的 4L 六段 JSON(p1_diag/p2_advice/p3_warning/plan_4l/ai_comparison),且带跨记录的"近半年/近一年/全部"趋势叙述——说明 test 环境当前跑的是比本 worktree 新的一版代码(memory 索引显示是 9-03 批C"4L六段分析·零迁移复用秒读引擎",MR#583)。下面的核对全部基于 test 环境真实返回,不是本 worktree 代码的推断。
5c126ab7)| 项 | 右眼 OD | 左眼 OS |
|---|---|---|
| 裸眼视力 | 0.06 | 0.30 |
| 主觉验光 球镜/柱镜/轴位 | -0.75 / -1.25 / 178° | -0.50 / -1.25 / 173° |
| 眼轴 AL | 24.29mm | 24.24mm |
| 角膜曲率 K1/K2 | 41.42 / 43.04D | 41.01 / 42.96D |
| 眼压 IOP | 18mmHg | 20mmHg |
GET /records/{id}/comparison,确定性代码算的,非 AI)baselines.axial_length → OD: null, OS: null(history_unavailable: false)。原因:该患儿在此之前只有一条记录 14bd5efc(16:47),但那条记录双眼全字段是 NULL,没有可比数据 —— 系统正确判定"无有效基线"。
p1_diag: 眼轴: 24.29/24.24mm → 显著偏长(超同龄均值 +1.79/+1.74mm)
K1/K2(角膜曲率): 41.42/43.04D(右),41.01/42.96D(左) → 正常范围
AST(角膜散光): 1.62D(右),1.95D(左) → 中度散光
综合: 轴性近视合并中度散光(眼轴增长主导)
p2_advice: 白话版:孩子眼球被拉得比同龄人长近 1.8mm...裸眼视力极低(右眼 0.06)...
p3_warning: 眼轴年增速快且已超均值 1.7mm+,需警惕发展为高度近视...
ai_comparison.one_year.narrative: "近一年数据与近半年一致,眼轴从24.29/24.24mm变化至24.35/24.29mm,
整体增长幅度极小...折算后的年增速未超过0.3mm/年的警戒线,判定为正常...目前控制情况良好,
请家长放心,维持现有防控手段并按时复查即可。"
ai_comparison 声称"眼轴从24.29/24.24mm变化至24.35/24.29mm"——但 24.35/24.29 是另一条记录 5ba2d2c6(次日 01:41 才做的检查)的数值,发生在本条记录(17:21:59)之后。也就是说,AI 给"17:21 这次检查"生成分析时,用了"次日凌晨才发生"的检查结果做对比基线,纯属未来数据穿越。而系统自己的确定性 /comparison 接口对这条记录算出的正确结论是 "无基线数据"(null)——AI 完全没理会这个正确判断,自己编了一个不存在的"近一年趋势",还加了"请家长放心"这种安慰性措辞。662982b0,比记录1晚约4分钟)| 项 | 右眼 OD | 左眼 OS |
|---|---|---|
| 裸眼视力 | 0.30 | 0.30 |
| 主觉验光 球镜/柱镜/轴位 | -0.75 / -1.25 / 178° | -0.50 / -1.25 / 173° |
| 眼轴 AL | 21.32mm | 19.96mm |
| 角膜曲率 K1/K2 | 42.59 / 43.72D | 42.40 / 44.16D |
| 眼压 IOP | (空) | (空) |
(注:眼轴 21.32/19.96mm 比同患儿记录1的 24.29/24.24mm 骤降近 3mm,明显是测试脏数据/录入异常,非真实生理值——但这正是本次核对要暴露的:"AI 面对异常数据时怎么处理")
baselines.axial_length → OD: 基线取记录1 5c126ab7(24.29mm),delta = -2.97;OS: 基线19.96 vs 24.24,delta = -4.28。即系统正确识别:这条记录比它真正的上一条(4分钟前)眼轴骤降了 2.97/4.28mm。
p1_diag: 眼轴: 21.32/19.96mm → 显著偏短(右眼低于同龄均值1.18mm,左眼低于2.54mm)
K1/K2(角膜曲率): 42.59/43.72D(右),42.4/44.16D(左) → 正常范围(41-45D)
球镜: -0.75D/-0.5D → 低度近视(SE约-1.37D/-1.12D)
综合: 轴性近视风险低,屈光性近视主导(散光导致视力下降)
p2_advice: 白话版:孩子眼球长度比同龄人短很多,这是好事,说明眼球没有被拉长...
ai_comparison.one_year.narrative: "近一年数据与近半年一致,眼轴从24.29/24.24mm变化至24.35/24.29mm,
整体增长幅度极小...目前控制情况良好,请家长放心..."
(half_year / all 三个窗口文案几乎逐字相同,均描述"24.29/24.24 → 24.35/24.29")
ai_comparison 给出的叙述跟记录1的 ai_comparison 逐字相同——都是"24.29/24.24mm 增至 24.35/24.29mm",而这两个数字都不是本条记录(21.32/19.96)自己的值,也不是本条记录正确的基线对(本条记录真正的基线是记录1的 24.29/24.24,系统自己算出的正确 delta 是 骤降 2.97/4.28mm,这本该是一条应该被高亮预警的数据异常,而不是"控制情况良好,请家长放心")。ai_comparison 输出完全相同的三段趋势叙述,说明这个"跟历史比"模块根本没有按被分析的这条记录去算,而是固定抓了"该患儿时间线上最新的两条记录"贴上去,跟当前分析的是哪一条记录无关。5ba2d2c6,非本次触发,读取的是此前已生成的分析,未重新触发)662982b0)| 项 | 本次 OD/OS | 上一次 OD/OS | 系统自算 delta |
|---|---|---|---|
| 眼轴 AL | 24.35 / 24.29 | 21.32 / 19.96 | +3.03 / +4.33(真实增长) |
| K1 | 41.42 / 41.01 | 42.59 / 42.40 | -1.17 / -1.39 |
| K2 | 43.04 / 42.96 | 43.72 / 44.16 | -0.68 / -1.20 |
"好消息是眼轴数据呈'回退'趋势,说明之前的防控措施非常有效,眼球生长速度已得到抑制甚至逆转。"
ai_analysis_status=done 缓存结果),但它和记录1/2 揭示的是同一个根因——ai_comparison/趋势叙述模块不忠实于系统自己算出的确定性 delta,会自行编排"讲得通"但方向相反的故事。| 记录 | 单记录数值/算术 | 跟历史比的趋势叙述 |
|---|---|---|
| 5c126ab7 | ✅ 准确 | ❌ 用了发生在未来的记录做基线,系统自己判定"无基线"被无视 |
| 662982b0 | ✅ 准确 | ❌ 与另一条本值完全不同的记录输出逐字相同的趋势文案,未采纳系统算出的真实骤降(-2.97/-4.28mm) |
| 5ba2d2c6 | ✅ 准确 | ❌ 把系统算出的真实增长 +3.03/+4.33mm 说成"回退/逆转",方向说反 + 绝对化措辞("好消息""非常有效") |
核心问题不在"编造检查项目"或"出具处方diagnosis"(三条记录都没有),而是在"跟上次比/跟历史比"这个环节:三次真实触发/核对,三次趋势叙述都跟系统自己的确定性 comparison 结果对不上,其中两次是同一患儿的对比文案完全没有随被分析记录变化(怀疑是取"该患儿最新两条记录"做全局缓存/固定拼接,而不是"这条记录 vs 它的上一条"),第三次是方向性说反。建议长官在验收 4L 六段分析上线前,重点核对 ai_comparison 这段的生成逻辑是否真的锚定了被分析记录本身。