Try it free in the sandbox · first FHIR call in 5 minutesFree · 30 synthetic patients · no card
アプリとAIエージェントのための投薬データ
患者の投薬リストと医薬品知識の比較:FHIRリソース、RxNorm、ATC、openFDA、EMAソース、そしてFHIRレコードとRxNormおよびFDAラベルのテスト済み結合。
ヘルスケアソフトウェアには、2種類の医薬品データが必要です。1つは患者の処方薬リスト(その人が何を、いつから、どのくらいの量で服用しているか、誰が記録したか)であり、もう1つは医薬品知識(製品の内容、公式ラベル、警告、相互作用)です。 前者は患者の記録に属し、後者は権威ある医薬品データベースから取得されます。これらを混同すると、AIエージェントがモデルの記憶から医薬品の事実を述べてしまう原因となります。このページでは、両方、関連するFHIR R4リソースとコードシステム、米国とEUに存在する公開ソース、およびFHIRレコードからの患者リストをRxNormとFDAラベルに結合する動作例について説明します。
2種類の医薬品データ
| 患者の服薬リスト | 医薬品知識 | |
|---|---|---|
| 回答 | アナは何を、いつから、どのくらいの頻度で服用していますか? | メトホルミン 500 mg とは何か、そのラベルにはどのような警告がありますか? |
| 変更 | 患者または臨床家が更新した場合 | 規制当局または発行元が更新した場合 |
| 保存場所 | 患者の記録(EHR、PHR、FHIRサーバー) | 医薬品データベースおよび用語集 |
| FHIR | MedicationStatement、MedicationRequest、MedicationAdministration、Medication |
主に記録の外にあります。製品情報はそれ自体がFHIRである可能性があります |
| 閲覧権限 | 患者の同意がある場合のみ | 公開またはライセンスあり |
「イブプロフェンを血圧の薬と一緒に服用できますか?」という質問に答えるアプリまたはエージェントは、両方を必要とします。どの薬かを知るためには患者のリスト、その組み合わせについて何が知られているかを知るためには医薬品知識ソース、そして回答を得るためには臨床家または薬剤師が必要です。
投薬リストのためのFHIRリソース
- MedicationStatement: 患者が服用している、服用した、または中止した薬(患者報告または臨床医による記録)。PHRまたは照合リストの通常の対象リソースです。
- MedicationRequest: 処方またはオーダー。
- MedicationAdministration: 投与または服用された(またはスキップされた)1回の投与量。アドヒアランスに役立ちます。
- Medication: 製品自体。コード以上の詳細(成分、剤形、ロット)が必要な場合。
薬はコード化されます。米国ではRxNorm(米国国立医学図書館)およびNDC製品コードで、国際的にはWHO ATC分類で、ヨーロッパではさらに国内製品コード、そしてますますEMAのFHIRベースの電子製品情報でコード化されます。ステートメントは、同じ薬に対して複数のコーディングを持つことができます。
薬物知識ソース
米国
- RxNorm API (NLM): 臨床薬の正規化された名称と識別子 (RXCUI)。無料であり、例外なくライセンスは不要です。
- openFDA drug label API (FDA): 構造化された製品ラベル — 適応症、ブラックボックス警告、禁忌、薬物相互作用セクション — RXCUI で検索可能。
- DailyMed (NLM): 人が読むための同じラベル。
欧州連合
- 欧州医薬品庁は、中央で承認された医薬品の製品情報を公開しており、その電子製品情報 (ePI) は FHIR に基づいています。国家で承認された製品は、各国のレジストリにあります。
- ATC コードと定義一日量 (DDD) は、WHO 薬物統計方法論協力センターによって維持されています。
相互作用 が最も難しい部分です。NLM は 2024 年 1 月頃に薬物間相互作用 API を廃止しました。現在、包括的な相互作用チェックは、ライセンスされた臨床知識ベースに依存しています。ラベルの相互作用セクションは、臨床医向けに書かれたテキストであり、チェッカーではありません。
処方薬知識とのレコード結合
この例では、Anpheros から患者の現在処方されている薬剤を読み込み、各名称を RxNorm コンセプトに解決し、FDA ラベルを取得します。これは、プラットフォームのローカルインスタンスと、ライブの RxNorm および openFDA API に対して実行されました。
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 の近似一致は RXCUI 328290 を返しましたが、これは RxNorm がもはや説明していないコンセプトであり、ラベルがありませんでした。完全な臨床名「enalapril maleate 10 mg oral tablet」では、858817 を返しました。これは、ラベルを持つ現在の臨床薬です。人間が入力した名前は近似的です。一致が解決されるものを確認し、確認されたらコードを保存し、一致したものをユーザーに表示してください。
AIエージェントのためのルール
- モデルに記憶から薬剤の事実を供給させないでください。 患者の記録からのリストと、権威あるソースからの関連テキストを与え、それらを引用するように求めてください。
- 2つのソースを常に表示してください。 「あなたはメトホルミンを服用しています(あなたの記録、3月3日にあなたが入力)」と「FDAラベルは乳酸アシドーシスについて警告しています(ラベルセット ⟦011de1a5⟧…)」は、異なる所有者を持つ異なる主張です。
- スコープを絞り込んでください。 服用中の薬剤リストのみが必要なエージェントには、レコード全体ではなく、
MedicationStatementへの読み取りアクセス権を与えてください。Anpheros では、これは同意スコープまたは MCP サーバーの読み取り専用ツールです。 - 臨床医が必要なことには答えないでください。 服薬指導、用量変更、薬剤の中止は、薬剤師または医師に任せてください。エージェントは質問を準備することができます。
Anpheros の位置づけ
Anpheros は、医薬品リスト MedicationStatement および MedicationAdministration を、ATC またはその他のコードとともに、各項目の記録者、履歴、および他のアプリケーションへの同意情報と共に保存します。コンテキスト API は、モデルのために準備するサマリーに現在の医薬品を含み、MCP サーバー はそれらをエージェントに読み取り専用で公開します。一般的な医薬品約 50 件の小さな ATC サブセットをバンドルしており、コードの自動命名に使用されます。それ以外のコードは、自動命名なしで受け入れられます。
これは医薬品データベースではありません。ラベル、相互作用、用量、禁忌を提供せず、現時点では MedicationRequest または Medication リソースをサポートしていません。
よくある質問
投薬リストにはどのFHIRリソースを使用すべきですか?
個人が服用している、または服用した薬(患者が報告した薬を含む)にはMedicationStatementを使用します。処方箋はMedicationRequest、個々の投与量はMedicationAdministrationです。
無料の医薬品データベースAPIはありますか?
米国では、医薬品の識別子と名称についてはRxNorm (NLM)、公式製品ラベルについてはopenFDAが無料です。欧州では、EMAおよび各国の機関が製品情報を公開しています。包括的な相互作用チェックには、通常、ライセンスされた知識ベースが必要です。
AIエージェントはどのようにして投薬情報を取得すべきですか?
2つのツールから取得します。1つは同意を得て患者の記録から投薬リストを読み取るツール、もう1つは権威ある医薬品ソースを検索するツールです。エージェントは両方を引用し、臨床上の決定は専門家に委ねるべきです。
Anpherosは医薬品の相互作用をチェックしますか?
いいえ。Anpherosは、出所と同意とともに、個人が服用しているものを保存します。相互作用のチェックは、医薬品知識ソースと臨床医の責任です。
関連情報
- AIエージェントと医療データ
- AIエージェントに医療記録へのアクセスを許可する方法
- AIエージェント向けFHIR MCPサーバー
- FHIRコードシステム
- FHIR R4 MedicationStatementの例
Try it free in the sandbox · first FHIR call in 5 minutesFree · 30 synthetic patients · no card