4. HL7 v3与CDA基础
HL7 v2在医疗接口领域占据主导地位,但它的“事件驱动、段字段拼接”方式在语义表达上存在天然短板:同一临床概念在不同消息类型中可能落在不同字段,接收方必须依赖Z段或本地约定来补全含义。HL7 v3试图从根上解决这个问题,它不再以“消息事件”为组织中心,而是以一套统一的信息模型——RIM(Reference Information Model,参考信息模型)——作为所有消息和文档的语义基础。CDA(Clinical Document Architecture,临床文档架构)则是v3体系中最成功、落地最广的产物,它用RIM约束出一套可交换的临床文档结构。
RIM:v3的语义骨架
RIM的核心只有六个主干类:Act(行为/事件)、Participation(参与)、Entity(实体)、Role(角色)、ActRelationship(行为关系)、RoleLink(角色链接)。其中Act是最核心的抽象,一次给药、一次检验、一份诊断报告,在RIM里都是Act的不同特化。Participation描述“谁以什么方式参与了这次Act”,Entity是物理或逻辑存在(人、机构、设备、药品),Role是Entity在特定情境下扮演的角色(如“某医生在某医院担任主治医师”),ActRelationship把多个Act串成“由…组成”“取代”“原因”等语义关系。
理解RIM的关键在于:它不直接对应某条消息的字段,而是先建立“临床事实”的语义模型,再通过HMD(Hierarchical Message Description)和RMIM(Refined Message Information Model)逐层约束,最终生成消息或文档的XML结构。这意味着v3消息的每个元素都能追溯到RIM中的类、属性和关系,语义是可验证的,而不是靠字段位置约定。
数据类型:v3的精确表达
v3定义了一套丰富的数据类型体系,这是它与v2最显著的差异之一。v2中一个字段可能同时承载编码值和文本描述,接收方需要靠“^”分隔符和上下文猜测。v3则把“值”和“原始文本”分开:CD(Concept Descriptor)类型同时包含code、codeSystem、displayName和originalText,即使编码系统不同,接收方也能拿到原始描述。II(Instance Identifier)类型用root和extension两个属性唯一标识一个对象,root通常是OID,extension是本地编号,这比v2的CX字段更清晰。TS(Point in Time)类型用value和precision表达时间点,PQ(Physical Quantity)用value和unit表达带单位的数值。在接口引擎中处理v3消息时,解析器必须按数据类型规则展开,不能像v2那样简单按分隔符切分。
交互模型:消息与文档的分工
v3的交互模型(Interaction Model)定义了消息的触发、传输和确认机制。一个交互由Interaction ID标识,包含触发事件、消息类型和传输参数。与v2的ACK机制类似,v3也有接受确认和拒绝确认,但确认消息本身也是RIM约束下的结构化消息。CDA则走另一条路:它不强调“实时消息交换”,而是强调“文档的持久性和可追溯性”。一份CDA文档一旦生成,就代表某个时间点上临床事实的完整快照,接收方可以异步处理,不需要立即回执。在接口引擎建设中,这意味着v3消息通常走实时消息通道,而CDA文档更适合走文档交换通道(如XDS、MHD)。
CDA文档结构:从叙述到编码
CDA R2文档的根元素是ClinicalDocument,它包含Header和Body两部分。Header承载文档的元数据:文档类型(用LOINC编码)、患者标识、作者、创建时间、保密级别、相关文档等。Body由Section组成,Section可以嵌套,每个Section有标题、叙述块(narrative block)和可选的Entry。Entry是RIM Act在XML中的具体表达,它把临床事实结构化。CDA定义了三个层级:Level 1只有叙述块,人可读但机器不可解析;Level 2在Section中增加Entry,部分结构化;Level 3的Entry完全用RIM编码,机器可完整解析。实际项目中,Level 2是最常见的折中方案,既保证临床可读性,又提供足够的结构化字段供引擎提取。
v2与v3/CDA的差异与转换场景
v2消息是“事件驱动”的,一条ADT^A01消息描述“患者入院”这个事件,字段位置固定但语义依赖上下文。CDA文档是“状态快照”的,一份出院小结文档描述“患者本次住院的完整总结”,结构自描述。转换场景主要有三类:第一类是v2到CDA的转换,常见于把实时ADT消息或ORU检验结果消息累积成一份CDA文档,例如把多次检验结果合并为一份“检验报告文档”,此时需要把v2的OBX段映射到CDA的Entry,用LOINC编码检验项目,用PQ表达结果值。第二类是CDA到v2的转换,例如接收一份CDA出院小结后,提取关键字段生成v2的MDM^T02消息通知下游系统。第三类是v3消息与CDA之间的转换,两者共享RIM语义,转换时主要处理消息头与文档头的差异。
在接口引擎中实现转换时,关键不是逐字段映射,而是先建立“语义映射表”:把v2的字段路径、CDA的XPath和RIM的类属性对应起来。例如v2的PID-3(患者标识)对应CDA的recordTarget/patientRole/id,对应RIM的Patient角色下的Entity标识。有了这张表,转换规则就可以复用,而不是每接一个新系统就重写一遍。
总结来说,RIM提供了v3的语义基础,数据类型保证了表达的精确性,交互模型定义了消息交换规则,CDA则把RIM约束成可持久化的临床文档。与v2相比,v3/CDA的学习曲线更陡,但一旦建立起语义映射,接口的复用性和可维护性会显著提升。在接口引擎建设中,建议对实时性要求高的场景继续用v2,对文档交换和长期归档场景逐步引入CDA,两者通过语义映射表共存,而不是强行统一。