alitrack

OMOP 本体:字面查询漏掉 57% 的脓毒症患者

上一篇文章里,我们把 MIMIC 变成了 31 个模板。模板解决「怎么查」的问题,但还有一个更隐蔽的问题:查什么?

「查脓毒症患者」——听起来很简单。但 Sepsis 在 ICD-10 里不是 1 个码,是几十个码:A41.9(脓毒症未特指)、A40.0(链球菌脓毒症)、A41.0(金黄色葡萄球菌脓毒症)、A41.5(革兰氏阴性菌脓毒症)……每个码都代表脓毒症的一个子类型。

你写 WHERE icd_code LIKE 'A41%',只抓到一部分;写 LIKE 'A4%',又把不是脓毒症的码捞进来。字面查询和概念查询之间的差距,就是数据里的漏网之鱼。

我们实测过这个差距,结果有点吓人。

● ● ●

字面查询漏了多少

我们在 eICU 数据库(美国 200 多家医院的 ICU 数据,15 万患者)上做了个实验:用两种方式查脓毒症患者。

Sepsis 概念展开:LIKE 查询 vs is-a 展开

Sepsis 概念展开:LIKE 查询 vs is-a 展开

方式一(字面前缀):icd_code LIKE 'A41%' 或 LIKE 'R65.2%',靠编码前缀猜。

方式二(本体展开):先查 OMOP 标准词表,找到 Sepsis 概念的全部 135 个后代(is-a 关系展开),再用这 135 个码去查。

结果(ICD-10 口径):

查询方式
脓毒症患者数
差距
字面前缀
13,136
—
本体展开
20,674+57.4%

多出来的 7,538 名患者,字面查询完全漏掉——因为他们用的不是 A41 或 R65.2 开头的码,而是 A40(链球菌)、A41.0(金黄色葡萄球菌)、B37.7(念珠菌脓毒症)这些「看起来不像」的编码。

贫血更夸张。Anemia 的 ICD-10 码散在 D5x-D6x 十几个族里,字面前缀根本无从写起,本体展开直接 +221.9%(1,615 → 5,198 患者)。

● ● ●

本体是什么

「本体」这个词听着吓人,其实就是一张概念关系网:

  • 概念
    :1.4 百万个医学概念(Sepsis、AKI、Anemia……每个都有唯一 ID)
  • is-a 关系
    :800 万条「属于」边(A41.9 is-a 脓毒症,脓毒症 is-a 感染性疾病)
  • 映射关系
    :各编码体系互转(ICD-10CM → SNOMED-CT,MIMIC 里的高频诊断码我们实测 12/12 全部映射命中)

OMOP(Observational Medical Outcomes Partnership)是这套东西的行业标准:全球 500 多个数据库、9.7 亿患者的标准化方案。

查询时不是直接 LIKE,而是:问题 → 概念 → 展开全部后代 → 生成 SQL。

● ● ●

为什么 +57.4% 是真实的,不是查询 bug

第一反应肯定是:是不是本体展开把不该算的也算进来了?

我们做了双重验证:

跨库验证。MIMIC 和 eICU 是两个完全独立的 ICU 数据库,各自都有 ICD 编码。我们在两个库上分别做本体展开,增益方向一致(MIMIC 上 Sepsis +36.5%,eICU 上 ICD-9 也是 +36.5%,ICD-10 下 +57.4%)。两个独立库互相印证,不是单个库的编码特例。

0% 增益的反例。AKI(急性肾损伤)本体展开增益 0%,T2DM(2 型糖尿病)也是 0%。为什么?因为这两个病的 ICD 码集中在几个编码区间,字面前缀 LIKE 'N17%' 已经覆盖全了。增益不是恒定的,它和「编码分散度」成正比——编码越散,字面查询漏得越多,本体收益越大。

● ● ●

什么时候用本体,什么时候用模板

这里要诚实说一句:不是所有查询都需要本体。

  • 模板路线
    (上一篇):31 个模板覆盖高频临床问题,查得快、结果稳。适合 80% 的常见问题。
  • 本体路线
    (这篇):处理模板覆盖不到的开放式问题,尤其是「某种疾病的所有亚型」。适合查全、查准的场景。

我们的架构里两者是叠加的:模板路由查常见问题,本体层做概念展开兜底。论文复现、队列构建、流行病学统计这类「一个都不能少」的场景,本体展开是必需品。

● ● ●

一个容易踩的坑:展开要包含种子自身

第一次做本体展开时,我们只查了 Sepsis 的后代码,漏了种子概念本身的码(A41.9 是最大的单一编码)。

Sepsis 的 13,136 名患者里,A41.9 占大头。只展开后代、不含种子,等于把最大的一块漏了。展开结果必须包含种子概念自身,这是本体查询最容易错的地方。

● ● ●

对 LLM 的意义

回到 AI 查询的语境:LLM 擅长把「自然语言」变成「编码猜测」,但它不知道 A40.0 也是脓毒症。

把本体展开放在 LLM 前面(问题 → 概念 → 135 个后代码 → SQL),LLM 就不需要记住 A40/A41/B37.7 这些编码知识——它只负责把问题翻译成概念,编码展开交给本体层。编码知识沉淀进数据资产,不靠模型记忆。 这和模板路线的思路一脉相承:把知识放进资产,而不是放进 prompt。

● ● ●

参考来源

  1. 01
    OHDSI OMOP Common Data Model(标准词表与建模规范):https://ohdsi.github.io/CommonDataModel/
  2. 02
    OMOP Athena(词表下载与浏览):https://athena.ohdsi.org/
  3. 03
    SNOMED-CT 与 ICD-10 映射文档:https://www.nlm.nih.gov/healthit/snomedct/
  4. 04
    eICU Collaborative Research Database(交叉验证数据源):https://physionet.org/content/eicu-crd/2.0/