当前位置: 首页 > news >正文

[开源] 交班信息一致性校验系统:面向临床医护的实时语义冲突检测与结构化摘要生成

本项目是专为国内医院交班场景设计的电子病历(EMR)辅助工具,解决护士与医生在护理记录和病程记录中同步填写、异步理解、隐性冲突这一长期存在的质控盲区。我们不替代人工判断,而是把“同一时间窗内两条记录是否说同一件事”这件事,拆解成可对齐、可比对、可确认的三步动作:先按时间粒度自动归集数据,再用规则+大模型双轨检测数值与语义矛盾,最后输出符合国内交班习惯的「清单+确认」式摘要。核心交付形态包括命令行彩色报告(CLI)、本地 HTML 可视化看板,以及可嵌入院内系统的 Python 接口层;技术栈以 Python 3.10+ 为后端中枢,LLM 调用走 OpenAI API(支持无密钥降级为纯规则模式),前端 CLI 用 TypeScript 封装,可视化看板完全静态免服务部署。

定位与能力范围

我们不做全量病历分析,也不覆盖出院评估或手术安全核查等跨环节流程。本项目的边界非常明确:只处理单患者、单班次、护理记录与病程记录两类文本之间的即时一致性验证。所谓“单班次”,指由--shift-start--shift-end明确界定的时间窗口(如 08:00–20:00),系统会在此范围内拉取所有已归档的护理记录条目和病程记录段落,并完成三项基础对齐:

  • 时间戳对齐:将不同系统录入、不同格式书写的时间字段(如 “2024-01-15T08:12” 或 “1月15日 08:12”)统一解析为标准 datetime 对象;

  • 患者身份对齐:依赖传入的--patient-id作为唯一锚点,不尝试跨 ID 关联或模糊匹配;

  • 记录类型对齐:严格区分“护理记录”(nursing note)与“病程记录”(progress note),不混入医嘱、检验报告或会诊记录。

超出该范围的需求,比如多患者批量扫描、历史趋势回溯、与 LIS/PACS 系统直连,不在当前设计目标内。我们相信,把一个高发、高频、高风险的小切口做深,比摊薄资源做泛更有临床价值。

核心功能

系统围绕交班场景的三个刚性动作构建能力闭环:发现冲突、解释冲突、固化交接。每一项都对应具体可配置、可复现、可审计的行为。

功能模块

实现方式

面向角色

输出示例

时间窗口对齐

基于患者 ID 和时间范围,从模拟或真实数据源提取护理/病程记录片段

护士长、质控员

日志显示“共匹配护理记录 7 条、病程记录 3 条,时间交集覆盖率 92%”

数值冲突检测

规则引擎扫描血压、体温、心率、呼吸、血氧等字段,对比config/vital_ranges.yaml中定义的正常区间

当班护士、值班医生

报告中标红:“体温 39.2℃(护理记录) vs 37.8℃(病程记录),差值 >1.0℃”

语义冲突检测

LLM(OpenAI)根据config/semantic_prompts.yaml提示词,判断两段文字是否存在逻辑矛盾(如“神志清楚” vs “嗜睡状态”)

医护共同确认环节

清单条目:“护理记录称‘患者主诉腹痛’,病程记录未提及腹痛,且诊断为‘上呼吸道感染’”

结构化摘要生成

按「患者基本信息—当班关键事件—待跟进事项」三级组织内容,支持--format summary输出

交班双方、实习医师

文本块含标题“【需床边确认】:右侧肢体活动障碍加重,建议神经科会诊”

多端输出

CLI 支持 color/json/summary 三种格式;HTML 看板提供折叠面板、冲突跳转、导出按钮

不同使用习惯的用户

彩色 CLI 中数值冲突标红、语义冲突标黄;HTML 页面左侧为原始记录对照,右侧为冲突清单

使用与配置

所有配置均通过文件驱动,不修改代码即可适配不同医院术语习惯。我们提供两套关键配置入口:

  • 生命体征阈值:编辑config/vital_ranges.yaml,支持按年龄分组(如成人/儿童)、按指标单独设上下限。例如:temperature:
    adult:
    min: 36.0
    max: 37.2
    child:
    min: 36.4
    max: 37.5

  • 语义检测提示词:config/semantic_prompts.yaml中定义 LLM 的任务指令、输入格式与输出约束。默认 prompt 明确要求模型仅返回“存在冲突”或“无冲突”,并附一句简明理由,禁用自由发挥。

运行时无需启动服务进程,全部为单次命令执行。两种主流调用路径如下:

python -m src.cli.cli --patient-id P001 --shift-start "2024-01-15 08:00" --shift-end "2024-01-15 20:00" --format color
cd ts-cli && npm run detect -- --patient-id P001 --shift 2024-01-15

两者输出一致,区别在于:Python CLI 更适合集成进院内自动化脚本;TS CLI 提供更友好的错误提示与参数补全,适合日常手动抽检。

工程结构

目录设计遵循职责分离原则,各模块边界清晰,便于医院信息科二次开发或对接本地 EMR:

目录路径

职责说明

扩展建议

src/adapters/

数据接入层,负责从 CSV、JSON 或模拟数据中读取护理/病程记录

可新增emr_his_adapter.py对接院内 HIS 接口

src/alignment/

时间窗口对齐引擎,含时间解析、重采样、去重逻辑

如需支持 ICU 秒级记录,可在此增强时间粒度控制

src/conflict/

冲突检测主干,含rule_based.pyllm_based.py两个并行实现

若需替换 LLM,只需改写llm_based.py中的请求封装

src/summary/

摘要模板引擎,使用 Jinja2 渲染结构化文本

可按科室定制模板,如儿科增加“喂养情况”子项

ts-cli/

独立 Node.js 包,封装 CLI 交互与参数校验

支持添加npm run login实现院内账号鉴权

web-dashboard/

静态 HTML+JS,所有逻辑在浏览器端运行,不依赖后端服务

可通过<script src="data.json">加载本地导出数据

测试覆盖完整链路:tests/下包含单元测试(如时间解析函数)、集成测试(端到端跑通 mock 数据流)、性能测试(benchmarks/测量千条记录处理耗时)。

环境与运行

系统对运行环境要求明确且宽松,不依赖 GPU 或专用服务器:

组件

最低版本

说明

Python

3.10

用于核心数据处理与 LLM 调用

Node.js

18

仅用于 TS CLI 构建与执行,不影响 Python 主流程

OpenAI API Key

无强制要求

启用--mock即可跳过,全部使用规则引擎

安装仅需三步,无编译步骤:

pip install -r requirements.txt cd ts-cli && npm install && cd .. cp .env.example .env

首次运行推荐用--mock参数验证环境:

python -m src.cli.cli --patient-id P001 --shift-start "2024-01-15 08:00" --shift-end "2024-01-15 20:00" --mock --format color

成功后将看到带颜色标记的冲突报告与结构化摘要,日志自动生成于logs/目录下,方便回溯执行过程。

数据与扩展

我们不预设任何院内数据库结构,所有输入数据均通过扁平化字段映射。示例数据位于examples/,含标准字段说明:

  • 必填字段:patient_id,record_type(nursing / progress),timestamp,content

  • 推荐字段:author_role(护士/主治/住院医)、vital_signs(结构化 JSON,含temperature,bp_systolic等)

若医院已有标准化 EMR 导出功能,只需编写一个适配器,将导出文件字段映射到上述 schema 即可接入。所有字段映射规则、时间格式正则、术语同义词表,均集中管理在src/adapters/下,不散落在业务逻辑中。

限制与说明

本系统不是黑盒 AI 判官,而是透明化协作工具。我们明确声明以下限制:

  • LLM 仅用于语义层面的二分类判断(冲突/不冲突),不生成诊疗建议;

  • 所有数值检测基于预设阈值,不学习历史数据分布;

  • 不存储用户数据,CLI 与 HTML 看板均为本地执行,敏感信息不出设备;

  • 时间窗口必须闭合且非空,不支持跨日模糊匹配(如“夜班”需显式指定 20:00–08:00)。

常见问题已在文档中结构化归因。例如“冲突检测结果为空”,根本原因只有三类:时间无交集、患者 ID 无匹配记录、或两条记录内容完全一致,我们用--verbose日志逐层展开判断依据,而非笼统报错。

项目地址:
https://github.com/nexorin9/emr-shift-conflict-detector

http://www.jsqmd.com/news/869191/

相关文章:

  • 告别GPIO模拟!在Vivado 2023.1中快速配置Axi IIC IP核与PYNQ联调指南
  • 情感计算新起点:如何用DREAMER数据集低成本复现顶会论文?
  • 魔百盒CM101h刷完当贝桌面后,这6个隐藏功能设置让你的电视盒子更好用
  • JMeter安装失败的根源:Java环境、路径与JVM参数深度解析
  • 2026 AI x Web3 School共学营笔记-Day5
  • 昇腾CANN asc-tools:NPU 运维诊断工具的实战手册
  • 深度学习五大里程碑模型:CNN、RNN与Attention演进图谱
  • Kali Linux apt-key失效修复指南:2024 APT密钥信任模型升级详解
  • 六年之约-2026.5.22
  • ROS Melodic + KITTI 数据集:用rqt_bag实现传感器数据可视化(从转换到播放全流程)
  • PC版微信小程序抓包实战:Proxifier+Burp绕过代理检测
  • 贝叶斯数据草图在变系数回归模型中的应用与优化
  • Keil C51代码分块警告L20的解决方案
  • [开源] 麻醉复苏室转运交接断点检测与整改系统:面向PACU质控的闭环分析工具
  • 揭秘GPT-4稀疏MoE架构:1.8万亿参数与2%激活率的工程真相
  • 从显卡到SSD:拆解你电脑里的PCIe设备,看懂BDF编号和Type0/Type1配置头
  • 6 种简单方法教你如何将电脑上的音乐传输到 Redmi 手机
  • 渗透测试实战思路:从漏洞扫描到攻击链建模
  • 别再只点灯了!用ESP8266+Blinker解锁更多玩法:温湿度监控、智能插座与消息推送
  • CAD图纸版本转换软件 | Teigha File Converter (v4.3.2.0)
  • Paramiko vs. Fabric vs. Ansible:Python自动化运维三剑客,我该选哪个?
  • 对抗机器学习实战:从模型脆弱性到工业级鲁棒性工程
  • 2026 年南京 GEO 优化布局信源手法深度测评 - 小艾信息发布
  • 深入RTKLIB PPP的EKF心脏:手撕filter.c,图解扩展卡尔曼滤波的状态更新与协方差传递
  • 告别数据丢失!用Arduino和AT24C256 EEPROM做个断电也能记住的密码锁
  • RustDesk key mismatch 根因解析与密钥同步实战指南
  • 从CST到ADS/Keysight:手把手教你导出精准的Touchstone文件做联合仿真
  • 第一性原理计算在半导体缺陷研究中的应用:以氢掺杂氧化镓为例
  • 2026年05月口碑好的槟榔散果批发推荐,分析揭秘,散称槟榔/鲜果槟榔/槟榔/槟榔散果/槟榔鲜果,槟榔散果加盟怎么选 - 品牌推荐师
  • AI时代软件工程教育:同理心融入技术课程的教学实践