# 앱 및 AI 에이전트를 위한 의약품 데이터

> 환자 의약품 목록 vs. 약물 지식: FHIR 리소스, RxNorm, ATC, openFDA 및 EMA 소스, 그리고 FHIR 레코드와 RxNorm 및 FDA 라벨의 테스트된 조인.

Source: https://developers.anpheros.com/ko/guides/medication-data-ai-agents

**의료 소프트웨어는 두 가지 종류의 의약품 데이터가 필요합니다. 환자의 의약품 목록 — 이 사람이 언제부터, 어떤 용량으로, 누가 기록했는지 — 그리고 약물 지식 — 제품에 무엇이 포함되어 있는지, 공식 라벨, 경고 및 상호 작용.** 첫 번째는 환자의 기록에 속하며, 두 번째는 권위 있는 약물 데이터베이스에서 가져옵니다. 이를 혼동하면 AI 에이전트가 모델 메모리에서 약물 사실을 잘못 전달하게 됩니다. 이 페이지에서는 FHIR R4 리소스와 관련 코드 시스템, 미국 및 EU에 존재하는 공개 소스, 그리고 FHIR 레코드의 환자 목록을 RxNorm 및 FDA 라벨과 조인하는 작동 예시에 대해 설명합니다.

## 두 가지 종류의 의약품 데이터

| | 환자 의약품 목록 | 약물 지식 |
|---|---|---|
| 답변 | Ana는 무엇을, 언제부터, 얼마나 자주 복용하는가? | 메트포르민 500mg은 무엇이며, 라벨에 어떤 경고가 있는가? |
| 변경 | 환자 또는 임상의가 업데이트할 때 | 규제 기관 또는 게시자가 업데이트할 때 |
| 저장 위치 | 환자의 기록 (EHR, PHR, FHIR 서버) | 약물 데이터베이스 및 용어집 |
| FHIR | `MedicationStatement`, `MedicationRequest`, `MedicationAdministration`, `Medication` | 대부분 기록 외부; 제품 정보 자체는 FHIR일 수 있음 |
| 읽을 수 있는 권한 | 환자의 동의 하에만 | 공개 또는 라이선스 보유 |

"혈압약과 함께 이부프로펜을 복용해도 될까요?"라는 질문에 답하는 앱 또는 에이전트는 두 가지 모두 필요합니다. 어떤 약인지 알기 위한 환자의 목록과, 복합 작용에 대해 알려진 내용을 알기 위한 약물 지식 소스 — 그리고 답변을 위한 임상의 또는 약사.

## 약 목록을 위한 FHIR 리소스

- **MedicationStatement:** 환자가 복용 중이거나, 복용했거나, 중단한 약물 (환자 보고 또는 임상의 기록). PHR 또는 조정 목록에 대한 일반적인 리소스입니다.
- **MedicationRequest:** 처방 또는 지시.
- **MedicationAdministration:** 투여 또는 복용된 (또는 건너뛴) 1회 용량, 준수 확인에 유용합니다.
- **Medication:** 코드 이상의 상세 정보가 필요할 때 (성분, 제형, 배치) 사용되는 제품 자체.

약물은 코드로 표현됩니다: 미국에서는 **RxNorm** (미국 국립 의학 도서관) 및 NDC 제품 코드로, 국제적으로는 WHO **ATC** 분류로, 유럽에서는 국가별 제품 코드와 점점 더 많이 사용되는 EMA의 FHIR 기반 전자 제품 정보로 표현됩니다. 하나의 MedicationStatement는 동일한 약물에 대해 여러 코딩을 포함할 수 있습니다.

## 약물 지식 소스

**미국**

- [RxNorm API](https://lhncbc.nlm.nih.gov/RxNav/APIs/RxNormAPIs.html) (NLM): 임상 약물에 대한 표준화된 이름 및 식별자(RXCUI); 무료이며, 한 가지 예외를 제외하고는 라이선스가 필요하지 않습니다.
- [openFDA drug label API](https://open.fda.gov/apis/drug/label/) (FDA): 구조화된 제품 라벨 — 적응증, 박스 경고, 금기 사항, 약물 상호작용 섹션 — RXCUI로 검색 가능합니다.
- DailyMed (NLM): 사람들이 읽을 수 있는 동일한 라벨입니다.

**유럽 연합**

- 유럽 의약품청은 중앙 집중식으로 승인된 의약품에 대한 제품 정보를 게시하며, 전자 제품 정보(ePI)는 FHIR를 기반으로 합니다. 국가적으로 승인된 제품은 국가 등록부에 있습니다.
- ATC 코드 및 정의된 일일 복용량은 WHO 약물 통계 방법론 협력 센터에서 관리합니다.

**상호작용**은 가장 어려운 부분입니다. NLM은 2024년 1월경에 약물-약물 상호작용 API를 중단했으며, 포괄적인 상호작용 확인은 현재 라이선스가 있는 임상 지식 베이스에 의존합니다. 라벨의 상호작용 섹션은 검사기가 아닌 임상의를 위해 작성된 텍스트입니다.

## 약물 지식과 레코드 결합하기

이 예제는 Anpheros에서 환자의 활성 약물을 읽고, 각 이름을 RxNorm 개념으로 확인한 다음, FDA 라벨을 가져옵니다. 이 예제는 플랫폼의 로컬 인스턴스와 라이브 RxNorm 및 openFDA API를 대상으로 실행되었습니다.

```ts
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 }));
}
```

메트포르민과 에날라프릴을 보고한 환자에 대한 출력:

```
{"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}}
```

**실행하며 배운 점.** "Enalapril 10 mg tablet"으로 작성된 이름의 경우, RxNorm의 근사 일치 기능은 더 이상 RxNorm에서 설명하지 않는 개념인 RXCUI 328290을 반환했으며, 해당 개념에는 라벨이 없었습니다. "enalapril maleate 10 mg oral tablet"이라는 전체 임상 이름의 경우, 라벨이 있는 현재 임상 약물인 858817을 반환했습니다. 사람이 입력한 이름은 근사치입니다. 일치하는 항목이 무엇으로 확인되는지 확인하고, 확인이 완료되면 코드를 저장하며, 사용자에게 일치된 항목을 표시하십시오.

## AI 에이전트 규칙

1. **모델이 기억에서 약물 정보를 제공하도록 하지 마십시오.** 환자의 기록 목록과 권위 있는 출처의 관련 텍스트를 제공하고 인용하도록 요청하십시오.
2. **두 출처를 모두 보이게 유지하십시오.** "환자는 메트포르민을 복용합니다(환자 기록, 3월 3일 입력)"와 "FDA 라벨은 유산산증에 대해 경고합니다(라벨 세트 011de1a5…)"는 소유자가 다른 별개의 주장입니다.
3. **범위를 좁히십시오.** 약물 목록만 필요한 에이전트는 전체 기록이 아닌 `MedicationStatement`에 대한 읽기 액세스 권한을 얻어야 합니다. Anpheros의 경우 이는 동의 범위 또는 MCP 서버의 읽기 전용 도구입니다.
4. **임상의가 필요한 질문에 답하지 마십시오.** 상호 작용, 복용량 변경 및 약물 중단은 약사 또는 의사에게 문의해야 하며, 에이전트는 질문을 준비할 수 있습니다.

## Anpheros의 역할

Anpheros는 약물 목록: `MedicationStatement` 및 `MedicationAdministration`을 ATC 또는 기타 코드로 저장하고, 각 항목을 기록한 사람, 이력, 그리고 다른 앱에 대한 동의 정보를 관리합니다. [컨텍스트 API](https://developers.anpheros.com/ko/guides/ai-healthcare)는 모델을 위해 준비하는 요약에 활성 약물을 포함하며, [MCP 서버](https://developers.anpheros.com/ko/guides/mcp)는 이를 에이전트에게 읽기 전용으로 노출합니다. Anpheros는 약 50개의 일반 의약품으로 구성된 작은 ATC 세트를 번들로 제공하여 코드를 자동으로 명명합니다. 다른 코드는 자동 명명 없이 수락됩니다.

Anpheros는 약물 데이터베이스가 아닙니다. 라벨, 상호작용, 복용량 또는 금기 사항을 제공하지 않으며, 현재 `MedicationRequest` 또는 `Medication` 리소스를 지원하지 않습니다.

## 자주 묻는 질문

### 약 목록에 어떤 FHIR 리소스를 사용해야 하나요?
개인이 복용 중이거나 복용한 약물(환자가 보고한 약물 포함)에는 `MedicationStatement`를 사용합니다. 처방전은 `MedicationRequest`이며, 개별 복용량은 `MedicationAdministration`입니다.

### 무료 약물 데이터베이스 API가 있나요?
미국에서는 약물 식별자 및 이름에 RxNorm(NLM)을, 공식 제품 라벨에는 openFDA를 무료로 사용할 수 있습니다. 유럽에서는 EMA와 각국 기관에서 제품 정보를 게시합니다. 포괄적인 상호작용 검사는 일반적으로 라이선스가 있는 지식 기반이 필요합니다.

### AI 에이전트는 어떻게 약물 정보를 얻어야 하나요?
두 가지 도구를 사용합니다. 하나는 동의를 얻어 환자의 기록에서 약물 목록을 읽는 도구이고, 다른 하나는 권위 있는 약물 소스를 조회하는 도구입니다. 에이전트는 두 가지 모두를 인용하고 임상 결정은 전문가에게 맡겨야 합니다.

### Anpheros는 약물 상호작용을 확인하나요?
아니요. Anpheros는 출처와 동의를 포함하여 개인이 복용하는 약물을 저장합니다. 상호작용 검사는 약물 지식 소스와 임상의의 역할입니다.

## 관련 자료

- [AI 에이전트와 의료 데이터](https://developers.anpheros.com/ko/guides/ai-agents-medical-data)
- [AI 에이전트에게 의료 기록 접근 권한을 부여하는 방법](https://developers.anpheros.com/ko/guides/ai-agent-access-medical-records)
- [AI 에이전트를 위한 FHIR MCP 서버](https://developers.anpheros.com/ko/guides/mcp)
- [FHIR 코드 시스템](https://developers.anpheros.com/ko/guides/fhir-code-systems)
- [FHIR R4 MedicationStatement 예시](https://developers.anpheros.com/tools/fhir-examples/medication-statement)
