严重度:高(临床安全性 / 直接影响危急值告警的正确性)
标签建议:bug(clinical)
现象
危急值规则引擎在两类输入下会产生方向反转或张冠李戴的错误告警:
- 术语绑定错误:LOINC
33914-3 在本项目被标注为 Glucose [Mass/volume] in Body fluid 并映射到 glucose_fasting(loinc_map.py:65、loinc_map.py:110)。但 33914-3 在 LOINC 标准里是 eGFR(MDRD 估算肾小球滤过率),根本不是血糖。于是真实的肾功能指标会被当成血糖去评估。
- 无单位换算 + 单位不匹配信号被丢弃:
1558-6(空腹血糖)在 FHIR 里常见单位是 mg/dL,而目录 glucose_fasting 的参考区间按 mmol/L(3.9–6.1)定义。代码既不换算单位,又在规则引擎里丢弃了 unit_mismatch 信号,导致 mg/dL 数值被直接按 mmol/L 阈值比较。
证据
doctoragent/clinical/safety/reference_ranges.py:571-572 仅记录 unit_mismatch,文档也写明"callers are responsible for unit conversion upstream";但 doctoragent/clinical/safety/rules.py:743 的 evaluate_labs 调用后只用了 flag,完全没看 unit_mismatch,也没有任何换算逻辑。cds_hooks/service.py:392-410 把 FHIR valueQuantity 的 value/unit 原样透传。
复现(mg/dL → mmol/L 方向反转):
LOINC 1558-6 50.0 mg/dL # 真实为低血糖(=2.8 mmol/L, 应 CRITICAL_LOW)
-> [critical] glucose_fasting 50.0 mg/dL 高于危急值 22.0 ← 方向反转,报成"高"
LOINC 1558-6 95.0 mg/dL # 完全正常
-> [critical] glucose_fasting 95.0 mg/dL 高于危急值 22.0 ← 假危急
LOINC 33914-3 8.0 mL/min/1.73m2 # 终末期肾衰(eGFR)
-> [warning] glucose_fasting 8.0 高于参考范围 3.9-6.1 ← 肾衰被报成"血糖异常"
影响
- 低血糖患者被误报为严重高血糖危急值(方向反转),或正常血糖被误报危急;
- eGFR(肾功能)结果被错误地按血糖规则解读,掩盖真实肾衰;
- 直接冲击 iCAN 演示与院内部署时的临床安全可信度。
建议修复
- 修正
loinc_map.py:把 33914-3 从 glucose_fasting 改绑到正确的 eGFR/肌酐相关条目(或新增 egfr 参考区间)。
- 在规则引擎/解析层加入单位换算(至少 glucose 的
mg/dL ↔ mmol/L,因子 0.0555),换算后再比对目录区间。
evaluate_labs 应消费 unit_mismatch:无法换算时降级为 UNKNOWN 或带上单位告警,而不是静默按错误量纲比较。
关联
与 #6(性别未归一化)、#7(SpO2=100% 误判危急)同属"参考范围/危急值评估的正确性"一类,建议一起纳入一轮临床安全专项修复。
现象
危急值规则引擎在两类输入下会产生方向反转或张冠李戴的错误告警:
33914-3在本项目被标注为Glucose [Mass/volume] in Body fluid并映射到glucose_fasting(loinc_map.py:65、loinc_map.py:110)。但33914-3在 LOINC 标准里是 eGFR(MDRD 估算肾小球滤过率),根本不是血糖。于是真实的肾功能指标会被当成血糖去评估。1558-6(空腹血糖)在 FHIR 里常见单位是mg/dL,而目录glucose_fasting的参考区间按mmol/L(3.9–6.1)定义。代码既不换算单位,又在规则引擎里丢弃了unit_mismatch信号,导致mg/dL数值被直接按mmol/L阈值比较。证据
doctoragent/clinical/safety/reference_ranges.py:571-572仅记录unit_mismatch,文档也写明"callers are responsible for unit conversion upstream";但doctoragent/clinical/safety/rules.py:743的evaluate_labs调用后只用了flag,完全没看unit_mismatch,也没有任何换算逻辑。cds_hooks/service.py:392-410把 FHIRvalueQuantity的value/unit原样透传。复现(mg/dL → mmol/L 方向反转):
影响
建议修复
loinc_map.py:把33914-3从glucose_fasting改绑到正确的 eGFR/肌酐相关条目(或新增egfr参考区间)。mg/dL ↔ mmol/L,因子 0.0555),换算后再比对目录区间。evaluate_labs应消费unit_mismatch:无法换算时降级为UNKNOWN或带上单位告警,而不是静默按错误量纲比较。关联
与 #6(性别未归一化)、#7(SpO2=100% 误判危急)同属"参考范围/危急值评估的正确性"一类,建议一起纳入一轮临床安全专项修复。