Try it free in the sandbox · first FHIR call in 5 minutesFree · 30 synthetic patients · no card
Dane o lekach dla aplikacji i agentów AI
Listy leków pacjentów a wiedza o lekach: zasoby FHIR, RxNorm, ATC, źródła openFDA i EMA oraz przetestowane połączenie rekordu FHIR z etykietami RxNorm i FDA.
Oprogramowanie medyczne potrzebuje dwóch różnych rodzajów danych dotyczących leków: listy leków pacjenta — co dana osoba przyjmuje, od kiedy, w jakiej dawce, kto to odnotował — oraz wiedzy o lekach — co zawiera produkt, jego oficjalna etykieta, ostrzeżenia i interakcje. Pierwsze należy do dokumentacji pacjenta; drugie pochodzi z autorytatywnych baz danych leków. Pomylenie ich jest przyczyną, dla której agenci AI podają fakty dotyczące leków z pamięci modelu. Ta strona wyjaśnia oba rodzaje danych, zaangażowane zasoby FHIR R4 i systemy kodowania, jakie publiczne źródła istnieją w USA i UE, oraz działający przykład, który łączy listę pacjenta z rekordu FHIR z RxNorm i etykietą FDA.
Dwa rodzaje danych dotyczących leków
| Lista leków pacjenta | Wiedza o lekach | |
|---|---|---|
| Odpowiedzi | Co Ana przyjmuje, od kiedy, jak często? | Czym jest metformina 500 mg, jakie są ostrzeżenia na etykiecie? |
| Zmiany | Kiedy pacjent lub lekarz ją aktualizuje | Kiedy aktualizuje ją organ regulacyjny lub wydawca |
| Znajduje się w | Rekordzie pacjenta (EHR, PHR, serwer FHIR) | Bazy danych leków i terminologie |
| FHIR | MedicationStatement, MedicationRequest, MedicationAdministration, Medication |
Głównie poza rekordem; informacje o produkcie mogą być same w sobie FHIR |
| Kto może to odczytać | Tylko za zgodą pacjenta | Publicznie lub na licencji |
Aplikacja lub agent odpowiadający na pytanie „czy mogę wziąć ibuprofen z moim lekiem na ciśnienie?” potrzebuje obu: listy pacjenta, aby wiedzieć, o jaki lek chodzi, oraz źródła wiedzy o lekach, aby dowiedzieć się, co wiadomo o tej kombinacji — plus lekarza lub farmaceuty, aby uzyskać odpowiedź.
Zasoby FHIR dla listy leków
- MedicationStatement: osoba przyjmuje, przyjmowała lub zaprzestała przyjmowania leku (zgłoszone przez pacjenta lub zarejestrowane przez lekarza). Zwykły zasób dla PHR lub listy uzgodnień.
- MedicationRequest: recepta lub zlecenie.
- MedicationAdministration: podana lub przyjęta (lub pominięta) dawka, przydatna do oceny przestrzegania zaleceń.
- Medication: sam produkt, gdy potrzebne są szczegóły wykraczające poza kod (składniki, postać, partia).
Lek jest kodowany: w USA za pomocą RxNorm (z National Library of Medicine) i kodów produktów NDC; międzynarodowo za pomocą klasyfikacji ATC WHO; w Europie również za pomocą krajowych kodów produktów i, coraz częściej, elektronicznych informacji o produktach EMA opartych na FHIR. Oświadczenie może zawierać kilka kodowań tego samego leku.
Źródła wiedzy o lekach
Stany Zjednoczone
- RxNorm API (NLM): znormalizowane nazwy i identyfikatory (RXCUI) dla leków klinicznych; bezpłatne i, z jednym wyjątkiem, nie wymaga licencji.
- openFDA drug label API (FDA): ustrukturyzowane etykiety produktów — wskazania, ostrzeżenia w ramce, przeciwwskazania, sekcje dotyczące interakcji leków — z możliwością wyszukiwania według RXCUI.
- DailyMed (NLM): te same etykiety do odczytu przez użytkowników.
Unia Europejska
- Europejska Agencja Leków publikuje informacje o produktach dla leków dopuszczonych do obrotu centralnie, a jej elektroniczne informacje o produktach (ePI) są oparte na FHIR. Produkty dopuszczone do obrotu na poziomie krajowym znajdują się w krajowych rejestrach.
- Kody ATC i zdefiniowane dawki dobowe są utrzymywane przez WHO Collaborating Centre for Drug Statistics Methodology.
Interakcje są najtrudniejszą częścią. NLM wycofało swoje API dotyczące interakcji leków z lekami około stycznia 2024 r., a kompleksowe sprawdzanie interakcji opiera się dziś na licencjonowanych bazach wiedzy klinicznej. Sekcja interakcji w etykiecie to tekst napisany dla klinicystów, a nie narzędzie do sprawdzania.
Łączenie rekordu z wiedzą o lekach
Przykład odczytuje aktywne leki pacjenta z Anpheros, rozwiązuje każdą nazwę do koncepcji RxNorm i pobiera etykietę FDA. Został uruchomiony na lokalnej instancji platformy oraz na żywych API RxNorm i openFDA.
import { Anpheros, apiKey } from '@anpheros/sdk';
const anpheros = new Anpheros({ auth: apiKey(process.env.ANPHEROS_KEY!) });
// 1. What the person takes: from their record (ATC codes, names as they were entered)
const { data: meds } = await anpheros.medications.list(patientId, { status: 'active' });
// 2. What each medicine is: RxNorm (US National Library of Medicine), free, no key
async function rxcui(name: string): Promise<string | null> {
const r = await fetch(`https://rxnav.nlm.nih.gov/REST/approximateTerm.json?term=${encodeURIComponent(name)}&maxEntries=1`);
const j: any = await r.json();
const id = j.approximateGroup?.candidate?.[0]?.rxcui;
if (!id) return null;
// An approximate match can be an outdated concept: keep it only if RxNorm still describes it as a drug
const props: any = await (await fetch(`https://rxnav.nlm.nih.gov/REST/rxcui/${id}/properties.json`)).json();
return ['SCD', 'SBD', 'GPCK', 'BPCK'].includes(props.properties?.tty) ? id : null;
}
// 3. What the official label says: openFDA drug label API (US FDA), free
async function label(id: string) {
const r = await fetch(`https://api.fda.gov/drug/label.json?search=openfda.rxcui:%22${id}%22&limit=1`);
if (!r.ok) return null;
const doc: any = (await r.json()).results?.[0];
return doc && { set_id: doc.set_id, boxed_warning: doc.boxed_warning?.[0]?.slice(0, 120), has_interactions_section: !!doc.drug_interactions };
}
for (const m of meds) {
const id = await rxcui(m.display);
console.log(JSON.stringify({ record: { display: m.display, atc: m.code, dosage: m.dosage }, rxnorm: id, fda_label: id ? await label(id) : null }));
}
Wynik dla pacjenta, który zgłosił metforminę i enalapril:
{"record":{"display":"Metformin 500 mg tablet","atc":"A10BA02","dosage":"500 mg twice a day"},"rxnorm":"861007",
"fda_label":{"set_id":"011de1a5-…","boxed_warning":"BOXED WARNING WARNING: LACTIC ACIDOSIS …","has_interactions_section":true}}
{"record":{"display":"Enalapril maleate 10 mg oral tablet","atc":"C09AA02","dosage":"10 mg once a day"},"rxnorm":"858817",
"fda_label":{"set_id":"074fe718-…","boxed_warning":"WARNING: FETAL TOXICITY …","has_interactions_section":true}}
Czego nauczyliśmy się podczas jego uruchamiania. Przy nazwie zapisanej jako "Enalapril 10 mg tablet", przybliżone dopasowanie RxNorm zwróciło RXCUI 328290, koncepcję, której RxNorm już nie opisuje, bez powiązanej etykiety. Przy pełnej nazwie klinicznej, "enalapril maleate 10 mg oral tablet", zwrócono 858817, aktualny lek kliniczny z etykietą. Nazwy wpisywane przez ludzi są przybliżone; sprawdź, do czego dopasowanie się rozwiązuje, przechowuj kod po jego potwierdzeniu i pokaż osobie, co zostało dopasowane.
Zasady dla agentów AI
- Nigdy nie pozwól modelowi dostarczać informacji o lekach z pamięci. Podaj mu listę pacjenta z dokumentacji i odpowiedni tekst z autorytatywnego źródła, a następnie poproś o podanie cytatów.
- Zachowaj oba źródła widoczne. "Przyjmujesz metforminę (Twoje dane, wprowadzone przez Ciebie 3 marca)" i "etykieta FDA ostrzega przed kwasicą mleczanową (etykieta ustawiona 011de1a5…)" to różne twierdzenia z różnymi właścicielami.
- Zawężaj zakresy. Agent, który potrzebuje tylko listy leków, powinien uzyskać dostęp do odczytu
MedicationStatement, a nie do całego rekordu. W przypadku Anpheros jest to zakres zgody lub narzędzia tylko do odczytu serwera MCP. - Nie odpowiadaj na pytania wymagające lekarza. Interakcje, zmiany dawkowania i zaprzestanie przyjmowania leku powinny być kierowane do farmaceuty lub lekarza; agent może przygotować pytanie.
Gdzie Anpheros pasuje
Anpheros przechowuje listę leków: MedicationStatement i MedicationAdministration z kodami ATC lub innymi, kto zarejestrował każdy wpis, historię i zgodę dla innych aplikacji; API kontekstu zawiera aktywne leki w podsumowaniu, które przygotowuje dla modelu, a serwer MCP udostępnia je agentom tylko do odczytu. Zawiera niewielki podzbiór ATC (około 50 popularnych leków), aby automatycznie nazywać kody; każdy inny kod jest akceptowany, bez automatycznej nazwy.
Nie jest to baza danych leków: nie udostępnia etykiet, interakcji, dawkowania ani przeciwwskazań i obecnie nie obsługuje zasobów MedicationRequest ani Medication.
Często zadawane pytania
Którego zasobu FHIR należy użyć do listy leków?
MedicationStatement dla tego, co pacjent przyjmuje lub przyjmował, w tym leków zgłoszonych przez pacjenta. Recepty to MedicationRequest; pojedyncze dawki to MedicationAdministration.
Czy istnieje darmowe API bazy danych leków?
W USA RxNorm (NLM) dla identyfikatorów i nazw leków oraz openFDA dla oficjalnych etykiet produktów są bezpłatne. W Europie EMA i agencje krajowe publikują informacje o produktach. Kompleksowe sprawdzanie interakcji zazwyczaj wymaga licencjonowanej bazy wiedzy.
Jak agent AI powinien uzyskać informacje o lekach?
Z dwóch narzędzi: jednego, które odczytuje listę leków pacjenta z jego dokumentacji za zgodą, i jednego, które wyszukuje autorytatywne źródło leków. Agent powinien powoływać się na oba i pozostawić decyzje kliniczne profesjonaliście.
Czy Anpheros sprawdza interakcje leków?
Nie. Przechowuje informacje o tym, co dana osoba przyjmuje, wraz z pochodzeniem i zgodą. Sprawdzanie interakcji należy do źródła wiedzy o lekach i lekarza.
Powiązane
- Agenci AI i dane medyczne
- Jak nadać agentowi AI dostęp do dokumentacji medycznej
- Serwer FHIR MCP dla agentów AI
- Systemy kodowania FHIR
- Przykład FHIR R4 MedicationStatement
Try it free in the sandbox · first FHIR call in 5 minutesFree · 30 synthetic patients · no card