Try it free in the sandbox · first FHIR call in 5 minutesFree · 30 synthetic patients · no card
Motor de Síntomas Anpheros: metodología
Cómo los síntomas en texto libre en cualquier idioma se convierten en conceptos ICD-10 e ICD-11 de la OMS: el normalizador de IA, detección de presencia y experimentador, el vocabulario verificado por la OMS, resultados de evaluación, coincidencia de casos similares y límites.
El Anpheros Symptom Engine transforma lo que una persona escribe sobre cómo se siente, en sus propias palabras e idioma, en conceptos clínicos internacionales: un identificador estable de Anpheros, un código ICD-10 de la OMS, un código ICD-11 de la OMS y un sistema corporal, junto con si el síntoma está presente, resuelto, hipotético o sobre otra persona. Se ejecuta en producción detrás de Anpheros Daily, publica sus resultados como Observaciones HL7 FHIR R4 en Anpheros Platform y expone la misma terminología a cualquier aplicación a través de una API REST y FHIR. Esta página describe cómo funciona, cómo se verificó, qué mide y cuáles son sus límites.
De un vistazo
| Conceptos | 274 (197 síntomas, 77 hallazgos), identificadores SYM-0001…, nunca reutilizados |
| Clasificaciones | WHO ICD-10 (Versión 2019) y WHO ICD-11 MMS (2025-01), con la equivalencia de cada mapeo |
| Sistemas corporales | 13, tomados de los bloques del capítulo 21 de la ICD-11 (nervioso, digestivo, respiratorio, piel…) |
| Idiomas | nombres en 20 idiomas; texto libre en el idioma propio de la persona |
| Señales de advertencia | 32, para 14 conceptos, citadas palabra por palabra de CDC y NIDDK |
| Evaluación del normalizador | 5 idiomas (rumano, inglés, español, alemán, francés): código primario 97.5–100 %, presencia y sujeto 92.5–98 %, síntomas negados reportados como presentes 0 % en cada idioma |
| Revisión clínica | ninguna hasta ahora: clinical_review: false en cada respuesta |
| Estándares | HL7 FHIR R4 (CodeSystem, ValueSet, ConceptMap, Observation), ICD-10, ICD-11, LOINC para resultados de laboratorio |
1. El pipeline
Un síntoma pasa por cuatro pasos. El texto de la persona nunca se modifica; cada paso añade datos junto a él.
- Captura. La entrada bruta se almacena tal como se escribió, junto con el momento en que se anotó, la zona horaria del teléfono, el idioma y, opcionalmente, la intensidad (1-10), el inicio y el fin. Nada posterior lo reescribe.
- Normalización (IA). Un modelo de lenguaje grande (Google Gemini en Vertex AI) lee el texto y devuelve, para cada síntoma que menciona: un código ICD-10 primario, códigos secundarios opcionales, una etiqueta corta y dos atributos, afirmación (presente, ausente, resuelto, hipotético, incierto) y sujeto (la persona u otra persona). El modelo solo puede elegir códigos del vocabulario de Anpheros; cualquier otra respuesta, una entrada omitida o un código primario no válido cuenta como un intento fallido, nunca como "síntoma desconocido".
- Mapeo de conceptos (determinista). El código ICD-10 se mapea al concepto de Anpheros y, a partir de él, a ICD-11 y al sistema corporal. Este paso utiliza tablas fijas, no IA, por lo que el mismo código siempre da el mismo concepto.
- Publicación. Solo los síntomas que están presentes y son sobre la persona se convierten en Observaciones FHIR en el registro de la persona, y solo después de que la normalización tenga éxito. Si una edición posterior o una renormización cambian eso, la Observación se retira; el historial de versiones permanece.
2. Presencia, tiempo y experimentador
El texto clínico a menudo menciona síntomas que la persona no tiene. El procesamiento del lenguaje natural clínico llama a esto detección de negación, temporalidad y experimentador (la familia de métodos NegEx y ConText). El motor maneja las mismas tres preguntas con los atributos de aserción y sujeto del modelo:
| Escrito | Aserción / sujeto | ¿Publicado como síntoma de la persona? |
|---|---|---|
| "He tenido dolor de cabeza desde el martes" | presente / yo | sí |
| "ya no me duele la cabeza" | resuelto / yo | no |
| "podría tener fiebre mañana" | hipotético / yo | no |
| "mi madre tiene tos" | presente / otro | no |
La queja de un familiar nunca se convierte automáticamente en historial familiar.
3. El vocabulario y cómo se verificó
El vocabulario cubre el capítulo XVIII de la CIE-10 (R00–R94, y desde la versión 2026.10.3 sus subcategorías no residuales como R06.0 disnea) y, donde la OMS clasifica un síntoma en otro capítulo, el código de la OMS: estreñimiento K59.0, tinnitus H93.1, visión doble H53.2, visión borrosa H53.8, picazón L29.9, dolor articular M25.5, dolor de espalda M54, problemas de sueño G47.
- CIE-10. Cada código y título en inglés se verificó contra el navegador de la CIE-10 Versión 2019 de la OMS, incluidas las notas de inclusión y exclusión de cada código. Donde las notas movieron un síntoma a otro lugar (por ejemplo, R19.4 excluye el estreñimiento), el vocabulario siguió a la OMS.
- CIE-11. Cada concepto se mapea a un código CIE-11 MMS 2025-01 tomado de la Tabla de Tabulación Simple de la OMS y se compara con la tabla oficial de mapeo CIE-10 → CIE-11 de la OMS. El motor utiliza el código de síntoma del capítulo 21 en lugar de un código de enfermedad (dolor de cabeza → MB4D, no 8A8Z "trastornos del dolor de cabeza"); cada una de las 21 desviaciones de la tabla estadística de la OMS se enumera con su motivo en el archivo de lanzamiento. 67 mapeos son equivalentes, el resto se marcan como más amplios, más estrechos o inexactos.
- Opciones documentadas. "Migraña" escrita por una persona se codifica como dolor de cabeza (R51), y diarrea no especificada como R19, porque los códigos alternativos de la OMS (G43, A09) son diagnósticos; el motor registra los síntomas informados, no los diagnósticos.
- Traducciones. Los nombres en inglés son los títulos de la OMS. Los nombres en 18 idiomas más son traducciones automáticas revisadas término por término, con asistencia de IA, contra los títulos de la OMS (
review: ai_reviewed); cinco se reescribieron en cada idioma donde el significado no coincidía con el código. Ningún traductor médico profesional los ha revisado todavía. - Señales de advertencia. Citadas palabra por palabra, nunca parafraseadas, de páginas de dominio público de los CDC (accidente cerebrovascular, ataque cardíaco) y NIDDK (diarrea, estreñimiento), cada una con su fuente, licencia y la nota de que no es un diagnóstico. Donde una cita dice 9-1-1, la nota agrega el 112 europeo.
4. Evaluación
El normalizador se evalúa en un conjunto fijo de 100 casos sintéticos escritos en rumano (el idioma de la mayoría de los usuarios actuales), cada uno con el código primario, la afirmación y el sujeto esperados. 32 de los casos no están presentes deliberadamente: negados, resueltos, hipotéticos, inciertos o sobre otra persona. Resultados con el prompt actual (versión 3, 15 de octubre de 2026):
| Métrica | Resultado | Objetivo |
|---|---|---|
| Código primario correcto | 100 % | ≥ 85 % |
| Afirmación y sujeto ambos correctos | 98 % | — |
| Síntomas negados reportados como presentes | 0 % | ≤ 3 % |
Los dos errores fueron entradas administrativas ("una cita con el cardiólogo el martes", "quiero perder 5 kg") clasificadas como hipotéticas en lugar de presentes; ninguna de ellas es un síntoma. El conjunto de pruebas no ha sido revisado por un clínico, por lo que las puntuaciones son indicativas.
Otros idiomas (16 de octubre de 2026). 40 de los casos, que cubren todas las categorías, se tradujeron al inglés, español, alemán y francés, con las mismas respuestas esperadas; los casos informales se reescribieron en el estilo informal propio de cada idioma. Las instrucciones para el modelo se mantuvieron iguales.
| Idioma | Casos | Código primario | Presencia y sujeto | Negados reportados como presentes |
|---|---|---|---|---|
| Rumano | 100 | 100 % | 98 % | 0 % |
| Inglés | 40 | 100 % | 97.5 % | 0 % |
| Español | 40 | 97.5 % | 92.5 % | 0 % |
| Alemán | 40 | 100 % | 97.5 % | 0 % |
| Francés | 40 | 100 % | 95 % | 0 % |
La mayoría de los errores restantes son las mismas entradas administrativas ("cita con el cardiólogo el martes", "chequeo, todo bien") o una elección entre dos estados no presentes ("sin fiebre hoy" como resuelto en lugar de ausente); ninguno de ellos publica un síntoma. La única diferencia de codificación fue en español "escalofríos y malestar" codificado como malestar (R53) con escalofríos (R68) como código secundario, en lugar de al revés.
Los nombres que se muestran a las personas siguen su idioma: la aplicación muestra el nombre del concepto en el idioma del usuario (nombre común primero) y la nota de presencia ("resuelto", "otra persona") en los 20 idiomas de la aplicación.
En producción (16 de octubre de 2026), después de que el vocabulario se verificara contra la OMS, cada síntoma almacenado se normalizó de nuevo. En los registros de usuarios reales: todos los síntomas normalizados, 0 síntomas presentes quedaron como "inciertos", y 0 síntomas que no están presentes se publicaron como propios de la persona (auditoría independiente de las Observaciones publicadas).
5. Casos similares (en desarrollo)
El siguiente componente compara personas por sus síntomas y resultados de laboratorio anómalos, para sugerir, solo con consentimiento explícito, personas que reportan algo muy similar.
- Perfil. Síntomas presentes, autoinformados de los últimos 90 días por concepto Anpheros, y resultados de laboratorio de los últimos 180 días fuera del rango de referencia impreso por el laboratorio, por código LOINC. Los perfiles son independientes del idioma y el país: un informe de laboratorio en rumano y uno en inglés se mapean al mismo código LOINC.
- Puntuación. Un índice Jaccard ponderado: signos compartidos sobre todos los signos de ambas personas. Los síntomas muy comunes (dolor de cabeza, dolor abdominal, fatiga, fiebre, tos, mareos...) pesan 0.25, los síntomas específicos 1, un resultado de laboratorio anómalo 1.5. A partir de 50 participantes, los pesos también se escalan según la rareza de un signo en la población (frecuencia inversa de documento). Dos signos diferentes en el mismo sistema corporal obtienen crédito parcial.
- Regla. Un par solo se considera con al menos tres síntomas específicos compartidos, o dos más un resultado de laboratorio anómalo compartido: las quejas comunes por sí solas nunca hacen que dos personas sean "similares". Se ofrece una invitación a partir de una puntuación de 0.70; la persona ve casos similares a partir de 0.80.
- Privacidad. Solo titulares de cuentas adultas, consentimiento explícito (RGPD Art. 9), revocable en cualquier momento con eliminación inmediata. Una persona ve recuentos y los signos compartidos, nunca quiénes son los demás.
No sugiere un diagnóstico ni una enfermedad.
6. Cómo lo usan las aplicaciones
- Anpheros Daily (iOS, Android, Mac, web): cada síntoma que una persona anota pasa por el proceso anterior; la persona puede ver y corregir el resultado.
- Anpheros Platform: los síntomas se almacenan como FHIR
Observations con categoríaurn:anpheros:observation-category|symptom, tanto códigos como el texto propio de la persona. Cualquier aplicación con el consentimiento de la persona puede leerlos. - Tu aplicación: busca conceptos con
GET /v1/terminology/symptoms, expande el FHIRValueSet, traduce códigos con losConceptMaps a ICD-10 e ICD-11, y valida Observaciones contra el perfilanpheros-symptom. Consulta la API de datos de síntomas para ver solicitudes y respuestas. - Asistentes y agentes de IA leen los mismos datos estructurados a través de la API de contexto en lugar de texto libre, por lo que sus respuestas pueden citar códigos.
7. Límites
- El motor nombra y codifica síntomas; no diagnostica, clasifica causas ni vincula síntomas a enfermedades.
- Ningún clínico ha revisado aún el vocabulario, las traducciones o las señales de advertencia.
- Los conjuntos de evaluación son sintéticos; 15 de los 20 idiomas aún no tienen un conjunto de evaluación.
- ICD-11 tiene licencia de la OMS bajo CC BY-ND 3.0 IGO; los códigos y títulos se reproducen sin cambios.
Relacionado
- API de datos de síntomas: conceptos, terminología FHIR y síntomas reportados por el paciente
- Anpheros Search: los mismos síntomas junto con condiciones y tratamientos en un catálogo público, cada entrada con sus fuentes
- Sistemas de códigos FHIR
- API de datos longitudinales del paciente
Try it free in the sandbox · first FHIR call in 5 minutesFree · 30 synthetic patients · no card