文章
· 二月 16, 2023 阅读大约需 9 分钟

ChatGPT 为您创建消息转换?

A "big" or a "little" ask for ChatGPT?


几周前我尝试了 OpenAI GPT 的编码模型,看看它是否可以在医疗保健系统之间进行一些消息转换。它肯定可以,在相当大的程度上。

已经将近 3 周了,对于 ChatGPT 来说是很长很长的时间,所以我想知道它现在成长得有多快,以及它是否可以为我们做一些集成工程师的工作,例如它是否可以创建一个 InterSystems COS DTL将 HL7 转换为 FHIR 信息?

在不到一两分钟的时间内,我立即得到了一些答案。


测试

首先我想测试一下我是在和它背后的正确“人”说话


问题一:如何将HL7 V2.4报文转为FHIR STU3?


ChatGPT

将 HL7 V2.4 消息转换为 FHIR STU3 涉及多个步骤,因为这两个标准具有不同的数据模型和结构。以下是该过程的高级概述:

  1. 识别 HL7 消息中需要映射到 FHIR 资源的相关数据元素。这将取决于具体用例和交换的数据。
  2. 为每个数据元素定义映射规则。这涉及识别对应于 HL7 数据元素的等效 FHIR 资源和元素,以及任何必要的转换或翻译。
  3. 编写一个程序或脚本,可以从 HL7 消息中提取数据,应用映射规则,并创建相应的 FHIR 资源。这可能涉及使用正则表达式、解析库和 FHIR 资源创建库的组合。
  4. 根据 STU3 规范验证 FHIR 资源,以确保它们符合标准并包含所有必需的元素。

以下是此过程如何将 HL7 V2.4 观察消息转换为 FHIR STU3 观察资源的示例:

  1. 识别 HL7 消息中的相关数据元素,例如观察代码、值和单位。
  2. 定义每个数据元素的映射规则,例如将 HL7 观察代码映射到 FHIR CodeableConcept,将值和单位映射到 FHIR 数量。
  3. 编写可以从 HL7 消息中提取数据、应用映射规则并创建具有适当元素的 FHIR 观察资源的程序或脚本。
  4. 根据 STU3 规范验证 FHIR 观察资源,以确保它包含所有必需的元素并且有效。

具体的实现细节将取决于所使用的编程语言和库,以及映射的特定 HL7 消息和 FHIR 资源。建议查阅 HL7 和 FHIR 规范,并在需要时寻求专家建议。


好吧,这不仅听起来是对的——实际上它的回答比大多数人会做的更全面。它现在引起了我的注意,所以让我们开始吧。


问题 2:您能否在 Python 中创建示例转换以将 HL7 转换为 FHIR  


ChatGPT

当然!下面是一个示例 Python 代码片段,演示了如何将 HL7 消息转换为 FHIR STU3 观察资源:

from hl7apy import core
from fhir.resources.observation import Observation

# Parse the HL7 message
hl7_message = 'MSH|^~\&|SENDING_APP|SENDING_FACILITY|RECEIVING_APP|RECEIVING_FACILITY|20220527120512||ORU^R01|MSGID12345|P|2.4\r' \
              'OBX|1|NM|GLU^Glucose||100|mg/dL||N|||F|||20220527120512\r'
hl7_parsed = core.parse_message(hl7_message)

# Map HL7 elements to FHIR elements
observation = Observation()

observation.code = {
    "coding": [{
        "system": "http://loinc.org",
        "code": hl7_parsed.obx[0].observation_id.value,
        "display": hl7_parsed.obx[0].observation_id.value
    }]
}

observation.valueQuantity = {
    "value": hl7_parsed.obx[0].value.value,
    "unit": hl7_parsed.obx[0].units.value,
    "system": "http://unitsofmeasure.org",
    "code": hl7_parsed.obx[0].units.value
}

# Serialize the FHIR resource as JSON
observation_json = observation.json()

# Print the serialized FHIR resource
print(observation_json)

此代码使用hl7apy库解析HL7 消息并提取相关数据元素,并从fhir.resources中使用fhir.resources.observation类----- 创建 FHIR 观察资源的模块。

在此示例中,代码将 HL7 观察 ID 映射到 FHIR 代码元素,并将 HL7 值和单位映射到 FHIR valueQuantity 元素。然后使用json()方法将 FHIR 资源序列化为 JSON。

请注意,这是一个简单示例,您可能需要根据具体用例映射更多数据元素。此外,您还需要安装 hl7apy fhir.resources库才能运行此代码。


这是个好答案 - 给出了一个不错的样板代码。现在让我们给它一个具体的挑战:


问题 3:您能否提供在 Intersystems COS DTL 中从 HL7 V2 到 FHIR Stu3 的示例转换


ChatGPT


当然!以下是如何在 InterSystems COS DTL(数据转换语言)中将 HL7 V2 消息转换为 FHIR STU3 观察资源的示例:

Class DTL.HL7toFHIR Extends %RegisteredObject
{

ClassMethod TransformHL7ToObservation(hl7Message As %String) As %String [ CodeMode = expression, DDLAllowed = 0 ]
{
    set src = ##class(EnsLib.HL7.Message).%New()
    set src.DocType = "2.4"
    set src.Parse(hl7Message)

    set obs = ##class(FHIR.Resource.Observation).%New()
    set obs.subject = { "reference": "Patient/"_src.MSH.GetSendingApplication() }
    set obs.status = "final"
    set loincCode = src.GetSegment("OBX", 1).GetField(3).GetField(1)
    set obs.code = { 
        "coding": [ 
            {
                "system": "http://loinc.org""code": loincCode, 
                "display": loincCode 
            }
        ]
    }

    set value = src.GetSegment("OBX", 1).GetField(5).GetField(1)
    set units = src.GetSegment("OBX", 1).GetField(6).GetField(1)
    set obs.valueQuantity = { 
        "value": value, 
        "unit": units, 
        "system": "http://unitsofmeasure.org""code": units 
    }

    quit obs.%ToJSON()
}

}

此代码定义了一个名为 TransformHL7ToObservationI()的类方法,它将 HL7 V2 消息作为输入并返回 FHIR STU3 观察资源作为 JSON 字符串。

该方法首先创建一个新的 EnsLib.HL7.Message 对象并使用它来解析输入的 HL7 消息。然后创建一个新的 FHIR.Resource.Observation 对象并设置 subjectstatus 元素。

接下来,代码从 HL7 消息中提取 LOINC 代码、值和单位,并将它们映射到 FHIR 资源中的相应元素。

最后,该方法将 FHIR 资源序列化为 JSON 并将其返回。

要使用此类方法,您可以从另一个 COS 方法或使用 InterSystems 的 REST API 从外部系统调用它。下面是如何从另一个 COS 方法调用该方法的示例:

set hl7Message = "MSH|^~\&|SENDING_APP|SENDING_FACILITY|RECEIVING_APP|RECEIVING_FACILITY|20220527120512||ORU^R01|MSGID12345|P|2.4\rOBX|1|NM|GLU^Glucose||100|mg/dL||N|||F|||20220527120512\r"
set fhirObservation = ##class (DTL.HL7toFHIR).TransformHL7ToObservation(hl7Message) 
write fhirObservation

请注意,您需要在 InterSystems 环境中定义 -----107----- 和 -----108----- 类,并具有运行 COS 代码的适当权限。


好吧,这可能是迄今为止我们所能预料到的最有效、最全面、最切题的答案,只需大约 25 秒。是不是?

既然我们在这里,我们需要公平对待我也喜欢的其他广泛使用的选项。于是我又怀着信心继续问了几个问题:


问题4:能否给出Orion Rhapsody中从HL7 V2到FHIR Stu3的转换示例


ChatGPT

当然!以下是如何在 Orion Rhapsody 中将 HL7 V2 消息转换为 FHIR STU3 观察资源的示例:

  1. 首先,创建一个新的 Rhapsody 通道并添加一个 HL7 Connector 组件来接收输入的 HL7 V2 消息。
  2. 将新的数据转换组件添加到通道并将其配置为使用自定义脚本。
  3. 在数据转换组件中,添加以下脚本以将 HL7 V2 消息转换为 FHIR STU3 观察资源:
function transform(msg) {

    var hl7 = Packages.ca.uhn.hl7v2.model.v24.message.ORU_R01(msg.getRawData());

    var observation = new Packages.org.hl7.fhir.dstu3.model.Observation();
    observation.setStatus(Packages.org.hl7.fhir.dstu3.model.Observation.ObservationStatus.FINAL);

    var codeableConcept = new Packages.org.hl7.fhir.dstu3.model.CodeableConcept();
    var coding = new Packages.org.hl7.fhir.dstu3.model.Coding();
    coding.setSystem("http://loinc.org");
    coding.setCode(hl7.getRESPONSE().getORDER_OBSERVATION()[0].getOBR().getUniversalServiceIdentifier().getIdentifier().getValue());
    coding.setDisplay(hl7.getRESPONSE().getORDER_OBSERVATION()[0].getOBR().getUniversalServiceIdentifier().getText().getValue());
    codeableConcept.addCoding(coding);
    observation.setCode(codeableConcept);

    var quantity = new Packages.org.hl7.fhir.dstu3.model.Quantity();
    quantity.setValue(hl7.getRESPONSE().getORDER_OBSERVATION()[0].getOBSERVATION()[0].getOBX().getObservationValue()[0].getValue().getValue());
    quantity.setUnit(hl7.getRESPONSE().getORDER_OBSERVATION()[0].getOBSERVATION()[0].getOBX().getUnits().getText().getValue());
    observation.setValue(quantity);

    var reference = new Packages.org.hl7.fhir.dstu3.model.Reference();
    reference.setReference("Patient/" + hl7.getPATIENT_RESULT().getPATIENT().getPid3_PatientIdentifierList()[0].getID().getValue());
    observation.setSubject(reference);

    return JSON.stringify(observation);
}
  1. 保存脚本并通过向通道发送 HL7 V2 消息来测试转换。转换后的 FHIR STU3 观察资源应由数据转换组件以 JSON 格式输出。

此脚本使用 HAPI FHIR 和 HAPI HL7 v2 库,它们包含在 Orion Rhapsody 中。它首先使用 HAPI HL7 库解析输入的 HL7 V2 消息。

接下来,脚本创建一个新的 FHIR STU3 观测资源并设置它的 status, code, value, 和 subject 元素基于 HL7 消息中的相应值。

最后,脚本将 FHIR 资源序列化为 JSON 并将其返回。

请注意,这只是一个简单示例,可能不适用于所有 HL7 V2 消息类型或 FHIR 资源。您可能需要修改脚本以处理不同的消息类型或将其他字段映射到 FHIR 资源。



问题 5你能在 Mirth 集成引擎中创建一个示例转换,将 HL7 v2.4 转换为 FHIR R4


ChatGPT

当然!以下是如何在 Mirth 中将 HL7 V2.4 消息转换为 FHIR R4 观察资源的示例:

  1. 首先,创建一个新的 Mirth 频道并添加一个 HL7v2 Listener 源连接器以接收输入的 HL7 V2 消息。
  2. 将新的 JavaScript Writer 目标连接器添加到通道并将其配置为使用自定义脚本。
  3. 在 JavaScript Writer 连接器中,添加以下脚本以将 HL7 V2 消息转换为 FHIR R4 观察资源:
var hl7msg = msg['HL7v2 Message'].toString(); // get the HL7 V2 message
var hl7data = Packages.ca.uhn.hl7v2.parser.Parser.parse(hl7msg); // parse the message with the HAPI HL7 parser
// extract values from the HL7 message and create the FHIR resource
var obs = new Packages.org.hl7.fhir.r4.model.Observation();
obs.setStatus(Packages.org.hl7.fhir.r4.model.Observation.ObservationStatus.FINAL);

var code = new Packages.org.hl7.fhir.r4.model.CodeableConcept();
code.addCoding()
  .setSystem("http://loinc.org")
  .setCode(hl7data.get("OBR-4-1").getValue())
  .setDisplay(hl7data.get("OBR-4-2").getValue());
obs.setCode(code);

var value = new Packages.org.hl7.fhir.r4.model.Quantity();
value.setValue(hl7data.get("OBX-5-1").getValue());
value.setUnit(hl7data.get("OBX-6").getValue());
obs.setValue(value);

var subject = new Packages.org.hl7.fhir.r4.model.Reference();
subject.setReference("Patient/" + hl7data.get("PID-3-1").getValue());
obs.setSubject(subject);

// output the FHIR resource as JSON
var json = org.hl7.fhir.r4.formats.JsonParser().setPrettyPrint(true).encodeResourceToString(obs);
return json;
  1. 保存脚本并通过向通道发送 HL7 V2 消息来测试转换。转换后的 FHIR R4 观察资源应由 JavaScript Writer 连接器以 JSON 格式输出。

此脚本使用 HAPI FHIR 和 HAPI HL7 v2 库,它们包含在 Mirth 中。它首先从 Mirth 消息对象中提取 HL7 V2 消息,并使用 HAPI HL7 解析器对其进行解析。

接下来,该脚本创建一个新的 FHIR R4 观察资源并设置其 status, code, value, 和 subject 元素基于 HL7 消息中的相应值。

最后,脚本将 FHIR 资源序列化为 JSON 并将其返回。

请注意,这只是一个简单示例,可能不适用于所有 HL7 V2 消息类型或 FHIR 资源。您可能需要修改脚本以处理不同的消息类型或将其他字段映射到 FHIR 资源。



结论?


我不再有任何结论或下一步,因为即使是我的想象力也无法赶上它的飞跃。看起来我现在的选择似乎很有限:要么我可以花时间挑出它不完美的编码风格,要么我可以再过几周重新考虑我盘子里剩下的东西?我需要比以往任何时候都更仔细地思考这件事的潜力。 :)

开个玩笑,虽然我很喜欢在这个论坛上发帖(感谢主持人),但我想到的另一个想法是,这“可能”实际上是一些竞争激烈的利基市场参与者迈向大众市场的重要推动力,对吧?由于各种原因,过去需要数年时间才能真正适应某些编码语言和脚本,但现在情况正在发生变化,使用 ChatGPT,它不仅提供精心编写的文档、说明和示例,而且还可以在未来几个月或几年内自动制造您选择的工程工具,对吗?它似乎能够提升“编程语言”的水平,最终使得编程语言中非功能性的特点,比如性能和服务质量等,将变得更重要。

讨论 (2)1
登录或注册以继续