新しい投稿

検索

記事
· 2025年4月1日 6m read

d[IA]gnosis: buscando similitudes en nuestra base de datos vectorial y usando LLM para extraer diagnósticos

¡Acabo de caer en la cuenta de que nunca terminé esta serie de artículos!

GIF de Shame On You Meme | Tenor

En el artículo de hoy vamos a echar un vistazo a la producción que se encarga de extraer los diagnósticos en CIE-10 más similares a nuestro texto, de tal forma que podamos seleccionar la opción más adecuada desde nuestro frontend.

Buscando similitudes de diagnósticos:

Desde la pantalla que nos muestra las solicitudes de diagnósticos recibidas en HL7 en nuestra aplicación podremos buscar cuales son los diagnósticos CIE-10 más próximos al texto introducido por el profesional.

Para acelerar el proceso de búsquedas hemos almacenado en nuestra base de datos el texto vectorizado del diagnóstico recibido en el momento de capturar el mensaje de HL7. Para ello hemos implementado un BPL simple que extrae el código del diagnóstico del mensaje y lo envía a un método para generar el vector:

Y aquí está el código que vectoriza el diagnóstico recibido:

ClassMethod GetEncoding(sentence As %String) As %String [ Language = python ]
{
        import sentence_transformers
        # create the model and form the embeddings
        model = sentence_transformers.SentenceTransformer('/iris-shared/model/')
        embeddings = model.encode(sentence, normalize_embeddings=True).tolist() # Convert search phrase into a vector
        # convert the embeddings to a string
        return str(embeddings)
}

De esta manera tenemos nuestros diagnósticos vectorizados, evitando tener que vectorizarlo nuevamente cada vez que tengamos que hacer una búsqueda sobre el mismo. Como podéis ver, estamos usando la librería sentence_transformer para generar el vector con el modelo descargado.

Con todos nuestros diagnósticos recibidos vectorizados y almacenados en nuestra base de datos sólo necesitaremos ejecutar una consulta de tipo SELECT para extraer aquellos diagnósticos CIE-10 más próximos a los diagnósticos recibidos.

Veamos el código del método publicado en nuestro servicio web que retornará los 25 diagnósticos más similares:

ClassMethod GetCodeOptions(idRequest As %String) As %Status
{
	set ret = $$$OK
    try {
        set sql = 
            "SELECT TOP 25 * FROM (SELECT C.CodeId, C.Description, VECTOR_DOT_PRODUCT(C.VectorDescription, R.VectorDescription) AS Similarity FROM ENCODER_Object.Codes C, ENCODER_Object.CodeRequests R WHERE R.ID = ?) WHERE Similarity > 0.5 ORDER BY Similarity DESC"

		set statement = ##class(%SQL.Statement).%New()
		$$$ThrowOnError(statement.%Prepare(sql))
        set rs = statement.%Execute(idRequest)

        set array = []
        while rs.%Next() {
            do array.%Push({
                    "CodeId": (rs.%Get("CodeId")),
                    "Description": (rs.%Get("Description")),
                    "Similarity": (rs.%Get("Similarity"))
                })
        }
        set %response.Status = ..#HTTP200OK
        write array.%ToJSON()

    } catch ex {
        set %response.Status = ..#HTTP400BADREQUEST
        return ex.DisplayString()
    }
    quit ret
}

Si veis la consulta, estamos limitando la búsqueda a 25 resultados y únicamente de aquellos diagnósticos que superen un nivel de similitud de 0.5. Para el cálculo de similitud hemos elegido el método VECTOR_DOT_PRODUCT aunque podríamos haber usado VECTOR_COSINE. Particularmente no he encontrado una diferencia sustancial entre ellos para este caso.

Aquí tenemos el resultado de la búsqueda:

Utilizando LLM para identificar diagnósticos

Hasta ahora sólo hemos hecho una búsqueda sencilla sobre diagnósticos perfectamente identificados, pero...¿Podríamos identificar diagnósticos directamente sobre texto libre?

¡Vamos a intentarlo!

Para esta funcionalidad vamos a hacer uso de Ollama que nos proporcione una API a la que enviar nuestras preguntas a un modelo LLM que elijamos. Si echáis un vistazo a nuestro docker-compose.yml veréis la declaración del contenedor de Ollama:

  ## llm locally installed
  ollama:
    build:
      context: .
      dockerfile: ollama/Dockerfile
    container_name: ollama
    volumes:
    - ./ollama/shared:/ollama-shared
    ports:
      - "11434:11434"

Para la puerta hemos definido en el despliegue del contenedor que se descargue el LLM llama3.2 ¿El motivo? Pues que me ha parecido el que mejor rendimiento me ofreció en las pruebas.

Este es el contenido del fichero entrypoint.sh que se ejecuta en el despliegue del contenedor:

#!/bin/bash

echo "Starting Ollama server..."
ollama serve &
SERVE_PID=$!

echo "Waiting for Ollama server to be active..."
while ! ollama list | grep -q 'NAME'; do
  sleep 1
done

ollama pull llama3.2

wait $SERVE_PID

Para hacer uso de las capacidades de Ollama he modificado la pantalla que nos analiza los textos libres para indicarle que debe usar el LLM para extraer los diagnósticos del texto introducido.

También hemos modificado el business process añadiendo un método que construirá el prompt necesario para que llama3.2 extraiga directamente los diagnósticos:

Method AnalyzeText(text As %String, analysisId As %String, language As %String) As %String [ Language = python ]
{
    import sentence_transformers
    import iris
    import requests

    try:
        url = "http://ollama:11434/api/generate"
        data = {
            "model": "llama3.2",
            "prompt": "Extrae únicamente los diagnósticos del siguiente texto separándolos por , y sin añadir interpretaciones: "+text,
            "stream": False
        }
        response = requests.post(url, json=data)
        analyzedText = response.json()
        
        model = sentence_transformers.SentenceTransformer('/iris-shared/model/')
        phrases = analyzedText['response'].split(",")
        sqlsentence = ""
        # iris.cls("Ens.Util.Log").LogInfo("ENCODER.BP.AnalyzeTextProcess", "AnalyzeText", "Starting process")
        for phraseToAnalyze in phrases :
            if phraseToAnalyze != "":
                embedding = model.encode(phraseToAnalyze, normalize_embeddings=True).tolist()
                sqlsentence = "INSERT INTO ENCODER_Object.TextMatches (CodeId, Description, Similarity, AnalysisId, RawText) SELECT TOP 50 * FROM (SELECT CodeId, Description, VECTOR_DOT_PRODUCT(VectorDescription, TO_VECTOR('"+str(embedding)+"', DECIMAL)) AS Similarity, '"+analysisId+"', '"+phraseToAnalyze+"' FROM ENCODER_Object.Codes) ORDER BY Similarity DESC"                    
                stmt = iris.sql.prepare("INSERT INTO ENCODER_Object.TextMatches (CodeId, Description, Similarity, AnalysisId, RawText) SELECT TOP 50 * FROM (SELECT CodeId, Description, VECTOR_DOT_PRODUCT(VectorDescription, TO_VECTOR(?, DECIMAL)) AS Similarity, ?, ? FROM ENCODER_Object.Codes) WHERE Similarity > 0.65 ORDER BY Similarity DESC")                    
                rs = stmt.execute(str(embedding), analysisId, phraseToAnalyze)        
    except Exception as err:
        iris.cls("Ens.Util.Log").LogInfo("ENCODER.BP.AnalyzeTextProcess", "AnalyzeText", repr(err))
        return repr(err)

    return "Success"
}

El prompt es muy sencillito, posiblemente se podrá mejorar y afinar lo necesario, lo dejo a vuestra voluntad. Este método lo que va a hacer es recuperar la respuesta del LLM separada por comas y almacenar los diagnósticos hallados vectorizados en nuestra base de datos. Aquí tenéis un ejemplo del resultado obtenido:

En la parte inferior derecha podéis ver todos los hallazgos del LLM sobre el texto de la parte inferior izquierda.

Pues ya tendríamos una aplicación que hace uso de modelos LLM para ayudarnos a la codificación de diagnósticos. Como habéis visto, no es para nada complicado de implementar y puede ser una buena base para construir soluciones más complejas y completas.

¡Muchas gracias por vuestro tiempo!

ディスカッション (0)1
続けるにはログインするか新規登録を行ってください
InterSystems公式
· 2025年4月1日

Disponibilidad General de InterSystems IRIS, InterSystems IRIS for Health y HealthShare Health Connect 2025.1

InterSystems anuncia la disponibilidad general de InterSystems IRIS, InterSystems IRIS for Health y HealthShare Health Connect 2025.1

La versión 2025.1 de la plataforma de datos InterSystems IRIS®, InterSystems IRIS® for Health™ y HealthShare® Health Connect ya está disponible de manera general (GA). Esta es una versión de Mantenimiento Extendido (EM).

Aspectos destacados de la versión
En esta emocionante versión, los usuarios pueden esperar varias nuevas funciones y mejoras, entre ellas:

  1. Capacidades Avanzadas de Búsqueda Vectorial
    • Un nuevo índice basado en disco de Vecino Más Cercano Aproximado o Approximate Nearest Neighbor (ANN) acelera significativamente las consultas de búsqueda vectorial, proporcionando respuestas en menos de un segundo incluso con millones de vectores. Acceded al siguiente ejercicio para aprender más: Vectorización y búsqueda de texto con InterSystems SQL.  
  2. Inteligencia de Negocios Mejorada
    • Análisis automático de dependencias en la construcción y sincronización de cubos de IRIS BI, garantizando coherencia e integridad en dependencias complejas de cubos.
  3. Mejora en SQL y Gestión de Datos
    • Introducción de sintaxis estándar de paginación en SQL (LIMIT... OFFSET..., OFFSET... FETCH...).
    • Nuevo comando LOAD SQL para facilitar la importación masiva de declaraciones DDL.
    • Comandos mejorados ALTER TABLE para convertir sin problemas entre diseños de filas y columnas.
  4. Optimización de Operaciones en Bases de Datos
    • Reducción del tamaño de los registros de diario para mejorar la eficiencia.
    • Compactación de bases de datos más rápida, especialmente para bases de datos con gran cantidad de contenido en cadenas extensas.
    • Mayor automatización al agregar nuevas bases de datos a un espejo.
    • Nueva utilidad de línea de comandos para tareas de gestión de ECP.
  5. Cumplimiento de Seguridad Reforzado
    • Soporte para bibliotecas criptográficas compatibles con los estándares FIPS 140-3.
  6. Interfaz de Interoperabilidad Modernizada
    • Los usuarios pueden optar por una experiencia renovada en la Configuración de Producción y el Editor DTL, que incluye integración con control de versiones, compatibilidad con VS Code, filtrado mejorado, vistas en panel dividido y más. Consultad este artículo de la Comunidad de Desarrolladores para obtener más información sobre cómo participar y proporcionar comentarios.
  7. Capacidades Ampliadas para el Sector Salud
    • Ingesta y programación eficiente de datos FHIR en bloque, con verificaciones de integridad y gestión de recursos.
    • Acceso mejorado a datos en bloque con FHIR y optimización de operaciones de búsqueda en FHIR.
  8. Nuevas Funcionalidades para Desarrolladores
  9. Observabilidad Mejorada con OpenTelemetry
    • Introducción de capacidades de trazado en IRIS para una observabilidad detallada de solicitudes web y rendimiento de aplicaciones.

Compartid vuestros comentarios a través de la Comunidad de Desarrolladores para ayudarnos a construir un mejor producto juntos.

Documentación

Detalles sobre todas las funciones destacadas están disponibles en los siguientes enlaces

Además, consultad la lista de verificación de impacto de la actualización para obtener un resumen fácil de navegar sobre todos los cambios que debéis tener en cuenta al actualizar a esta versión.  

En particular, tened en cuenta que InterSystems IRIS 2025.1 introduce una nueva versión del formato de archivos de journal, que no es compatible con versiones anteriores. Esto impone ciertas limitaciones en configuraciones de mirror con versiones mixtas. Consultad la documentación correspondiente para más detalles.

Programas de Acceso Anticipado (EAPs)

Hay muchos EAPs disponibles en este momento. Consultad esta página y registraos en aquellos que os interesen.

Descarga del software

Como es habitual, las versiones de Mantenimiento Extendido (EM) incluyen paquetes de instalación clásicos para todas las plataformas compatibles, así como imágenes en formato de contenedor Docker.

Paquetes de Instalación Clásicos

Los paquetes de instalación están disponibles en la página de InterSystems IRIS del WRC para InterSystems IRIS e InterSystems IRIS for Health, y en la página de HealthShare del WRC para Health Connect. También podéis encontrar los kits en el sitio web de Evaluation Services.

Disponibilidad e Información de los Paquetes

Esta versión incluye paquetes de instalación clásicos para todas las plataformas compatibles, así como imágenes de contenedor en formato Docker. Para obtener una lista completa, consultad el documento de Plataformas Compatibles.

El número de compilación de esta versión de Mantenimiento Extendido es 2025.1.0.223.0.

Las imágenes de contenedor están disponibles en el Registro de Contenedores de InterSystems. Los contenedores están etiquetados como "2025.1" y "latest-em".

ディスカッション (0)1
続けるにはログインするか新規登録を行ってください
InterSystems公式
· 2025年4月1日 5m read

2025.1 Modernización de la Experiencia del Usuario en Interoperabilidad

La interfaz de usuario de Interoperabilidad ahora incluye experiencias modernizadas para las aplicaciones DTL Editor y Production Configuration, las cuales están disponibles para su activación en todos los productos de interoperabilidad. Podéis alternar entre las vistas moderna y tradicional. Todas las demás pantallas de interoperabilidad permanecen en la interfaz de usuario estándar. Tenéis que tener en cuenta que los cambios se limitan a estas dos aplicaciones, y a continuación se identifica la funcionalidad que está disponible actualmente.

Para probar las nuevas pantallas antes de la actualización, podéis descargar la versión 2025.1 desde nuestra página web del kit de la comunidad aquí: https://evaluation.intersystems.com/Eval/.

Configuración de Producción - Introducción a las Tareas de Configuración
  • Configuración de Producción: Soporte en esta versión de la Configuración de Producción:
    • Creación/Edición/Copia/Eliminación de Hosts
    • Detener/Iniciar Hosts
    • Edición de Configuración de Producción
    • Detener/Iniciar Producciones
  • Integración con Control de Versiones: El soporte para la integración con control de versiones para la funcionalidad de configuración mencionada está disponible.
  • Vista de Panel Dividido: Los usuarios pueden abrir directamente el Editor de Reglas y el Editor DTL desde la pantalla de Configuración de Producción para ver y editar reglas y transformaciones incluidas en la producción en una vista de panel dividido.
  • Filtrado Mejorado: Un cuadro de búsqueda en la parte superior permite buscar y filtrar en todos los componentes de negocio, incluyendo múltiples categorías, DTLs y subtransformaciones. Usad la barra lateral izquierda para buscar independientemente del panel principal y ver los resultados de búsqueda a través de hosts y categorías.
  • Edición Masiva de Categorías de Hosts: Podéis añadir una nueva categoría o editar una existente para una producción añadiendo hosts desde la configuración de producción.
  • Routers Expandibles: Los routers pueden ser expandidos para ver todas las reglas, transformaciones y conexiones en línea.
  • Conexiones de Hosts Reformuladas: Las conexiones directas e indirectas ahora se muestran cuando se selecciona un host de negocio, permitiendo ver el camino completo que un mensaje puede tomar. Colocad el cursor sobre cualquier host de salida o entrada para diferenciar mejor las conexiones. El interruptor Mostrar solo Hosts Conectados filtrará solo los hosts seleccionados y sus conexiones.

 

 

  • Integración con Control de Versiones: El soporte para la integración con control de versiones está disponible.
  • Integración con VS Code: Los usuarios pueden ver esta versión del Editor DTL en su IDE de VS Code.
  • Soporte de Python Embebido: El soporte de Python embebido se extiende a esta versión del Editor DTL.
  • Pruebas de DTL: La utilidad de prueba DTL está disponible en esta versión del Editor DTL.
  • Cambio de Diseño del Panel: El editor DTL soporta un diseño de lado a lado y de arriba a abajo. Haced clic en el botón de diseño en la cinta superior para experimentar con esto.
  • Deshacer/Volver a Hacer: Los usuarios pueden deshacer y rehacer todas las acciones con los botones de deshacer/rehacer que aún no se han guardado en el código.
  • Generar Parámetro de Segmentos Vacíos: El parámetro GENERATEEMPTYSEGMENTS está disponible para generar segmentos vacíos para los campos faltantes.
  • Visualización de Subtransformaciones: Los usuarios pueden ver subtransformaciones haciendo clic en el ícono del ojo para abrir el DTL de la subtransformación en una nueva pestaña.
  • Desplazamiento:
    • Desplazamiento Independiente: Las secciones izquierda y derecha (origen y destino) del DTL pueden desplazarse de manera independiente colocando el cursor sobre una de las secciones y utilizando la rueda de desplazamiento o el trackpad para mover los segmentos verticalmente.
    • Desplazamiento Conjunto: Ambas secciones, origen y destino, pueden desplazarse juntas colocando el cursor en el medio del diagrama.
  • Autocompletado de Campos: El autocompletado está disponible para los campos: 'origen', 'destino' y 'condición', así como para la Clase de Origen, Tipo de Documento de Origen, Clase de Destino y Tipo de Documento de Destino.
  • Numeración Ordinal: El editor visual permite activar y desactivar la visualización de los números ordinales y la expresión del camino completo para cada segmento.
  • Referencias Fáciles: Cuando un campo en el Editor de Acción está enfocado, al hacer doble clic en un segmento en el Editor Gráfico se inserta la referencia del segmento correspondiente en la posición actual del cursor en el Editor de Acción.
  • Sincronización: Al hacer clic en un elemento en el editor visual, se resalta la fila correspondiente en el editor de acción.

 

📣 LLAMADA A LA ACCIÓN 📣

Si tenéis comentarios, por favor proporcionadlos a través de los siguientes canales:

  • Nuevas Características en toda la Interoperabilidad: Introducid una idea en el portal de ideas o participad en otras ideas en el Portal de Ideas de InterSystems. Para nuevas ideas, añadid la etiqueta "Interoperabilidad" en vuestro post o votad positivamente por las características ya propuestas en la lista.
  • 💻 Comentarios Generales sobre la Experiencia del Usuario en toda la Interoperabilidad: Comentad vuestros comentarios o participad en otros comentarios a continuación.
  • 🗒 Sugerencias/Comentarios sobre Aplicaciones Modernizadas (como se describe arriba): Comentad vuestros comentarios o participad en otros comentarios a continuación.

¡Considerad completar la oportunidad de Global Master's para interactuar con el equipo en una sesión de retroalimentación guiada privada y ganar puntos! ¡Inscribíos en estas sesiones a través de Global Masters >> aquí!

Si queréis proporcionar comentarios adicionales de manera privada, por favor enviad vuestros pensamientos o preguntas a: ux@intersystems.com.

ディスカッション (0)1
続けるにはログインするか新規登録を行ってください
質問
· 2025年4月1日

S3

Hi Guys,

Not sure what I'm missing here, I'm using to download files that starts with MTC_88 from S3 bucket using AmazonS3 inboundAdapter as below, but I'm not getting anything and I'm sure there thousands of files that starts with MTC_88 

 

 

 

and the log is not getting any errors?

 

Thanks

2 Comments
ディスカッション (2)2
続けるにはログインするか新規登録を行ってください
ダイジェスト
· 2025年4月1日

Resumen de la Comunidad de Desarrolladores de InterSystems, marzo 2025

¡Hola!

¿No habéis podido entrar en la Comunidad todo lo que queríais este mes? ¡No pasa nada! Os traemos un resumen de este mes de marzo.

Estadísticas generales
✓ publicaciones nuevas:
 18 artículos
 12 anuncios
 1 nueva pregunta
Top 10 publicaciones populares
Uso de OpenEHR con InterSystems IRIS
Por Jose-Tomas Salvador
Presentación del adaptador UDP
Por Jose-Tomas Salvador
Top autores populares
Todos los artículos
#InterSystems IRIS
Evitad usar el paquete llamado «code» con métodos python incrustados usando [Language = python].
Por Ricardo Paiva
Plugin moderno y fácil de usar para VSCode de InterSystems ObjectScript: Visualización de diagramas de clases con PlantUML
Por Jinyao
QuinielaML - Predicción de la 48ª jornada de la Quiniela
Por Luis Angel Pérez Ramos
Presentación del adaptador UDP
Por Jose-Tomas Salvador
Embedded Python VS ObjectScript - Prueba de rendimiento parseando XML
Por Luis Angel Pérez Ramos
Cómo mostrar %Error de estado en la Terminal o ¡Tengamos un nuevo y útil alias de terminal!
Por Luis Angel Pérez Ramos
¿Problemas conectando tu Visual Studio Code con tu instancia de IRIS a través del WebGateway? ¡Pues aquí tienes unos consejos!
Por Luis Angel Pérez Ramos
Volver a lo básico: ¿Por qué InterSystems?
Por Ricardo Paiva
Ollama AI con IRIS
Por Rodolfo Pscheidt
SQLAchemy-iris con la última versión del controlador Python
Por Luis Angel Pérez Ramos
Cómo poner los registros de la aplicación en el ^ERRORS global
Por Jose-Tomas Salvador
Instalar WebTerminal en IRIS 2024.3
Por Pierre-Yves Duquesnoy
QuinielaML - Predicción de la 52ª jornada de la Quiniela
Por Luis Angel Pérez Ramos
 
#Otro
 
#IRIS contest
 
#InterSystems IRIS for Health
 
#Comunidad de Desarrolladores Oficial
 
Todos los anuncios
#InterSystems IRIS
 
#Comunidad de Desarrolladores Oficial
 
#Otro
 
#IRIS contest
 
Todas las preguntas
#InterSystems IRIS
 
marzo, 2025Month at a GlanceInterSystems Developer Community