[开源] 交班信息一致性校验系统:面向临床医护的实时语义冲突检测与结构化摘要生成
本项目是专为国内医院交班场景设计的电子病历(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%” |
数值冲突检测 | 规则引擎扫描血压、体温、心率、呼吸、血氧等字段,对比 | 当班护士、值班医生 | 报告中标红:“体温 39.2℃(护理记录) vs 37.8℃(病程记录),差值 >1.0℃” |
语义冲突检测 | LLM(OpenAI)根据 | 医护共同确认环节 | 清单条目:“护理记录称‘患者主诉腹痛’,病程记录未提及腹痛,且诊断为‘上呼吸道感染’” |
结构化摘要生成 | 按「患者基本信息—当班关键事件—待跟进事项」三级组织内容,支持 | 交班双方、实习医师 | 文本块含标题“【需床边确认】:右侧肢体活动障碍加重,建议神经科会诊” |
多端输出 | 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 colorcd ts-cli && npm run detect -- --patient-id P001 --shift 2024-01-15两者输出一致,区别在于:Python CLI 更适合集成进院内自动化脚本;TS CLI 提供更友好的错误提示与参数补全,适合日常手动抽检。
工程结构
目录设计遵循职责分离原则,各模块边界清晰,便于医院信息科二次开发或对接本地 EMR:
目录路径 | 职责说明 | 扩展建议 |
|---|---|---|
src/adapters/ | 数据接入层,负责从 CSV、JSON 或模拟数据中读取护理/病程记录 | 可新增 |
src/alignment/ | 时间窗口对齐引擎,含时间解析、重采样、去重逻辑 | 如需支持 ICU 秒级记录,可在此增强时间粒度控制 |
src/conflict/ | 冲突检测主干,含 | 若需替换 LLM,只需改写 |
src/summary/ | 摘要模板引擎,使用 Jinja2 渲染结构化文本 | 可按科室定制模板,如儿科增加“喂养情况”子项 |
ts-cli/ | 独立 Node.js 包,封装 CLI 交互与参数校验 | 支持添加 |
web-dashboard/ | 静态 HTML+JS,所有逻辑在浏览器端运行,不依赖后端服务 | 可通过 |
测试覆盖完整链路:tests/下包含单元测试(如时间解析函数)、集成测试(端到端跑通 mock 数据流)、性能测试(benchmarks/测量千条记录处理耗时)。
环境与运行
系统对运行环境要求明确且宽松,不依赖 GPU 或专用服务器:
组件 | 最低版本 | 说明 |
|---|---|---|
Python | 3.10 | 用于核心数据处理与 LLM 调用 |
Node.js | 18 | 仅用于 TS CLI 构建与执行,不影响 Python 主流程 |
OpenAI API Key | 无强制要求 | 启用 |
安装仅需三步,无编译步骤:
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
