## A "big" or a "little" ask for ChatGPT? [几周前我尝试了 OpenAI GPT 的编码模型,看看它是否可以在医疗保健系统之间进行一些消息转换](https://community.intersystems.com/post/gpts-implications-healthcare-interoperability-protocols)。它肯定可以,在相当大的程度上。 已经将近 3 周了,对于 ChatGPT 来说是很长很长的时间,所以我想知道它现在成长得有多快,以及它是否可以为我们做一些集成工程师的工作,例如它是否可以创建一个 InterSystems COS DTL将 HL7 转换为 FHIR 信息? 在不到一两分钟的时间内,我立即得到了一些答案。 ## 测试 首先我想测试一下我是在和它背后的正确“人”说话 * * * **问题一:如何将HL7 V2.4报文转为FHIR STU3?** * * * **ChatGPT**:
将 HL7 V2.4 消息转换为 FHIR STU3 涉及多个步骤,因为这两个标准具有不同的数据模型和结构。以下是该过程的高级概述:
以下是此过程如何将 HL7 V2.4 观察消息转换为 FHIR STU3 观察资源的示例:
具体的实现细节将取决于所使用的编程语言和库,以及映射的特定 HL7 消息和 FHIR 资源。建议查阅 HL7 和 FHIR 规范,并在需要时寻求专家建议。
* * * 好吧,这不仅听起来是对的——实际上它的回答比大多数人会做的更全面。它现在引起了我的注意,所以让我们开始吧。 * * * **问题 2:您能否在 Python 中创建示例转换以将 HL7 转换为 FHIR ** * * * **Chat****GPT** :当然!下面是一个示例 Python 代码片段,演示了如何将 HL7 消息转换为 FHIR STU3 观察资源:
<span class="hljs-keyword">from</span> hl7apy <span class="hljs-keyword">import</span> core
<span class="hljs-keyword">from</span> fhir.resources.observation <span class="hljs-keyword">import</span> Observation
<span class="hljs-comment"># Parse the HL7 message</span>
hl7_message = <span class="hljs-string">'MSH|^~\&|SENDING_APP|SENDING_FACILITY|RECEIVING_APP|RECEIVING_FACILITY|20220527120512||ORU^R01|MSGID12345|P|2.4\r'</span> \
<span class="hljs-string">'OBX|1|NM|GLU^Glucose||100|mg/dL||N|||F|||20220527120512\r'</span>
hl7_parsed = core.parse_message(hl7_message)
<span class="hljs-comment"># Map HL7 elements to FHIR elements</span>
observation = Observation()
observation.code = {
<span class="hljs-string">"coding"</span>: [{
<span class="hljs-string">"system"</span>: <span class="hljs-string">"http://loinc.org"</span>,
<span class="hljs-string">"code"</span>: hl7_parsed.obx[<span class="hljs-number">0</span>].observation_id.value,
<span class="hljs-string">"display"</span>: hl7_parsed.obx[<span class="hljs-number">0</span>].observation_id.value
}]
}
observation.valueQuantity = {
<span class="hljs-string">"value"</span>: hl7_parsed.obx[<span class="hljs-number">0</span>].value.value,
<span class="hljs-string">"unit"</span>: hl7_parsed.obx[<span class="hljs-number">0</span>].units.value,
<span class="hljs-string">"system"</span>: <span class="hljs-string">"http://unitsofmeasure.org"</span>,
<span class="hljs-string">"code"</span>: hl7_parsed.obx[<span class="hljs-number">0</span>].units.value
}
<span class="hljs-comment"># Serialize the FHIR resource as JSON</span>
observation_json = observation.json()
<span class="hljs-comment"># Print the serialized FHIR resource</span>
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 的示例转换** * * * **Chat****GPT** :
当然!以下是如何在 InterSystems COS DTL(数据转换语言)中将 HL7 V2 消息转换为 FHIR STU3 观察资源的示例:
<span class="hljs-keyword">Class</span> DTL.HL7toFHIR <span class="hljs-keyword">Extends</span> <span class="hljs-built_in">%RegisteredObject</span>
{
<span class="hljs-keyword">ClassMethod</span> TransformHL7ToObservation(hl7Message <span class="hljs-keyword">As</span> <span class="hljs-built_in">%String</span>) <span class="hljs-keyword">As</span> <span class="hljs-built_in">%String</span> [ CodeMode = expression, DDLAllowed = <span class="hljs-number">0</span> ]
{
<span class="hljs-keyword">set</span> src = <span class="hljs-keyword">##class</span>(EnsLib.HL7.Message).<span class="hljs-built_in">%New</span>()
<span class="hljs-keyword">set</span> src.DocType = <span class="hljs-string">"2.4"</span>
<span class="hljs-keyword">set</span> src.Parse(hl7Message)
<span class="hljs-keyword">set</span> obs = <span class="hljs-keyword">##class</span>(FHIR.Resource.Observation).<span class="hljs-built_in">%New</span>()
<span class="hljs-keyword">set</span> obs.subject = { <span class="hljs-string">"reference"</span>: <span class="hljs-string">"Patient/"</span>_src.MSH.GetSendingApplication() }
<span class="hljs-keyword">set</span> obs.status = <span class="hljs-string">"final"</span>
<span class="hljs-keyword">set</span> loincCode = src.GetSegment(<span class="hljs-string">"OBX"</span>, <span class="hljs-number">1</span>).GetField(<span class="hljs-number">3</span>).GetField(<span class="hljs-number">1</span>)
<span class="hljs-keyword">set</span> obs.code = {
<span class="hljs-string">"coding"</span>: [
{
<span class="hljs-string">"system"</span>: <span class="hljs-string">"http://loinc.org"</span>,
<span class="hljs-string">"code"</span>: loincCode,
<span class="hljs-string">"display"</span>: loincCode
}
]
}
<span class="hljs-keyword">set</span> value = src.GetSegment(<span class="hljs-string">"OBX"</span>, <span class="hljs-number">1</span>).GetField(<span class="hljs-number">5</span>).GetField(<span class="hljs-number">1</span>)
<span class="hljs-keyword">set</span> units = src.GetSegment(<span class="hljs-string">"OBX"</span>, <span class="hljs-number">1</span>).GetField(<span class="hljs-number">6</span>).GetField(<span class="hljs-number">1</span>)
<span class="hljs-keyword">set</span> obs.valueQuantity = {
<span class="hljs-string">"value"</span>: value,
<span class="hljs-string">"unit"</span>: units,
<span class="hljs-string">"system"</span>: <span class="hljs-string">"http://unitsofmeasure.org"</span>,
<span class="hljs-string">"code"</span>: units
}
<span class="hljs-keyword">quit</span> obs.<span class="hljs-built_in">%ToJSON</span>()
}
}
此代码定义了一个名为 TransformHL7ToObservationI()的类方法,它将 HL7 V2 消息作为输入并返回 FHIR STU3 观察资源作为 JSON 字符串。
该方法首先创建一个新的 EnsLib.HL7.Message 对象并使用它来解析输入的 HL7 消息。然后创建一个新的 FHIR.Resource.Observation 对象并设置 subject和 status 元素。
接下来,代码从 HL7 消息中提取 LOINC 代码、值和单位,并将它们映射到 FHIR 资源中的相应元素。
最后,该方法将 FHIR 资源序列化为 JSON 并将其返回。
要使用此类方法,您可以从另一个 COS 方法或使用 InterSystems 的 REST API 从外部系统调用它。下面是如何从另一个 COS 方法调用该方法的示例:
<span class="hljs-keyword">set</span> hl7Message = <span class="hljs-string">"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"</span>
<span class="hljs-keyword">set</span> fhirObservation = <span class="hljs-keyword">##class</span> (DTL.HL7toFHIR).TransformHL7ToObservation(hl7Message)
<span class="hljs-keyword">write</span> fhirObservation
请注意,您需要在 InterSystems 环境中定义 -----107----- 和 -----108----- 类,并具有运行 COS 代码的适当权限。
* * * 好吧,这可能是迄今为止我们所能预料到的最有效、最全面、最切题的答案,只需大约 25 秒。是不是? 既然我们在这里,我们需要公平对待我也喜欢的其他广泛使用的选项。于是我又怀着信心继续问了几个问题: * * * **问题4:能否给出Orion Rhapsody中从HL7 V2到FHIR Stu3的转换示例** * * * **Chat****GPT** :当然!以下是如何在 Orion Rhapsody 中将 HL7 V2 消息转换为 FHIR STU3 观察资源的示例:
<span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">transform</span>(<span class="hljs-params">msg</span>) </span>{
<span class="hljs-keyword">var</span> hl7 = Packages.ca.uhn.hl7v2.model.v24.message.ORU_R01(msg.getRawData());
<span class="hljs-keyword">var</span> observation = <span class="hljs-keyword">new</span> Packages.org.hl7.fhir.dstu3.model.Observation();
observation.setStatus(Packages.org.hl7.fhir.dstu3.model.Observation.ObservationStatus.FINAL);
<span class="hljs-keyword">var</span> codeableConcept = <span class="hljs-keyword">new</span> Packages.org.hl7.fhir.dstu3.model.CodeableConcept();
<span class="hljs-keyword">var</span> coding = <span class="hljs-keyword">new</span> Packages.org.hl7.fhir.dstu3.model.Coding();
coding.setSystem(<span class="hljs-string">"http://loinc.org"</span>);
coding.setCode(hl7.getRESPONSE().getORDER_OBSERVATION()[<span class="hljs-number">0</span>].getOBR().getUniversalServiceIdentifier().getIdentifier().getValue());
coding.setDisplay(hl7.getRESPONSE().getORDER_OBSERVATION()[<span class="hljs-number">0</span>].getOBR().getUniversalServiceIdentifier().getText().getValue());
codeableConcept.addCoding(coding);
observation.setCode(codeableConcept);
<span class="hljs-keyword">var</span> quantity = <span class="hljs-keyword">new</span> Packages.org.hl7.fhir.dstu3.model.Quantity();
quantity.setValue(hl7.getRESPONSE().getORDER_OBSERVATION()[<span class="hljs-number">0</span>].getOBSERVATION()[<span class="hljs-number">0</span>].getOBX().getObservationValue()[<span class="hljs-number">0</span>].getValue().getValue());
quantity.setUnit(hl7.getRESPONSE().getORDER_OBSERVATION()[<span class="hljs-number">0</span>].getOBSERVATION()[<span class="hljs-number">0</span>].getOBX().getUnits().getText().getValue());
observation.setValue(quantity);
<span class="hljs-keyword">var</span> reference = <span class="hljs-keyword">new</span> Packages.org.hl7.fhir.dstu3.model.Reference();
reference.setReference(<span class="hljs-string">"Patient/"</span> + hl7.getPATIENT_RESULT().getPATIENT().getPid3_PatientIdentifierList()[<span class="hljs-number">0</span>].getID().getValue());
observation.setSubject(reference);
<span class="hljs-keyword">return</span> <span class="hljs-built_in">JSON</span>.stringify(observation);
}
此脚本使用 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 * * * **Chat****GPT** :当然!以下是如何在 Mirth 中将 HL7 V2.4 消息转换为 FHIR R4 观察资源的示例:
<span class="hljs-keyword">var</span> hl7msg = msg[<span class="hljs-string">'HL7v2 Message'</span>].toString(); <span class="hljs-comment">// get the HL7 V2 message</span>
<span class="hljs-keyword">var</span> hl7data = Packages.ca.uhn.hl7v2.parser.Parser.parse(hl7msg); <span class="hljs-comment">// parse the message with the HAPI HL7 parser</span>
<span class="hljs-comment">// extract values from the HL7 message and create the FHIR resource</span>
<span class="hljs-keyword">var</span> obs = <span class="hljs-keyword">new</span> Packages.org.hl7.fhir.r4.model.Observation();
obs.setStatus(Packages.org.hl7.fhir.r4.model.Observation.ObservationStatus.FINAL);
<span class="hljs-keyword">var</span> code = <span class="hljs-keyword">new</span> Packages.org.hl7.fhir.r4.model.CodeableConcept();
code.addCoding()
.setSystem(<span class="hljs-string">"http://loinc.org"</span>)
.setCode(hl7data.get(<span class="hljs-string">"OBR-4-1"</span>).getValue())
.setDisplay(hl7data.get(<span class="hljs-string">"OBR-4-2"</span>).getValue());
obs.setCode(code);
<span class="hljs-keyword">var</span> value = <span class="hljs-keyword">new</span> Packages.org.hl7.fhir.r4.model.Quantity();
value.setValue(hl7data.get(<span class="hljs-string">"OBX-5-1"</span>).getValue());
value.setUnit(hl7data.get(<span class="hljs-string">"OBX-6"</span>).getValue());
obs.setValue(value);
<span class="hljs-keyword">var</span> subject = <span class="hljs-keyword">new</span> Packages.org.hl7.fhir.r4.model.Reference();
subject.setReference(<span class="hljs-string">"Patient/"</span> + hl7data.get(<span class="hljs-string">"PID-3-1"</span>).getValue());
obs.setSubject(subject);
<span class="hljs-comment">// output the FHIR resource as JSON</span>
<span class="hljs-keyword">var</span> json = org.hl7.fhir.r4.formats.JsonParser().setPrettyPrint(<span class="hljs-literal">true</span>).encodeResourceToString(obs);
<span class="hljs-keyword">return</span> 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,它不仅提供精心编写的文档、说明和示例,而且还可以在未来几个月或几年内自动制造您选择的工程工具,对吗?它似乎能够提升“编程语言”的水平,最终使得编程语言中非功能性的特点,比如性能和服务质量等,将变得更重要。**