|
7 min de lectura
|

Automatice la traducción terminológica con Aidbox TX Engine

Resumir este artículo con:
ChatGPTPerplexityClaudeGrok

La falta de concordancia terminológica

Las organizaciones se enfrentan a un reto de integración persistente: la falta de concordancia terminológica entre sistemas. Las interfaces y los datos HL7v2 heredados, las implementaciones FHIR modernas, los catálogos internos de procedimientos y los requisitos de terceros crean una compleja red de necesidades de traducción de códigos. Un sistema de laboratorio envía resultados utilizando códigos internos mientras que el HCE requiere LOINC. Radiología utiliza códigos de procedimiento propietarios mientras que la facturación exige CPT. Cada discordancia requiere traducción y, a escala, estas traducciones se multiplican hasta alcanzar miles de conversiones diarias.

Los enfoques manuales se rompen rápidamente. Mantener hojas de cálculo con mapeos de códigos se vuelve propenso a errores a medida que varios equipos actualizan diferentes versiones. La lógica de traducción personalizada integrada en los motores de integración crea desafíos técnicos y hace que las actualizaciones sean costosas. Sin una gestión sistemática de mapeos, las organizaciones se enfrentan a fallos de integración, problemas de calidad de los datos y costes de mantenimiento crecientes.

El recurso ConceptMap de FHIR y la operación $translate proporcionan una forma estructurada e interoperable de gestionar los mapeos terminológicos. ConceptMap define las relaciones entre conceptos de diferentes sistemas de códigos, creando reglas de mapeo reutilizables y con control de versiones. La operación $translate ejecuta estos mapeos de forma programática, permitiendo traducciones automatizadas y consistentes en todo su ecosistema. Este artículo explora cómo utilizar ConceptMap y $translate para la traducción automatizada de códigos y su comportamiento al operar en un entorno híbrido.

Comprensión de los conceptos básicos

¿Qué es un ConceptMap?

ConceptMap es un recurso FHIR que define cómo se mapean los códigos de un sistema terminológico a los de otro. Piense en él como un diccionario de traducción para códigos médicos — legible por máquina, versionado y compartible.

Por ejemplo, su hospital podría tener códigos de laboratorio internos que necesiten mapearse a LOINC para compartirlos externamente:

  • Código hospitalario: GLU-FAST-001 → LOINC: 1558-6 (glucosa en ayunas)
  • Código hospitalario: HBA1C-TOTAL → LOINC: 4548-4 (hemoglobina A1c)

Cada mapeo incluye un tipo de relación — como «equivalent» (mismo significado) o «source-is-broader-than-target» (el destino es más específico), de modo que los sistemas consumidores entiendan con qué precisión se alinean los códigos. Con estas definiciones establecidas, un ConceptMap se convierte en una única fuente de verdad que es reutilizable, con control de versiones y que puede compartirse en toda su organización o incluso publicarse para que otros la utilicen.

¿Qué es $translate?

La operación $translate es una API FHIR que utiliza ConceptMaps para traducir automáticamente códigos de un sistema a otro. En lugar de escribir lógica de búsqueda personalizada, realiza una simple solicitud HTTP:

Entrada: «Traducir el código GLU-FAST-001 de nuestro sistema hospitalario a LOINC»

Salida: «Código 1558-6 en LOINC, con relación: equivalent»

En segundo plano, la operación gestiona toda la complejidad — encontrando los ConceptMaps relevantes, buscando el código, filtrando por sistema de destino y devolviendo resultados estructurados. Como resultado, obtiene traducciones consistentes y fiables sin necesidad de mantener código personalizado en múltiples sistemas.

Ejemplo sencillo de solicitud/respuesta

A continuación se muestra el aspecto de una solicitud de traducción básica:

POST /fhir/ConceptMap/$translate
Content-Type: application/json

{
  "resourceType": "Parameters",
  "parameter": [
    {
      "name": "sourceCode",
      "valueCode": "female"
    },
    {
      "name": "sourceSystem",
      "valueUri": "http://hl7.org/fhir/administrative-gender"
    },
    {
      "name": "targetSystem",
      "valueUri": "http://terminology.hl7.org/CodeSystem/v2-0001"
    }
  ]
}

La respuesta indica si se encontró una traducción (result: true) y proporciona el código de destino:

{
  "resourceType": "Parameters",
  "parameter": [
    {
      "name": "result",
      "valueBoolean": true
    },
    {
      "name": "match",
      "part": [
        {
          "name": "relationship",
          "valueCode": "equal"
        },
        {
          "name": "concept",
          "valueCoding": {
            "system": "http://terminology.hl7.org/CodeSystem/v2-0001",
            "code": "F",
            "display": "F"
          }
        },
        {
          "name": "source",
          "valueUri": "http://hl7.org/fhir/ConceptMap/cm-administrative-gender-v2"
        }
      ]
    }
  ]
}

Múltiples coincidencias

En cuanto comience a utilizar ConceptMap en escenarios del mundo real, observará que algunos códigos aparecen en múltiples contextos de mapeo. Esto es especialmente frecuente con códigos de estado genéricos o conceptos administrativos que son reutilizados por diferentes recursos FHIR e IGs. En tales casos, $translate se comporta de forma predecible: en lugar de elegir el «mejor» mapeo, devuelve todas las coincidencias relevantes para que los clientes puedan decidir cómo gestionarlas.

El uso más básico de $translate se produce cuando se intenta encontrar coincidencias de mapeo para una codificación. Los usuarios pueden especificar únicamente el sistema y el código, y translate es capaz de localizar los ConceptMaps aplicables y las entradas coincidentes. Ese es el caso del ejemplo anterior. Puede haber situaciones en las que el concepto que se está traduciendo coincida con mapeos definidos en diferentes sistemas de códigos. Suponiendo que tenemos múltiples ConceptMaps en nuestra instancia de Aidbox, incluyendo el mapeo para http://hl7.org/fhir/event-status|completed, obtenemos todas las coincidencias procedentes de los diferentes ConceptMaps.

Solicitud

POST /fhir/ConceptMap/$translate
Content-Type: application/json

{
  "resourceType": "Parameters",
  "parameter": [
    {
      "name": "sourceCode",
      "valueCode": "completed"
    },
    {
      "name": "sourceSystem",
      "valueUri": "http://hl7.org/fhir/event-status"
    }
  ]
}
{
  "resourceType": "Parameters",
  "parameter": [
    {
      "name": "result",
      "valueBoolean": true
    },
    {
      "name": "match",
      "part": [
        {
          "name": "relationship",
          "valueCode": "equivalent"
        },
        {
          "name": "concept",
          "valueCoding": {
            "system": "http://hl7.org/fhir/resource-status",
            "code": "complete",
            "display": "complete"
          }
        },
        {
          "name": "source",
          "valueUri": "http://hl7.org/fhir/ConceptMap/sc-clinicalimpression-status"
        }
      ]
    },
    {
      "name": "match",
      "part": [
        {
          "name": "relationship",
          "valueCode": "equivalent"
        },
        {
          "name": "concept",
          "valueCoding": {
            "system": "http://hl7.org/fhir/resource-status",
            "code": "complete",
            "display": "complete"
          }
        },
        {
          "name": "source",
          "valueUri": "http://hl7.org/fhir/ConceptMap/sc-event-status"
        }
      ]
    },
    {
      "name": "match",
      "part": [
        {
          "name": "relationship",
          "valueCode": "equivalent"
        },
        {
          "name": "concept",
          "valueCoding": {
            "system": "http://hl7.org/fhir/resource-status",
            "code": "complete",
            "display": "complete"
          }
        },
        {
          "name": "source",
          "valueUri": "http://hl7.org/fhir/ConceptMap/sc-immunization-status"
        }
      ]
    }
  ]
}

ConceptMap conocido

ConceptMap define grupos de mapeos. Cada grupo tiene un sistema source y un sistema target que representan, respectivamente, el sistema de origen donde está definido el código a mapear y el sistema de destino donde se mapeará el concepto. En algunos casos, ya sabe qué ConceptMap desea utilizar. Quizás esté implementando un perfil específico o siguiendo las reglas de mapeo de un IG particular. En lugar de depender de una búsqueda a nivel de sistema, puede indicar a $translate que utilice un ConceptMap único y conocido.

Esto reduce el alcance de la traducción y garantiza resultados predecibles y específicos al contexto — especialmente valioso cuando múltiples ConceptMaps definen mapeos similares.

Solicitud

POST /fhir/ConceptMap/$translate
Content-Type: application/json

{
  "resourceType": "Parameters",
  "parameter": [
    {
      "name": "url",
      "valueUri": "http://hl7.org/fhir/ConceptMap/sc-composition-status"
    },
    {
      "name": "sourceCode",
      "valueCode": "preliminary"
    },
    {
      "name": "sourceSystem",
      "valueUri": "http://hl7.org/fhir/composition-status"
    }
  ]
}

El parámetro url especifica el ConceptMap que se utilizará durante la traducción. Se indica al servidor que utilice ese contenedor de mapeo específico durante la traducción.

Respuesta

{
  "resourceType": "Parameters",
  "parameter": [
    {
      "name": "result",
      "valueBoolean": true
    },
    {
      "name": "match",
      "part": [
        {
          "name": "relationship",
          "valueCode": "equivalent"
        },
        {
          "name": "concept",
          "valueCoding": {
            "system": "http://hl7.org/fhir/resource-status",
            "code": "draft",
            "display": "draft"
          }
        },
        {
          "name": "source",
          "valueUri": "http://hl7.org/fhir/ConceptMap/sc-composition-status"
        }
      ]
    }
  ]
}

La ventaja híbrida

Crear ConceptMaps para las necesidades específicas de su organización, como los códigos internos mapeados a LOINC, tiene todo el sentido. Usted conoce sus códigos, controla los mapeos y puede actualizarlos según sea necesario. Pero crear todos los ConceptMaps posibles no es realista. De forma similar a los sistemas de códigos externos o estándar, existen ConceptMaps que definen datos de traducción para escenarios comunes. Veamos algunos ejemplos:

  • Códigos administrativos FHIR → HL7 V2
  • Todos los ConceptMaps de US Core
  • ICD-10 → SNOMED CT
  • Mapas regionales y específicos por especialidad

Aquí es donde brilla el enfoque híbrido de Aidbox. Aidbox comprueba primero sus ConceptMaps locales. Si se encuentra una traducción, la devuelve inmediatamente, de forma rápida y local. Si no se encuentra ninguna traducción y no existe ningún ConceptMap local para ese sistema de origen, Aidbox delega automáticamente la traducción al servidor de terminología externo configurado (como tx.health-samurai.io).

Esto significa que obtiene:

  • Sus mapeos personalizados (mantenidos por usted, utilizados primero)
  • Mapeos estándar (mantenidos externamente, accedidos automáticamente)
  • Sin duplicación (no necesita recrear los mapeos estándar)

Solicitud

POST /fhir/ConceptMap/$translate
Content-Type: application/json

{
  "resourceType": "Parameters",
  "parameter": [
    {
      "name": "sourceCode",
      "valueCode": "D"
    },
    {
      "name": "sourceSystem",
      "valueUri": "http://hl7.org/fhir/us/vr-common-library/CodeSystem/codesystem-ije-vr"
    },
    {
      "name": "targetSystem",
      "valueUri": "http://snomed.info/sct"
    }
  ]
}

Respuesta

{
  "resourceType": "Parameters",
  "parameter": [
    {
      "name": "result",
      "valueBoolean": true
    },
    {
      "name": "match",
      "part": [
        {
          "name": "equivalence",
          "valueCode": "equivalent"
        },
        {
          "name": "concept",
          "valueCoding": {
            "system": "http://snomed.info/sct",
            "code": "434651000124107"
          }
        },
        {
          "name": "source",
          "valueString": "http://hl7.org/fhir/us/vrdr/ConceptMap/CertifierTypesCM"
        }
      ]
    },
    {
      "name": "match",
      "part": [
        {
          "name": "equivalence",
          "valueCode": "equivalent"
        },
        {
          "name": "concept",
          "valueCoding": {
            "system": "http://snomed.info/sct",
            "code": "449951000124101"
          }
        },
        {
          "name": "source",
          "valueString": "http://hl7.org/fhir/us/vrdr/ConceptMap/MethodOfDispositionCM"
        }
      ]
    }
  ]
}

Traducción con ConceptMap en Aidbox

Aidbox introdujo ConceptMap en la versión 2508, con soporte para la operación $translate; consulte el registro de capacidades. Si desea probarlo de forma local, comience ejecutando Aidbox siguiendo la guía para ejecutar Aidbox de forma local.

Preparar el recurso de mapeo local

Abra la consola REST de Aidbox y envíe:

PUT /fhir/ConceptMap/cm1
Content-Type: application/json

{
  "resourceType": "ConceptMap",
  "id": "cm1",
  "url": "http://hl7.org/fhir/ConceptMap/sc-clinicalimpression-status-TEST",
  "version": "0.1.0",
  "status": "active",
  "group": [
    {
      "source": "http://hl7.org/fhir/event-status|5.0.0",
      "target": "http://hl7.org/fhir/resource-status",
      "element": [
        {
          "code": "entered-in-error",
          "target": [
            {
              "code": "error",
              "equivalence": "equivalent"
            }
          ]
        },
        {
          "code": "preparation",
          "target": [
            {
              "code": "planned",
              "equivalence": "equivalent"
            }
          ]
        },
        {
          "code": "in-progress",
          "target": [
            {
              "code": "active",
              "equivalence": "equivalent"
            }
          ]
        },
        {
          "code": "on-hold",
          "target": [
            {
              "code": "suspended",
              "equivalence": "equivalent"
            }
          ]
        },
        {
          "code": "stopped",
          "target": [
            {
              "code": "failed",
              "equivalence": "equivalent"
            }
          ]
        },
        {
          "code": "completed",
          "target": [
            {
              "code": "complete",
              "equivalence": "equivalent"
            }
          ]
        },
        {
          "code": "not-done",
          "target": [
            {
              "code": "abandoned",
              "equivalence": "equivalent"
            }
          ]
        },
        {
          "code": "unknown",
          "target": [
            {
              "code": "unknown",
              "equivalence": "equivalent"
            }
          ]
        }
      ]
    }
  ]
}

Ejecutar la operación $translate de ConceptMap

POST /fhir/ConceptMap/$translate
Content-Type: application/json

{
  "resourceType": "Parameters",
  "parameter": [
    {
      "name": "url", 
      "valueUri": "http://hl7.org/fhir/ConceptMap/sc-clinicalimpression-status-TEST"
    },
    {
      "name": "sourceCode",
      "valueCode": "completed"
    },
    {
      "name": "sourceSystem",
      "valueUri": "http://hl7.org/fhir/event-status"
    },
    {
      "name": "sourceVersion",
      "valueString": "5.0.0"
    }
  ]
}

Respuesta

{
 "resourceType": "Parameters",
 "parameter": [
  {
   "name": "result",
   "valueBoolean": true
  },
  {
   "name": "match",
   "part": [
    {
     "name": "relationship",
     "valueCode": "equivalent"
    },
    {
     "name": "concept",
     "valueCoding": {
      "system": "http://hl7.org/fhir/resource-status",
      "code": "complete",
      "display": "complete"
     }
    },
    {
     "name": "source",
     "valueUri": "http://hl7.org/fhir/ConceptMap/sc-clinicalimpression-status-TEST"
    }
   ]
  }
 ]
}

Inicie su instancia de Aidbox y automatice la traducción terminológica al estilo FHIR. Deje de escribir código personalizado de búsqueda y traducción.

Véase también:

Véase también: Categorías residuales en FHIR Terminology.

Compartir este artículo
Comments
Comments
Sign in
Loading comments...
Subscribe to our blog

Get the latest articles on FHIR, interoperability, and healthcare IT.