Proyecto · IA aplicada a salud

YACHAQ 360

Una persona escribe su reclamo de salud en lenguaje natural. El sistema abre un expediente, lo clasifica contra la normativa vigente, le pone un semáforo de prioridad y lo deja en la bandeja del analista que corresponde. La decisión final siempre la toma una persona.

NestJSPrismaPostgreSQLpgvectorOllamaRAGAngular 20Docker
Panel de atención ciudadana de YACHAQ 360 para reclamos de salud

El problema

Una superintendencia de salud recibe consultas, reclamos y denuncias escritos como cada persona sabe escribirlos. Alguien tiene que leer cada uno, decidir de qué trata según la norma y cuánto urge, y mandarlo al área correcta. YACHAQ 360 se desarrolló para un concurso de innovación de SUSALUD, el regulador de salud de Perú, y ataca ese primer filtro.

Mi rol

Desarrollador y líder del proyecto: definición funcional, arquitectura, desarrollo de frontend, backend, base de datos y automatizaciones, la clasificación asistida por IA con su priorización y la preparación técnica para el concurso.

Flujo de YACHAQ 360 El reclamo entra por formulario, se convierte en ticket y expediente, lo analiza un modelo local en Ollama apoyado en ejemplos recuperados, se valida contra catálogos normativos, el motor de reglas asigna un semáforo y llega a la bandeja del analista, que decide. Reclamotexto libreformularioAPIExpedienteNestJS · PrismatrazabilidadanálisisModelo localOllama + ejemplospg_trgm · pgvectornormativaReglascatálogossemáforobandejaAnalistaAngular 20decide la persona
Flujo de YACHAQ 360

Lo que más me importa: medirlo bien

Clasificar texto libre con un modelo de lenguaje es fácil de hacer y muy fácil de medir mal. La trampa clásica es que el sistema recupere como «ejemplo similar» el mismo caso que está evaluando, acierte por eso, y el número salga precioso sin significar nada.

Por eso hay un estudio de ablación que compara cuatro configuraciones sobre exactamente los mismos casos, en el mismo orden:

BrazoConfiguración
Asin recuperación de ejemplos
Bejemplos reales, búsqueda por similitud de texto (pg_trgm)
Cejemplos reales y sintéticos, pg_trgm
Dejemplos reales y sintéticos, híbrido pg_trgm + embeddings

Con dos controles que son los que hacen que el resultado valga:

  • Semilla fija en el muestreo. Sin ella, cada ejecución evalúa un subconjunto distinto y los números no se pueden comparar.
  • Los casos evaluados se excluyen del índice por identificador, no por coincidencia de texto. Sin esa exclusión el sistema se encuentra a sí mismo, o a un casi duplicado del mismo expediente.

Un script aparte comprueba que esa fuga no ocurre.

Principios de diseño

  • La IA orienta, no decide. Ningún caso se rechaza automáticamente. En protección de derechos, un falso negativo es una persona que se queda sin atención.
  • Modelo local con Ollama, no una API externa. Los reclamos de salud son datos sensibles y no salen de la infraestructura. Un modelo local rinde menos que uno de frontera, y por eso importa la recuperación de ejemplos.
  • Clasificación anclada a la normativa, contra catálogos derivados de la norma vigente y versionados en migraciones.
  • Todo cambio de estado deja traza. Si alguien pregunta por qué un caso acabó en verde, la respuesta se puede reconstruir.

Stack

BackendNestJS · Prisma · unas 22 migraciones, una por incremento funcional
DatosPostgreSQL · pg_trgm · pgvector
IAOllama (modelo local) · recuperación de ejemplos (RAG)
FrontendAngular 20: formulario ciudadano y bandeja del analista
DespliegueDocker Compose

Limitaciones

  • Es un MVP de concurso, no un sistema en producción.
  • Los catálogos normativos hay que mantenerlos: si cambia la norma, no se adaptan solos.
  • El repositorio no contiene casos reales ni los embeddings derivados de ellos: de un vector se puede reconstruir parte del texto que lo originó.
El CV estará disponible próximamente.