多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

使用 OpenMed 从临床自由文本中提取事实,驱动 eCQM 电子临床质量指标计算

使用 OpenMed 从临床自由文本中提取事实,驱动 eCQM 电子临床质量指标计算 使用 OpenMed 从临床自由文本中提取事实驱动 eCQM 电子临床质量指标计算【免费下载链接】openmedLocal-first healthcare AI: clinical NER HIPAA PII de-identification that runs 100% on-device. 2,200 medical models, 21 languages, Apple MLX Python, no cloud, no patient data leaving your network. Apache-2.0项目地址: https://gitcode.com/GitHub_Trending/ope/openmed导读电子临床质量指标eCQM依赖结构化数据上的 CQL/QDM 逻辑运行而患者拒绝筛查这类排除理由、戒烟咨询这类干预记录往往只存在于临床自由文本中结构化编码无法捕获。本文以 OpenMed 的computing-ecqms技能为核心讲解如何用 OpenMed 在本地设备上从病历文本中提取事实实体 上下文 时间将其编码为 QDM 数据元素后输入经认证的 CQL 引擎从而补全 eCQM 的分子与排除项同时讲清OpenMed 只补充、不认证、不执行 CQL的边界。读完本文你将掌握 eCQM 人群结构IPP/分母/分子/排除与 OpenMed 实体提取管线的对接方式、完整的七步工作流以及避免把否定句当成排除、把未标日期的事实计入测量周期等常见陷阱。eCQM 的结构你要填充的是哪一个人群eCQM 使用CQLClinical Quality Language逻辑对QDMQuality Data Model数据计算。QDM 数据元素如Assessment, Performed、Intervention, Performed、Diagnosis由代码成员资格定义——即某个实体的编码是否落在度量所引用值集value set中而不是看表面字符串。度量的人口结构如下表所示人群Population含义OpenMed 在何处发挥作用IPPInitial Population初始人群度量可能适用的所有患者通常是结构化数据就诊、年龄Denominator分母满足基础标准的 IPP大多为结构化数据Denominator Exclusion / Exception分母排除/例外从分母中移除的正当理由笔记declined拒绝、medical reason医疗原因、not indicated不适用Numerator分子完成质量行为笔记提供了咨询、给出了建议、记录了状态从表中可以清晰看出度量需要的大部分证据天然存在于自由文本中。戒烟咨询记录、患者拒绝筛查的原因、触发度量的症状这些往往不会出现在结构化编码字段中而这正是 OpenMed 的核心价值——在设备本地从文本中提取这些事实。快速开始从一段笔记中提取度量相关事实OpenMed 提供openmed.analyze_text作为核心入口默认模型为disease_detection_superclinical详见 openmed/init.py。以下示例针对一个戒烟筛查类 eCQM 度量提取两条度量相关事实import openmed note ( Tobacco use screened today; patient is a current every-day smoker. Cessation counseling provided and cessation medication offered. ) result openmed.analyze_text(note, output_formatdict) # entities - {text, label, confidence, start, end} # Lift two measure-relevant facts (illustrative, for a tobacco-screening eCQM): facts { tobacco_status_documented: any(e[label] in {smoking_status, tobacco_use} for e in result[entities]), cessation_intervention_documented: counseling in note.lower(), } # These become QDM data elements your CQL references (see workflow).关于analyze_text的更多参数从源码签名看openmed/init.py它还支持model_name注册表键、完整的 Hugging Face 模型 ID 或本地模型路径aggregation_strategyHugging Face 聚合策略默认simple设为None可处理原始 token 输出output_formatdict默认、json、html或csvconfidence_threshold实体最小置信度None保留全部group_entities合并相邻的同标签实体sentence_detection/sentence_language句子检测及语言提示默认enanalyze_text会按句子切分后分块送入模型assert_context为每个实体附加确定性的否定、不确定性、体验者和时间性标签置于metadata[clinical_context]下默认关闭。从实现看openmed/init.pyanalyze_text内部通过ModelLoader.create_pipeline(validated_model, tasktoken-classification, ...)构建 token 分类管线并在加载模型期间通过network_blocked_if_offline保证离线场景下无网络外发——这与 OpenMed 本地优先、患者数据不出网络 的定位一致。在将实体送入 QDM 之前需要选择合适的模型选择标签与度量概念匹配的模型参见 skills/choosing-openmed-models/SKILL.md编码到值集词汇通过 linking 类技能如 skills/linking-umls-concepts/SKILL.md、skills/mapping-to-snomed/SKILL.md、skills/normalizing-rxnorm/SKILL.md、skills/mapping-loinc/SKILL.md将文本片段映射到度量值集所期望的词汇SNOMED/LOINC/RxNorm。完整工作流从度量定义到可审计的 eCQM 计算第一步阅读度量从 ECQI / MADiE 获取人类可读的规格说明、CQL 与值集。识别哪些人群依赖结构化数据缺失的文档记录——这正是 OpenMed 需要补强的部分。第二步先去标识化de-identify在任何日志记录或存储之前对笔记运行openmed.deidentify度量键使用内部患者 ID。deidentify在 openmed/core/pii.py 中实现支持mask默认、remove、replace、hash、shift_dates等多种方法且默认confidence_threshold0.7更高的阈值以保证安全性。此外OpenMed 还提供了多种集成入口例如 openmed/service/sidecar.py 中不许可网络外发的deidentify、openmed/interop/tools.py 的deidentify等均可按部署形态选用。第三步提取事实并解析临床上下文使用openmed.analyze_text提取度量所需的概念状态、干预、未执行原因。随后务必使用resolving-clinical-context技能丢弃否定、假设性及家族史提及——一个被否定的排除不是排除。OpenMed 的 ConText 层位于 openmed/clinical/context.py相关模块还包括 openmed/clinical/negation_scope.py、openmed/clinical/experiencer.py、openmed/clinical/temporal_analysis.py为每个文本片段分配三个确定性轴否定negation、时间性temporality、不确定性uncertainty。典型用法详见 skills/resolving-clinical-context/SKILL.mdimport openmed from openmed.clinical import ( resolve_span_context, assert_context_axes, NEGATED, HISTORICAL, HYPOTHETICAL, UNCERTAIN, ) note Patient denies chest pain. History of MI. Concern for PE; rule out DVT. ents openmed.analyze_text(note, model_namedisease_detection_superclinical, output_formatdict) for e in ents: span e[word] # entity surface text window note # full sentence/note as modifier context ctx resolve_span_context(span, window) print(span, -, ctx.negation, ctx.temporality, ctx.certainty) # chest pain - negated recent certain (do NOT record as present) # MI - affirmed historical certain (past, not active) # PE - affirmed recent uncertain (hedged; flag, dont drop)resolve_span_context返回ClinicalContextResult(negation, temporality, certainty)如需面向下游 grounding 的形状可用assert_context_axes返回ClinicalAssertion其.to_dict()会省略未设置的轴。在 eCQM 场景中一个典型的错误是把 Screening declined筛查被拒绝当成否定——它实际是一个排除反之no contraindication无禁忌症是排除的反义。所以计数前必须先完成时间性/否定性检查。第四步编码到值集将实体映射到度量值集所期望的编码SNOMED/LOINC/RxNorm通过 linking 技能。QDM 数据元素由代码成员资格定义而非原始字符串。注意OpenMed 不捆绑受限制的术语内容——SNOMED/LOINC/RxNorm 内容在进程外由你自己的许可证持有OpenMed 只提供片段spans与标签labels。第五步物化 QDM 数据元素将已编码、已标注日期的事实转化为 QDM 元素如Assessment, Performed、Intervention, Performed、Diagnosis并附带正确的 author/relevant 日期。日期解析与事件排序可参考building-patient-timelines技能skills/building-patient-timelines/SKILL.md它使用analyze_text的事件与临床时间性当前 vs 历史产出按时间排序的事件列表支撑 FHIREncounter/Condition.onsetDateTime之类的事件建模并处理无日期或日期不明确的事件。第六步用 CQL 计算将结构化 笔记派生的 QDM 输入经认证的 CQL 引擎如开源cqframework引擎计算。OpenMed 不执行 CQL——这一点必须明确。第七步对账与审计跟踪哪些人群成员是由笔记派生事实加入的以及置信度如何便于 QA 审查。记录度量 provenance 时使用偏移量、标签、置信度和内部 ID不要记录原始 PHI。与 OpenMed 的交接数据从哪里来、到哪里去从 OpenMed 输出analyze_text实体 openmed.clinical时间性 linking 技能使事实落在度量的值集中 上游的deidentify到度量工具物化后的 QDM 数据元素输入 CQL 引擎与 MADiE 测试套件。如果改为在 OMOP 存储上计算度量笔记派生的 QDM 也可以来自etl-to-omop-cdm的行skills/etl-to-omop-cdm/SKILL.md。从源码结构看OpenMed 的时序分析、关系抽取与 grounding 能力openmed/clinical/ 目录下的temporal_analysis.py、relations/、grounding/、timeline/等模块为将片段变成带日期的编码事实提供了实现支撑而这些事实正是 QDM 数据元素的前身。边界情况与常见陷阱OpenMed 是补充不是认证。度量评分必须在经过验证的 CQL 引擎中运行。笔记派生事实应视为有待审查的补充证据而非权威的度量结果。否定会反转含义。Screening declined 是排除screening not declined / no contraindication 是反义。计数前务必运行时间性/否定性检查resolving-clinical-context。日期决定测量周期。一个事实只有在其 relevant date 落在测量周期内才被计入。先解析日期无日期的事实无法定位。值集成员资格而非关键词。QDM 数据元素由度量值集中的代码定义。将实体映射到这些代码——不要按表面词汇匹配。不捆绑受限制的术语内容。SNOMED/LOINC/RxNorm 内容在进程外由你自有许可证持有OpenMed 仅提供片段与标签。日志与审计中不出现原始 PHI。按偏移量、标签、置信度与内部 ID 记录度量 provenance。标准与参考ECQI Resource CentereCQM 规格、CMS 度量https://ecqi.healthit.gov/CQLClinical Quality Languagev1.5 规范https://cql.hl7.org/QDMQuality Data Modelv5.6https://ecqi.healthit.gov/qdmMADiEMeasure Authoring Development Integrated Environmenthttps://madie.cms.gov/开源 CQL 引擎HL7 cqframeworkhttps://github.com/cqframework/clinical_quality_languageOpenMed 源码openmed/processing/analyze_text相关实现、openmed.clinical时间性等临床上下文。【免费下载链接】openmedLocal-first healthcare AI: clinical NER HIPAA PII de-identification that runs 100% on-device. 2,200 medical models, 21 languages, Apple MLX Python, no cloud, no patient data leaving your network. Apache-2.0项目地址: https://gitcode.com/GitHub_Trending/ope/openmed创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表