Skip to content

LOINC 术语绑定错误 + 葡萄糖无单位换算,导致危急值方向反转(临床正确性) #14

Description

@weed33834

严重度:高(临床安全性 / 直接影响危急值告警的正确性)
标签建议:bug(clinical)

现象

危急值规则引擎在两类输入下会产生方向反转或张冠李戴的错误告警:

  1. 术语绑定错误:LOINC 33914-3 在本项目被标注为 Glucose [Mass/volume] in Body fluid 并映射到 glucose_fastingloinc_map.py:65loinc_map.py:110)。但 33914-3 在 LOINC 标准里是 eGFR(MDRD 估算肾小球滤过率),根本不是血糖。于是真实的肾功能指标会被当成血糖去评估。
  2. 无单位换算 + 单位不匹配信号被丢弃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:743evaluate_labs 调用后只用了 flag,完全没看 unit_mismatch,也没有任何换算逻辑。cds_hooks/service.py:392-410 把 FHIR valueQuantityvalue/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 演示与院内部署时的临床安全可信度。

建议修复

  1. 修正 loinc_map.py:把 33914-3glucose_fasting 改绑到正确的 eGFR/肌酐相关条目(或新增 egfr 参考区间)。
  2. 在规则引擎/解析层加入单位换算(至少 glucose 的 mg/dL ↔ mmol/L,因子 0.0555),换算后再比对目录区间。
  3. evaluate_labs 应消费 unit_mismatch:无法换算时降级为 UNKNOWN 或带上单位告警,而不是静默按错误量纲比较。

关联

#6(性别未归一化)、#7(SpO2=100% 误判危急)同属"参考范围/危急值评估的正确性"一类,建议一起纳入一轮临床安全专项修复。

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions