病历结构化¶
项目背景与目标¶
医疗机构每天产生大量病历(入院记录、病程记录、手术记录、出院小结),但大部分以非结构化文本形式存储,难以用于临床科研、质控统计、DRG 分组与医保结算。手工录入结构化字段耗时且易错。基于 AI Agent 的病历自动结构化系统能从自由文本中提取关键信息并映射到标准医学术语,大幅提升数据可用性。
本项目目标是构建一个病历结构化 Agent,输入为电子病历文本/扫描件,输出为符合 HL7 FHIR / 电子病历标准字典的结构化数据,准确率 > 95%,并支持人工校验闭环。
需求分析¶
输入类型:入院记录、首次病程、日常病程、手术记录、出院小结、影像报告、检验报告 提取内容: 1. 患者基本信息(姓名、性别、年龄、住院号) 2. 主诉、现病史、既往史、个人史、家族史 3. 体格检查(生命体征、各系统检查) 4. 诊断(主诊断、其他诊断、ICD-10 编码) 5. 手术信息(术式、术者、麻醉方式、ICD-9-CM-3 编码) 6. 用药、检查检验、治疗经过 7. 出医嘱、随访计划
质量要求:术语标准化(映射到 SNOMED-CT / ICD);数值准确;遗漏率 < 5%;可追溯原文位置。
技术选型说明¶
| 模块 | 技术方案 | 选型理由 |
|---|---|---|
| OCR | PaddleOCR + 医疗微调 | 病历扫描件识别 |
| NER | 医疗领域 BERT / LLM | 实体识别灵活 |
| Agent 编排 | LangGraph | 多字段提取流程 |
| 术语映射 | 向量检索 + 规则 | 标准 ontology 对齐 |
| 后处理 | Pydantic 校验 | 结构化数据校验 |
| 数据标准 | HL7 FHIR | 国际通用医疗数据标准 |
| 后端 | FastAPI + Celery | 批量处理与异步 |
| 数据库 | PostgreSQL + Elasticsearch | 结构化存储 + 全文检索 |
架构设计¶
flowchart LR
IN[病历输入 文本/扫描] --> OCR[OCR 识别]
OCR --> TXT[纯文本]
TXT --> AGENT[结构化 Agent]
AGENT --> NER[实体识别]
NER --> ENT[实体集合]
ENT --> REL[关系抽取]
REL --> MAP[术语映射]
MAP --> ONT[(ICD/SNOMED 术语库)]
MAP --> STD[标准化字段]
STD --> VAL[Pydantic 校验]
VAL --> OUT[FHIR JSON]
OUT --> DB[(病历数据库)]
OUT --> REVIEW[人工校验台]
REVIEW --> DB
关键模块实现思路¶
模块1:OCR 与文本预处理¶
病历扫描件质量参差不齐(手写、印章遮挡、表格混排)。OCR 采用 PaddleOCR 通用模型 + 医疗术语微调,对常见检验报告、处方笺专项优化。识别后做文本清洗:去除冗余空格、修正常见 OCR 错误(如"高血压"误识为"高血爪"用术语词典纠错)。
对电子病历直接获取的结构化文本无需 OCR,节省成本。
模块2:实体识别与关系抽取¶
医疗 NER 需识别的实体类型多:疾病、症状、药品、检查、手术、身体部位、时间、数值。可选用医疗 BERT(如 PCL-MedBERT)做序列标注,或用 LLM + Function Calling 抽取。LLM 方式灵活但成本高,建议复杂字段(现病史、手术经过)用 LLM,标准字段(性别、年龄)用规则。
EXTRACT_SCHEMA = {
"主诉": str,
"现病史": {"发病时间": str, "主要症状": list, "病情变化": str},
"诊断": [{"名称": str, "ICD10": str, "性质": "主诊断|其他"}],
"手术": [{"名称": str, "ICD9": str, "日期": str, "术者": str}]
}
关系抽取识别"症状-疾病"、"药品-疾病"、"检查-疾病"关联,构建病历知识图谱。
模块3:术语标准化映射¶
自由文本诊断(如"高血压 3 级")需映射到 ICD-10 编码(I11.9)。构建术语向量库(ICD-10、SNOMED-CT、药品 ATC 编码),用语义检索 + 规则匹配双重定位。语义检索处理表述差异("高血压" vs"血压升高"),规则匹配处理编码格式校验。
def map_to_icd(diagnosis: str) -> dict:
candidates = vector_search(diagnosis, top_k=5)
for c in candidates:
if rule_validate(diagnosis, c): # 规则校验
return {"code": c.code, "name": c.name, "confidence": c.score}
return {"code": None, "needs_review": True}
低置信度匹配转人工校验,避免错编影响 DRG 分组与医保结算。
模块4:质量校验与人工闭环¶
Pydantic 定义病历结构化 Schema,校验字段完整性、类型、范围(如年龄 0-150、血压合理区间)。逻辑校验:诊断与用药匹配、手术日期在住院期间内。校验失败项标记异常,推送到人工校验台。
人工校验台展示原文与提取结果对照,校验员可修改后回写,修改数据回流为训练样本持续优化模型。
核心流程详解¶
单份病历结构化流程: 1. 病历输入 → OCR(扫描件)或直接文本 2. Agent 编排:分段(主诉/现病史/查体/诊断/治疗) 3. 各段实体识别 → 关系抽取 4. 术语映射 → ICD/SNOMED 编码 5. Pydantic 校验 → 通过则入库,失败转人工 6. 输出 FHIR JSON + 原文位置溯源 7. 人工校验台处理异常项 → 回写数据库
批量处理流程: 1. 病案室批量上传 → Celery 队列 2. 并行处理(受 LLM 配额限制) 3. 质控统计:每份病历完整率、准确率 4. 异常汇总报告 → 病案管理人员集中处理
部署与优化建议¶
- 私有化部署:医疗数据不出院,模型与数据库部署在医院内网
- 模型分级:标准字段用小模型,复杂段落用大模型,平衡成本与准确率
- 术语库维护:ICD 版本更新及时同步,自定义术语需医院信息科审核
- 增量学习:人工校验数据定期微调模型,持续提升准确率
- 质控看板:监控各科室病历结构化完整率、编码准确率
常见问题与解决方案¶
| 问题 | 原因 | 解决方案 |
|---|---|---|
| 手写病历识别差 | 手写体差异大 | 优先电子病历 + 手写转人工 |
| 术语映射歧义 | 一词多义 | 上下文消歧 + 置信度过滤 |
| 诊断漏提取 | 表述非标准 | LLM 兜底 + 同义词词典 |
| ICD 编码错误 | 编码规则复杂 | 规则引擎校验 + 编码员复核 |
扩展方向¶
- DRG/DIP 分组:基于结构化数据自动分组,辅助医保结算
- 临床科研:结构化数据支撑队列研究、真实世界研究
- 病历质控:自动检查病历完整性、时效性、规范性
- 智能问答:基于结构化病历构建病历检索与问答