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.

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.
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:
| Brazo | Configuración |
|---|---|
| A | sin recuperación de ejemplos |
| B | ejemplos reales, búsqueda por similitud de texto (pg_trgm) |
| C | ejemplos reales y sintéticos, pg_trgm |
| D | ejemplos 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
| Backend | NestJS · Prisma · unas 22 migraciones, una por incremento funcional |
|---|---|
| Datos | PostgreSQL · pg_trgm · pgvector |
| IA | Ollama (modelo local) · recuperación de ejemplos (RAG) |
| Frontend | Angular 20: formulario ciudadano y bandeja del analista |
| Despliegue | Docker 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ó.