En el artículo anterior presentamos la aplicación d[IA]gnosis desarrollada para apoyar la codificación de diagnósticos en CIE-10. En este artículo veremos cómo InterSystems IRIS for Health nos proporciona las herramientas necesarias para la generación de vectores a partir de la lista de códigos CIE-10 utilizando un modelo de lenguaje previamente entrenado, su almacenamiento y la posterior búsqueda de similitudes sobre todos estos vectores generados. .
Una de las principales características que han surgido con el desarrollo de los modelos de IA es lo que conocemos como RAG (Retrieval-Augmented Generation) que nos permite mejorar los resultados de los modelos LLM incorporando un contexto al modelo. Bueno, en nuestro ejemplo el contexto viene dado por el conjunto de diagnósticos CIE-10 y para utilizarlos primero debemos vectorizarlos.
¿Cómo vectorizar nuestra lista de diagnósticos?
Para la generación de vectores hemos utilizado la biblioteca de Python SentenceTransformers que facilita enormemente la vectorización de textos libres a partir de modelos previamente entrenados. Desde su propio sitio web:
Sentence Transformers (también conocido como SBERT) es el módulo de Python de referencia para acceder, usar y entrenar modelos de incrustación de imágenes y texto de última generación. Se puede utilizar para calcular incrustaciones utilizando modelos Sentence Transformer (inicio rápido) o para calcular puntuaciones de similitud utilizando modelos Cross-Encoder (inicio rápido). Esto desbloquea una amplia gama de aplicaciones, incluida la búsqueda semántica, la similitud textual semántica y la minería de paráfrasis.
Entre todos los modelos desarrollados por la comunidad SentenceTransformers hemos encontrado BioLORD-2023-M, un modelo pre-entrenado que generará vectores de 786 dimensiones.
Este modelo se entrenó utilizando BioLORD, una nueva estrategia de preentrenamiento para producir representaciones significativas de oraciones clínicas y conceptos biomédicos.
Las metodologías de última generación operan maximizando la similitud en la representación de nombres que se refieren al mismo concepto y evitando el colapso a través del aprendizaje contrastivo. Sin embargo, debido a que los nombres biomédicos no siempre se explican por sí solos, a veces resultan en representaciones no semánticas.
BioLORD supera este problema fundamentando sus representaciones conceptuales utilizando definiciones, así como descripciones breves derivadas de un gráfico de conocimiento multirelacional que consta de ontologías biomédicas. Gracias a esta base, nuestro modelo produce representaciones de conceptos más semánticas que coinciden más estrechamente con la estructura jerárquica de las ontologías. BioLORD-2023 establece un nuevo estado del arte para la similitud de textos tanto en oraciones clínicas (MedSTS) como en conceptos biomédicos (EHR-Rel-B).
Como podéis ver en su definición, este modelo está pre-entrenado con conceptos médicos que nos serán útiles a la hora de vectorizar tanto nuestros códigos ICD-10 como texto libre.
Para nuestro proyecto, descargaremos este modelo para acelerar la creación de vectores:
if not os.path.isdir('/shared/model/'): model = sentence_transformers.SentenceTransformer('FremyCompany/BioLORD-2023-M') model.save('/shared/model/')
Una vez en nuestro equipo, podemos introducir los textos a vectorizar en listas para agilizar el proceso, veamos como vectorizamos los códigos ICD-10 que previamente hemos grabado en nuestro ENCODER.Object.Codes clase.
st = iris.sql.prepare("SELECT TOP 50 CodeId, Description FROM ENCODER_Object.Codes WHERE VectorDescription is null ORDER BY ID ASC ") resultSet = st.execute() df = resultSet.dataframe() if (df.size > 0): model = sentence_transformers.SentenceTransformer("/shared/model/") embeddings = model.encode(df['description'].tolist(), normalize_embeddings=True) df['vectordescription'] = embeddings.tolist() stmt = iris.sql.prepare("UPDATE ENCODER_Object.Codes SET VectorDescription = TO_VECTOR(?,DECIMAL) WHERE CodeId = ?") for index, row in df.iterrows(): rs = stmt.execute(str(row['vectordescription']), row['codeid']) else: flagLoop = False
Como puedes ver, primero extraemos los códigos almacenados en nuestra tabla de códigos ICD-10 que aún no hemos vectorizado pero que hemos grabado en un paso anterior después de extraerlo del archivo CSV, luego extraemos la lista de descripciones para vectorizar y usando la biblioteca Python sentence_transformers recuperaremos nuestro modelo y generaremos las incrustaciones asociadas.
Finalmente, actualizaremos el código ICD-10 con la descripción vectorizada ejecutando UPDATE. Como puede ver, el comando para vectorizar el resultado devuelto por el modelo es el comando SQL TO_VECTOR en IRIS.
Bien, tenemos nuestro código Python, así que solo necesitamos incluirlo en una clase que extienda Ens.BusinessProcess e incluirlo en nuestra producción, luego conectarlo al Servicio Empresarial encargado de recuperarlo. el archivo CSV y ¡listo!
Echemos un vistazo a cómo se verá este código en nuestra producción:
Como puedes ver, tenemos nuestro Servicio de Negocio con el adaptador EnsLib.File.InboundAdapter que nos permitirá recolectar el archivo de código y redirigirlo a nuestro Proceso de Negocio en el cual realizaremos todas las operaciones de vectorización y almacenamiento, dándonos un conjunto de registros como el siguiente:
¡Ahora nuestra aplicación estaría lista para comenzar a buscar posibles coincidencias con los textos que le enviamos!
En el próximo artículo mostraremos cómo el front-end de la aplicación desarrollado en Angular 17 se integra con nuestra producción en IRIS for Health y cómo IRIS recibe los textos a analizar, los vectoriza y busca similitudes en la CIE-10. tabla de códigos.
¡No te lo pierdas!
Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.
Copyright© 2022 湘ICP备2022001581号-3