Detectar errores ocultos: Cómo cree un agente de detección de duplicados para el programa de VIH de Kenia
Hackatón de Elasticsearch Agent Builder
.png)
En muchos departamentos de salud del condado de Kenia, los oficiales de monitoreo y evaluación (M&E) pueden pasar días enteros ejecutando tablas dinámicas de Excel, evaluando los nombres de los pacientes y haciendo referencias cruzadas de identificaciones de muestras y aun así solo detectar alrededor del 44 % de los duplicados. El otro 56 % permanece en el sistema silenciosamente, inflando los paneles del Plan de Emergencia para el Alivio del SIDA (PEPFAR) del presidente de los Estados Unidos, desperdiciando reactivos y reduciendo la confianza en los datos que los médicos utilizan para tomar decisiones de tratamiento.
Esto lo sé porque lo veo en el trabajo. Soy arquitecto de soluciones en una empresa de tecnología de la salud en Nairobi. Desarrollamos y mantenemos sistemas de información de salud desplegados en los 47 condados de Kenia. Los registros duplicados de pacientes son ese tipo de problema que nadie incluye en una presentación, pero que todos notan en la práctica.
Cuando se anunció el Hackathon de Elasticsearch Agent Builder, no tuve que ir a buscar un problema. El problema había estado en mi escritorio durante meses.
Cómo ocurren los duplicados (y por qué son difíciles de detectar)
La infraestructura de pruebas de VIH de Kenia ejecuta dos pruebas de laboratorio críticas: Diagnóstico temprano del lactante (EID) para bebés expuestos al VIH y monitoreo de carga viral (VL) para adultos que reciben tratamiento antirretroviral. Las pruebas se solicitan a través de KenyaEMR, se procesan en los laboratorios y los resultados se transmiten a través de la red de intercambio de información de salud de Kenia.
Los escenarios de duplicación son poco atractivos y costosos: una madre lleva a su bebé al centro A, luego se hace la prueba nuevamente en el centro B con un nombre ligeramente diferente; un adulto en tratamiento antirretroviral cruza las fronteras del condado y se vuelve a registrar; alguien usa deliberadamente datos demográficos inconsistentes para acceder a servicios en múltiples sitios.
Cada escenario crea un registro duplicado. Multiplica eso por más de 500 centros y los números se vuelven reales: aproximadamente $195 000 por año en pruebas duplicadas, reactivos desperdiciados e informes inflados. La detección manual tarda aproximadamente dos horas por caso. A ese ritmo, el retraso no hace más que crecer.
Quería algo que pudiera escanear 1000 registros en segundos y explicar su razonamiento en un lenguaje que un trabajador de la salud pudiera entender y actuar en consecuencia.
El sistema: 3 agentes cada uno con un trabajo específico
Desarrollé un sistema multiagente en Elasticsearch 8.11 (Serverless) usando Elastic Agent Builder con Claude Sonnet 3.7 como modelo de razonamiento. En lugar de un agente monolítico tratando de hacer todo, dividí el trabajo en tres agentes: el agente de detección, el evaluador de riesgos y el recomendador de acciones. Cada uno tiene un ámbito de aplicación limitado, datos de entrada específicos y un formato de salida definido.
El agente de detección
El agente de detección ejecuta búsquedas ES|QL en el índice de pacientes y busca duplicados a través de tres lentes: coincidencia de patrones entre centros (mismo paciente que aparece en múltiples centros), análisis demográfico (p. ej., variaciones de nombre, identificadores de sexo inconsistentes y coincidencias parciales de ID) y detección de anomalías temporales (pruebas el mismo día en centros distantes). Esta es la capa de búsqueda: presenta candidatos; no hace juicios.
El evaluador de riesgos
El evaluador de riesgos toma esos candidatos y los califica de 0 a 100 utilizando señales ponderadas:
- Visitas entre centros: Hasta 40 puntos
- Inconsistencias demográficas: Hasta 30 puntos
- Imposibilidades geográficas: Hasta 20 puntos
- Anomalías de tiempo: Hasta 10 puntos
Los casos se sitúan en uno de cuatro niveles: CRÍTICO, ALTO, MEDIO o BAJO. En un momento explicaré por qué no usé la clasificación binaria.
El recomendador de acciones
El recomendador de acciones traduce los puntajes en próximos pasos específicos calibrados para el contexto de atención médica de Kenia: revisión inmediata del oficial M&E para casos CRÍTICOS, marcado para la próxima visita al centro para MEDIO y recomendaciones de capacitación del personal para centros que muestran patrones sistémicos. Este agente existe porque una puntuación de riesgo por sí sola no es útil para un trabajador de salud. Necesitan saber qué hacer con él.
¿Por qué utilicé la puntuación multifactorial en lugar de la clasificación binaria?
Al principio del desarrollo, intenté un enfoque más simple: duplicado o no duplicado. Pero no funcionó con datos reales.
El problema es que las pruebas de seguimiento válidas se parecen mucho a los duplicados. Se supone que un paciente con tratamiento antirretroviral debe presentarse en el mismo centro cada pocos meses. Un bebé debe hacerse la prueba repetidamente. La clasificación binaria marcará demasiadas visitas válidas (y los trabajadores de la salud aprenden a ignorar todas las marcas) o pasa por alto los casos sutiles en los que alguien realiza pruebas en dos centros diferentes el mismo día con nombres ligeramente diferentes.
El enfoque por niveles permite que el personal de salud priorice. Un caso CRÍTICO con un puntaje de riesgo de 87 (pruebas el mismo día, diferentes centros e identificadores de género inconsistentes) recibe atención inmediata. Un caso de riesgo BAJO con una puntuación de 22 (mismo centro e intervalo de seguimiento esperado) se archiva. El oficial de M&E toma la decisión final, pero se basa en la evidencia y no en la intuición.
Calibrar las ponderaciones requirió muchas iteraciones con datos reales. Todavía no estoy del todo seguro de que sean óptimas. Pero la estructura es la correcta, y las ponderaciones se pueden ajustar a medida que recopilemos más datos de campo.
El trabajo de Elasticsearch que lo hizo posible
Dediqué más tiempo inicial al diseño del índice que a cualquier otra parte del sistema, y fue la mejor inversión que hice.
Los mappings del índice incluyen campos derivados que se calculan en el momento de la indexación: cross_facility_flag, total_tests y facility_count por paciente. Los campos demográficos clave tienen subcampos tanto de palabra clave (coincidencia exacta) como de texto (analizado, búsqueda aproximada), así que el agente de detección puede cambiar entre la coincidencia estricta y la aproximada según la señal que esté rastreando: coincidencia estricta para los ID de muestra y coincidencia aproximada para los nombres de pacientes, donde "Wanjiku" y "Wanjiku Mary" podrían ser la misma persona.
También recurrí mucho a las agregaciones de Elasticsearch para el prefiltrado de candidatos. El sistema agrupa registros por centro, tipo de prueba y rango de fechas antes de ejecutar comparaciones por pares. Esto es lo que hace que la detección sea manejable en sets de datos más grandes. No es necesario comparar cada registro con todos los demás si puedes reducir primero el espacio de candidatos.
ES|QL era algo nuevo para mí. Lo aprendí durante el hackathon, y es excelente para análisis en tiempo real a gran escala. La arquitectura que mejor funcionó fue combinar ES|QL para la detección de patrones y las agregaciones con Python para manejar la lógica de la aplicación. Teniendo en cuenta que era nuevo en esto, esta separación me facilitó mucho entender cómo funcionaba todo el sistema.
Lo que los agentes realmente encontraron
Probé el sistema en 1010 registros de pacientes reales anonimizados de 59 centros de salud kenianos. El escaneo se completó en menos de 10 segundos.
Identificó 131 pacientes duplicados, incluyendo cinco casos de pruebas en múltiples instalaciones el mismo día y cuatro pacientes con identificadores de sexo intencionalmente inconsistentes entre instalaciones.
Los casos del mismo día son los que más me sorprendieron. Con una revisión manual, al final se acabarían detectando los nombres duplicados si alguien tuviera la paciencia suficiente. Pero darse cuenta de que un paciente se hizo la prueba en dos centros el mismo día, geográficamente distantes y con datos demográficos ligeramente diferentes, es el tipo de patrón que permanece oculto en los datos hasta que lo buscas específicamente. Los responsables de M&E me dijeron que esos casos habrían tardado semanas en salir a la luz de forma manual, si es que se detectaban.
El aprendizaje que no esperaba: la explicabilidad es el producto
Los primeros prototipos arrojaron un puntaje de riesgo y una recomendación. Se los mostré a los responsables de seguimiento y evaluación, pero no confiaron en los datos de salida.
Esto no fue un fallo técnico; los puntajes eran precisos. Pero un trabajador de la salud que mira a un paciente marcado necesita entender por qué fue marcado antes de que actúe en consecuencia: ¿es la falta de coincidencia de nombres? ¿la imposibilidad geográfica? ¿el momento? Sin ese contexto, el sistema es una caja negra, y las cajas negras son ignoradas en entornos clínicos donde lo que está en juego es el tratamiento de un paciente.
Desarrollar el recomendador de acciones para producir explicaciones específicas, citadas por evidencia, fue lo que convirtió al prototipo en algo que realmente se usaría. El oficial de M&E al que le hice una demostración en Nairobi dijo: «Esto me habría ahorrado tres días el mes pasado».
Esa lección no es exclusiva del sector sanitario. Si las recomendaciones de tu sistema de IA requieren que un humano actúe, la explicación es tanto el producto como la recomendación.
Cómo seguir correctamente las instrucciones del agente
Cada agente se construyó en Elastic Agent Builder con instrucciones personalizadas que definían su experiencia en el dominio, pasos de razonamiento y formato de salida. Subestimé la importancia que tendría la calidad de esas instrucciones.
Las primeras versiones con instrucciones vagas producían datos de salida inconsistentes. El agente de detección a veces explicaba su razonamiento y a veces no. El evaluador de riesgos ocasionalmente omitía un factor de puntaje. Para obtener datos de salida confiables y basados en pruebas, era necesario definir con precisión los campos de información necesarios y explicar claramente la cadena de razonamiento que debía seguir el agente. Trata las instrucciones personalizadas como código: Sé preciso, prueba los casos límite e itera.
¿Qué sigue?
Esto no es una demostración de hackathon que se archiva. El plan se pondrá a prueba en cinco centros del condado de Nairobi durante los próximos 2–3 meses, se capacitará a los responsables de M&E y se recopilarán datos de rendimiento en condiciones reales para ajustar las ponderaciones de riesgo.
Después de eso, el roadmap incluye la integración de coincidencia biométrica y la coincidencia aproximada de nombres fonéticos swahili, que es una brecha real en los enfoques actuales (" Wanjiku " versus " Wanjiku " es fácil. "#Njeri" versus "Njery" requiere conciencia fonética de que la coincidencia aproximada estándar no se maneja bien). Eventualmente, quiero que el sistema funcione en tiempo real durante el registro de pacientes en HMIS, y que detecte duplicados antes de que ingresen al sistema y no después.
A más largo plazo, quiero conectarme al Intercambio de Información de Salud de Kenia y escalarlo a los 47 condados. Gracias al escalado horizontal de Elasticsearch y al diseño modular de los agentes, no hace falta volver a desarrollar el sistema núcleo; solo se necesitan extensiones. El impacto proyectado a nivel nacional: $195 000 de ahorro anual y una reducción del 70 % en las pruebas duplicadas. Más importante aún, los médicos pueden confiar en los registros que están viendo al tomar decisiones de tratamiento.
La conclusión
Si trabajas en un dominio donde la calidad de los datos es un problema silencioso, costoso y de trabajo humano, Elastic Agent Builder te permite crear algo que explica el problema, en lugar de simplemente realizar búsquedas, con herramientas como ES|QL para la detección de patrones, la orquestación multiagente para el análisis en niveles y las instrucciones personalizadas para el razonamiento específico del dominio. Esto se concretó más rápido de lo que esperaba.
La parte más satisfactoria de este desarrollo no fue la ubicación. Fue ver a alguien que hace este trabajo todos los días reconocer en solo diez segundos que la herramienta entendió su problema.
El momento del lanzamiento de cualquiera de las características o funcionalidades descritas en esta publicación queda a exclusivo criterio de Elastic. Es posible que algunas características o funcionalidades que no estén disponibles en este momento no se lancen a tiempo o no se lancen en absoluto.
En esta publicación del blog, es posible que hayamos usado o nos hayamos referido a herramientas de AI generativa de terceros, que son propiedad de sus respectivos propietarios y están gestionadas por ellos. Elastic no tiene ningún control sobre las herramientas de terceros y no tenemos ninguna responsabilidad por su contenido, operación o uso, ni por ninguna pérdida o daño que pueda surgir de tu uso de dichas herramientas. Ten cuidado al usar herramientas de AI con información personal, sensible o confidencial. Cualquier dato que envíes puede usarse para el entrenamiento de la AI u otros fines. No se garantiza que la información que proporciones se mantenga segura o confidencial. Debes familiarizarte con las prácticas de privacidad y los términos de uso de cualquier herramienta de IA generativa antes de usarla.
Elastic, Elasticsearch y las marcas asociadas son marcas comerciales, logotipos o marcas comerciales registradas de Elasticsearch B.V. en los Estados Unidos y otros países. Todos los demás nombres de empresas y productos son marcas comerciales, logotipos o marcas comerciales registradas de sus respectivos dueños.