# Anpheros Symptom Engine: metodologia

> Jak swobodny tekst opisujący objawy w dowolnym języku staje się koncepcjami WHO ICD-10 i ICD-11: normalizator AI, wykrywanie obecności i doświadczającego, słownik sprawdzony przez WHO, wyniki oceny, dopasowywanie podobnych przypadków i ograniczenia.

Source: https://developers.anpheros.com/pl/guides/symptom-engine

**Anpheros Symptom Engine przekształca to, co osoba pisze o swoich odczuciach, własnymi słowami i językiem, w międzynarodowe koncepcje kliniczne: stabilny identyfikator Anpheros, kod WHO ICD-10, kod WHO ICD-11 i system ciała, wraz z informacją, czy objaw jest obecny, ustąpił, jest hipotetyczny czy dotyczy kogoś innego. Działa w produkcji za Anpheros Daily, publikuje swoje wyniki jako obserwacje HL7 FHIR R4 na Anpheros Platform i udostępnia tę samą terminologię każdej aplikacji za pośrednictwem API REST i FHIR.** Ta strona opisuje, jak działa, jak został sprawdzony, co mierzy i jakie są jego ograniczenia.

## W skrócie

| | |
|---|---|
| Koncepcje | 274 (197 objawów, 77 wyników), identyfikatory `SYM-0001`…, nigdy nie są ponownie używane |
| Klasyfikacje | WHO ICD-10 (Wersja 2019) i WHO ICD-11 MMS (2025-01), z równoważnością każdego mapowania |
| Układy organizmu | 13, zaczerpnięte z bloków rozdziału 21 ICD-11 (nerwowy, trawienny, oddechowy, skóra…) |
| Języki | nazwy w 20 językach; tekst swobodny w języku osoby |
| Objawy ostrzegawcze | 32, dla 14 koncepcji, cytowane słowo w słowo z CDC i NIDDK |
| Ocena normalizatora | 5 języków (rumuński, angielski, hiszpański, niemiecki, francuski): kod podstawowy 97,5–100 %, obecność i podmiot 92,5–98 %, objawy zaprzeczone zgłoszone jako obecne 0 % w każdym języku |
| Przegląd kliniczny | jeszcze brak: `clinical_review: false` w każdej odpowiedzi |
| Standardy | HL7 FHIR R4 (`CodeSystem`, `ValueSet`, `ConceptMap`, `Observation`), ICD-10, ICD-11, LOINC dla wyników laboratoryjnych |

## 1. Potok przetwarzania

Objaw przechodzi przez cztery etapy. Tekst wprowadzony przez użytkownika nigdy nie jest zmieniany; każdy etap dodaje dane obok niego.

1.  **Przechwytywanie.** Surowe dane wejściowe są przechowywane w postaci, w jakiej zostały zapisane, wraz z momentem ich odnotowania, strefą czasową telefonu, językiem oraz opcjonalnie natężeniem (1–10), początkiem i końcem. Żaden kolejny etap przetwarzania ich nie nadpisuje.
2.  **Normalizacja (AI).** Duży model językowy (Google Gemini na Vertex AI) odczytuje tekst i zwraca dla każdego wymienionego objawu: główny kod ICD-10, opcjonalne kody dodatkowe, krótki opis oraz dwa atrybuty: *stwierdzenie* (obecny, nieobecny, rozwiązany, hipotetyczny, niepewny) i *podmiot* (osoba, o której mowa, lub ktoś inny). Model może wybierać kody tylko ze słownika Anpheros; każda inna odpowiedź, pominięte pole lub nieprawidłowy kod główny jest traktowany jako nieudana próba, nigdy jako „nieznany objaw”.
3.  **Mapowanie koncepcji (deterministyczne).** Kod ICD-10 jest mapowany na koncepcję Anpheros, a z niej na ICD-11 i system ciała. Ten etap wykorzystuje stałe tabele, a nie AI, więc ten sam kod zawsze daje tę samą koncepcję.
4.  **Publikacja.** Tylko objawy, które są **obecne** i **dotyczą osoby**, stają się obserwacjami FHIR w rekordzie osoby, i to tylko po pomyślnej normalizacji. Jeśli późniejsza edycja lub ponowna normalizacja to zmieni, obserwacja zostanie wycofana; historia wersji pozostaje.

## 2. Obecność, czas i podmiot

Tekst kliniczny często wspomina o objawach, których dana osoba nie ma. Kliniczne przetwarzanie języka naturalnego nazywa to wykrywaniem *negacji*, *temporalności* i *podmiotu* (rodzina metod NegEx i ConText). Silnik obsługuje te same trzy pytania za pomocą atrybutów *assertion* i *subject* modelu:

| Zapis | Assertion / subject | Opublikowano jako objaw pacjenta? |
|---|---|---|
| "I've had a headache since Tuesday" | present / self | yes |
| "my head doesn't hurt any more" | resolved / self | no |
| "I might get a fever tomorrow" | hypothetical / self | no |
| "my mother has a cough" | present / other | no |

Skarga krewnego nigdy nie jest automatycznie przekształcana w historię choroby rodziny.

## 3. Słownictwo i sposób jego weryfikacji

Słownictwo obejmuje rozdział XVIII ICD-10 (R00–R94, a od wersji 2026.10.3 także jego podkategorie inne niż resztkowe, takie jak R06.0 duszność) oraz, w przypadkach gdy WHO klasyfikuje objaw w innym rozdziale, kod WHO: zaparcie K59.0, szum w uszach H93.1, podwójne widzenie H53.2, niewyraźne widzenie H53.8, swędzenie L29.9, ból stawów M25.5, ból pleców M54, problemy ze snem G47.

- **ICD-10.** Każdy kod i angielski tytuł został sprawdzony w przeglądarce WHO ICD-10 Wersja 2019, w tym noty dotyczące włączeń i wyłączeń dla każdego kodu. Tam, gdzie noty przenosiły objaw do innego miejsca (na przykład R19.4 wyklucza zaparcie), słownictwo było zgodne z WHO.
- **ICD-11.** Każda koncepcja jest mapowana do kodu ICD-11 MMS 2025-01 pobranego z WHO Simple Tabulation i porównana z oficjalną tabelą mapowania WHO ICD-10 → ICD-11. Silnik używa kodu objawu z rozdziału 21, a nie kodu choroby (ból głowy → MB4D, a nie 8A8Z "zaburzenia bólu głowy"); każde z 21 odejść od tabeli statystycznej WHO jest wymienione wraz z uzasadnieniem w pliku wydania. 67 mapowań jest równoważnych, pozostałe są oznaczone jako szersze, węższe lub niedokładne.
- **Udokumentowane wybory.** "Migrena" zapisana przez osobę jest kodowana jako ból głowy (R51), a nieokreślona biegunka jako R19, ponieważ alternatywne kody WHO (G43, A09) są diagnozami; silnik rejestruje zgłaszane objawy, a nie diagnozy.
- **Tłumaczenia.** Nazwy angielskie to tytuły WHO. Nazwy w 18 innych językach są tłumaczeniami maszynowymi, recenzowanymi termin po terminie, z pomocą AI, w porównaniu z tytułami WHO (`review: ai_reviewed`); pięć zostało przepisanych w każdym języku, w którym znaczenie nie odpowiadało kodowi. Żaden profesjonalny tłumacz medyczny ich jeszcze nie recenzował.
- **Ostrzeżenia.** Cytowane słowo w słowo, nigdy parafrazowane, ze stron domen publicznych CDC (udar, zawał serca) i NIDDK (biegunka, zaparcie), każde z podanym źródłem, licencją i uwagą, że nie jest to diagnoza. Tam, gdzie cytat zawiera 9-1-1, uwaga dodaje europejski numer 112.

## 4. Ewaluacja

Normalizator jest oceniany na stałym zestwie 100 syntetycznych przypadków napisanych w języku rumuńskim (język większości obecnych użytkowników), każdy z oczekiwanym kodem głównym, stwierdzeniem i podmiotem. 32 z tych przypadków celowo nie występują: są negowane, rozwiązane, hipotetyczne, niepewne lub dotyczą innej osoby. Wyniki z obecnym promptem (wersja 3, 15 października 2026):

| Metryka | Wynik | Cel |
|---|---|---|
| Kod główny poprawny | 100 % | ≥ 85 % |
| Stwierdzenie i podmiot oba poprawne | 98 % | — |
| Negowane objawy zgłoszone jako obecne | 0 % | ≤ 3 % |

Dwa błędy dotyczyły wpisów administracyjnych („wizyta u kardiologa we wtorek”, „chcę schudnąć 5 kg”), sklasyfikowanych jako hipotetyczne zamiast obecne; żaden z nich nie jest objawem. Zestaw testowy nie został przejrzany przez lekarza, więc wyniki są orientacyjne.

**Inne języki (16 października 2026).** 40 przypadków, obejmujących każdą kategorię, zostało przetłumaczonych na angielski, hiszpański, niemiecki i francuski, z tymi samymi oczekiwanymi odpowiedziami; przypadki nieformalne zostały przepisane w nieformalnym stylu każdego języka. Instrukcje dla modelu pozostały takie same.

| Język | Przypadki | Kod główny | Obecność i podmiot | Negowane zgłoszone jako obecne |
|---|---|---|---|---|
| Rumuński | 100 | 100 % | 98 % | 0 % |
| Angielski | 40 | 100 % | 97.5 % | 0 % |
| Hiszpański | 40 | 97.5 % | 92.5 % | 0 % |
| Niemiecki | 40 | 100 % | 97.5 % | 0 % |
| Francuski | 40 | 100 % | 95 % | 0 % |

Większość pozostałych błędów to te same wpisy administracyjne („wizyta u kardiologa we wtorek”, „badanie kontrolne, wszystko w porządku”) lub wybór między dwoma nieobecnymi stanami („brak gorączki dzisiaj” jako rozwiązany zamiast nieobecny); żaden z nich nie publikuje objawu. Jedyna różnica w kodowaniu dotyczyła hiszpańskiego „escalofríos y malestar” (dreszcze i złe samopoczucie) zakodowanego jako złe samopoczucie (R53) z dreszczami (R68) jako kodem dodatkowym, zamiast odwrotnie.

Nazwy wyświetlane użytkownikom są zgodne z ich językiem: aplikacja wyświetla nazwę koncepcji w języku użytkownika (najpierw nazwa potoczna) oraz notatkę o obecności („rozwiązany”, „ktoś inny”) w 20 językach aplikacji.

**W produkcji (16 października 2026)**, po sprawdzeniu słownictwa pod kątem zgodności z WHO, wszystkie przechowywane objawy zostały ponownie znormalizowane. W rekordach rzeczywistych użytkowników: wszystkie objawy znormalizowane, 0 obecnych objawów pozostało jako „niejasne” i 0 objawów, które nie są obecne, opublikowano jako własne dane osoby (niezależny audyt opublikowanych Obserwacji).

## 5. Podobne przypadki (w trakcie rozwoju)

Następny komponent porównuje osoby na podstawie ich objawów i nieprawidłowych wyników badań laboratoryjnych, aby zaproponować, wyłącznie za wyraźną zgodą, osoby zgłaszające coś bardzo podobnego.

- **Profil.** Aktualne, samodzielnie zgłaszane objawy z ostatnich 90 dni według koncepcji Anpheros oraz wyniki badań laboratoryjnych z ostatnich 180 dni poza zakresem referencyjnym wydrukowanym przez laboratorium, według kodu LOINC. Profile są niezależne od języka i kraju: raport laboratoryjny w języku rumuńskim i raport w języku angielskim odpowiadają temu samemu kodowi LOINC.
- **Wynik.** Ważony indeks Jaccarda: wspólne objawy podzielone przez wszystkie objawy obu osób. Bardzo częste objawy (ból głowy, ból brzucha, zmęczenie, gorączka, kaszel, zawroty głowy…) ważą 0,25, specyficzne objawy 1, nieprawidłowy wynik badania laboratoryjnego 1,5. Od 50 uczestników wagi są również skalowane w zależności od rzadkości występowania objawu w populacji (odwrotna częstość dokumentów). Dwa różne objawy w tym samym układzie ciała otrzymują częściowe punkty.
- **Reguła.** Para jest rozważana tylko wtedy, gdy występuje co najmniej trzy wspólne specyficzne objawy lub dwa wspólne objawy plus wspólny nieprawidłowy wynik badania laboratoryjnego: same powszechne dolegliwości nigdy nie sprawiają, że dwie osoby są „podobne”. Zaproszenie jest oferowane od wyniku 0,70; osoba widzi podobne przypadki od 0,80.
- **Prywatność.** Tylko dorośli posiadacze kont, wyraźna zgoda (RODO Art. 9), możliwa do wycofania w dowolnym momencie z natychmiastowym usunięciem. Osoba widzi liczbę i wspólne objawy, nigdy kim są inni.

Nie sugeruje diagnozy ani choroby.

## 6. Jak aplikacje z tego korzystają

- **Anpheros Daily** (iOS, Android, Mac, web): każdy objaw odnotowany przez użytkownika przechodzi przez powyższy potok; użytkownik może zobaczyć i poprawić wynik.
- **Anpheros Platform**: objawy są przechowywane jako FHIR `Observation` z kategorią `urn:anpheros:observation-category|symptom`, zarówno jako kody, jak i tekst wprowadzony przez użytkownika. Każda aplikacja za zgodą użytkownika może je odczytać.
- **Twoja aplikacja**: wyszukuj koncepcje za pomocą `GET /v1/terminology/symptoms`, rozszerzaj FHIR `ValueSet`, tłumacz kody za pomocą `ConceptMap` na ICD-10 i ICD-11 oraz waliduj Obserwacje względem profilu `anpheros-symptom`. Zobacz [Symptom data API](https://developers.anpheros.com/pl/guides/symptom-data-api) dla żądań i odpowiedzi.
- **Asystenci i agenci AI** odczytują te same ustrukturyzowane dane za pośrednictwem [Context API](https://developers.anpheros.com/pl/guides/ai-agents-medical-data) zamiast zwykłego tekstu, dzięki czemu ich odpowiedzi mogą cytować kody.

## 7. Ograniczenia

- Silnik nazywa i koduje objawy; nie diagnozuje, nie szereguje przyczyn ani nie łączy objawów z chorobami.
- Żaden lekarz nie dokonał jeszcze przeglądu słownictwa, tłumaczeń ani znaków ostrzegawczych.
- Zestawy ewaluacyjne są syntetyczne; 15 z 20 języków nie ma jeszcze zestawu ewaluacyjnego.
- ICD-11 jest licencjonowany przez WHO na mocy licencji CC BY-ND 3.0 IGO; kody i tytuły są powielane bez zmian.

## Powiązane

- [API danych o objawach](https://developers.anpheros.com/pl/guides/symptom-data-api): koncepcje, terminologia FHIR i objawy zgłaszane przez pacjentów
- [Anpheros Search](https://developers.anpheros.com/pl/guides/anpheros-search): te same objawy wraz z chorobami i leczeniem w jednym publicznym katalogu, każdy wpis ze swoimi źródłami
- [Systemy kodowania FHIR](https://developers.anpheros.com/pl/guides/fhir-code-systems)
- [API podłużnych danych pacjenta](https://developers.anpheros.com/pl/guides/longitudinal-patient-data-api)
