작성일: 2026-09-28 · 대상: 「약사님께 드리는 질문」과 「약사 답변」(2026-09-28)
약사님은 FlyVigilance 커밋 c957a48을 기준으로 검토해 주셨습니다. 이 문서는 지적마다 현재 코드에서 다시 확인한 결과와 반영 내용을 정리합니다.
- 확인 방식: 지적 11개를 각각 현재 코드와 데이터로 다시 재는 방식으로 확인했습니다(자동화한 검토 11건).
- 이전 판에서 고친 것: 검토 시점 이후 v2(
3c21e30)에서 이미 고친 것도 적었습니다. - 새로 찾은 것: 검토를 계기로 추가로 찾은 문제도 함께 적었습니다.
| # | 지적 | 현재 상태 | 반영 |
|---|---|---|---|
| 1 | 이소트레티노인 단서(인과 미확립 문구) 오귀속(모든 반응을 한 글자 근거 등급 C로 묶음) | v2에서 이미 고침 | 단서를 그 반응의 문장 범위에서만 찾습니다. 약사님 재현과 같은 결론(A, B, B)이며 테스트로 고정했습니다 |
| 2 | 라벨(허가사항: 규제기관이 허가한 약의 공식 설명서)에 있으나 신호가 없는 반응을 "근거 불충분(D)"이라 부름 | v2에서 L로 분리, 이름은 남아 있었음 | "알려진 위험 · SDR 없음"으로 부르고, PV(약물감시) 분류(라벨 상태 × SDR로 매긴 검토 우선순위)의 한 칸으로 둡니다. SDR은 불균형 보고 신호로, 특정 약·이상반응 조합이 다른 약보다 유난히 많이 보고되는 통계 신호입니다 |
| 3 | 결과 코드(보고에 붙은 사망·입원 등 결과 표시)가 입력에 있으면 중대성(결과가 심각한 사례인지 여부) 판단이 쉬워지므로, 가린 조건으로도 재 달라 | 결과 코드를 보여 준 조건만 있었음 | 결과 코드를 가린 비교 실험을 만들어 주 측정으로 삼았습니다(3절) |
| 4 | 박스 경고(라벨 맨 위의 가장 강한 경고)는 심각성 축이지 근거 확실성이 아님 | 등급 글자 A에 섞여 있었음 | 심각성 표시로 따로 붙입니다 |
| 5 | 이상반응 절 안에서도 임상시험과 시판 후는 무게가 다름 | 구분 없음 | 라벨 상태를 임상시험 / 구분 없음 / 시판 후로 나눕니다 |
| 6 | 금기(쓰면 안 되는 조건) 절을 이상반응 기재로 셈 | 그대로였음 | 금기 절은 환자 조건 표시로만 남기고 기재로 세지 않습니다 |
| 7 | 한 글자 등급 대신 "라벨 상태 × 보고 신호", 공식 용어 + "후보" | 두 축은 있었으나 글자가 앞섬 | PV 분류(검토가 필요한 SDR / 잠재적·규명된 위해성 후보 / 알려진 위험 / 해당 없음)와 검토 우선순위를 앞에 둡니다 |
| 8 | PRR(비례 보고 비) 기준 통과는 "신호"가 아니라 "SDR" | "3중 신호"로 부름 | 화면·문서·크리틱(근거를 넘는 주장을 반려하는 검사 단계) 규칙에서 SDR로 부릅니다 |
| 9 | DME(EMA가 지정한 특별 주의 이상사례) 목록을 System 1(모든 보고를 빠르게 1차 분류하는 반사 판단 층) 안전망으로 | 없었음 | EMA(유럽의약품청) DME 62개 PT(MedDRA 이상반응 표준 용어)가 보고되면 점수와 관계없이 사람 검토로 보냅니다 |
| 10 | 보고 편향 표시(변호사·소비자 보고 비율) | 없었음 | 2,278쌍에 표시를 붙이고 변호사 보고를 뺀 민감도 분석(조건을 바꿔도 결과가 유지되는지 보는 분석)을 함께 냅니다 |
| 11 | 문헌: 실제로 다루는지부터, 설계별 추출 항목, FAERS(미국 FDA 이상사례 보고 시스템) 이중 집계 | 설계·지지 여부만 물었음 | 관문 질문, 증례/비교 연구별 항목, 이중 집계 주의 문구를 넣었습니다 |
| 12 | 국내 '알려진 정보' +2는 실제 문헌 검색으로, 국내 평가는 식약처(식품의약품안전처) 허가사항 기준 | 문헌이 없으면 모델이 골랐음 | 규칙으로만 정합니다. 식약처 허가사항 미확인을 늘 표시합니다 |
| 13 | 국내 15일 규칙은 '중대한 약물이상반응'(인과관계 배제 불가) | 중대성만 봤음 | 인과관계 배제 후보(WHO-UMC 세계보건기구 인과성 평가 기준의 unlikely, 가능성 적음)는 사람 확인으로 보내고 기한은 멈추지 않습니다 |
| 14 | 경로 전체(추가정보 요청·System-2 검토: 근거를 모아 따져 보는 숙고 단계)를 보여 달라, 모니터링 사례도 집계에 남는지, 주 사용자 | README에 없었음 | README에 경로 표와 설명을 넣었습니다 |
| 15 | 라벨 개정보다 먼저 SDR이 선 것은 "라벨 개정 시점 대비 선행"으로 표현해 달라 | 표현을 다듬을 여지가 있었음 | 신호 타임머신과 README에서 기준 시점을 명시하고 보고자 구성을 붙였습니다 |
v2에서 이미 고친 부분입니다. 인과 미확립 단서는 그 반응이 언급된 문장과 뒤따르는 두 문장 안에서만 찾습니다. openFDA(FDA 공개 데이터 조회 API)의 이소트레티노인 라벨 21종에서 이 단서는 모두 청력 손상 소항목에 있었고, 결론은 약사님 재현과 같습니다.
- 등급: 클로자핀·호중구감소증 A, 니라파립·혈소판감소증 B, 이소트레티노인·염증성장질환 B입니다.
- 테스트:
tests/test_labeltext.py로 고정했습니다.
이 조합이 논쟁적이라는 점은 등급 글자가 아니라 두 가지 표시로 드러납니다.
- 문헌 축: 분석 연구 결과가 엇갈립니다.
- 보고 편향 표시: 2012Q4–2026Q2 보고 2,767건 중 94.9%가 변호사 보고였습니다(FAERS 전체 배경 2.56%, 37배).
- 변호사 보고를 빼면 염증성장질환의 SDR은 남습니다(PRR 15.4).
- 같은 약의 궤양성 대장염(PRR 25.9 → 1.3)과 크론병(12.3 → 0.6)은 SDR이 사라집니다.
- "PRR이 크다고 근거가 단단한 것은 아니다"를 보여 주는 예시로 대시보드에 넣었습니다.
- 구형 AERS(2012년까지 쓰던 FAERS 이전 시스템, 2004–2011)로 다시 재면 변호사 보고 비율은 79%였습니다. 논문 수치(87.8%)와의 차이는 중복 제거와 기간 차이로 보입니다.
L 칸은 v2에서 이미 D와 분리했습니다. 이번에 이름과 분류를 바꿨습니다.
- PV 분류 이름: "알려진 위험 · SDR 없음"입니다. 설명은 "허가사항(임상 근거)에 있는 반응입니다. 흔한 반응은 SDR이 서지 않는 것이 보통입니다"입니다.
- D 이름: "불충분"을 버리고 "라벨 미기재, SDR 없음"으로 바꿨습니다. SDR 부재가 안전성의 증거가 아니라는 크리틱 규칙 R4는 그대로 둡니다.
반사 판단의 입력에 FAERS 결과 코드(사망·입원 등)가 있으면 중대성 판단이 크게 쉬워집니다. 저장된 200건에서 결과 코드를 보여 준 중대성 확률의 AUROC(판별 정확도: 0.5는 무작위, 1은 완벽)는 1.000이었습니다. 그래서 모든 조건의 입력에서 결과 코드를 가린 비교 실험을 새로 만들고, 이것을 주 측정으로 삼았습니다.
- 정답: FAERS 결과 코드(중대 여부)입니다. 입력에서는 가리고 채점에만 씁니다.
- 같은 기준: 모든 조건에서 "자동 큐"(사람도 System-2도 따로 보지 않는 사례 묶음)를 종결·모니터링으로 정의했습니다. 질문 하나로 묻는 조건은 사람 우선이 아닌 사례가 모두 자동 큐로 갑니다.
- 결과 코드를 보여 준 조건: 참고 조건으로 대시보드에 함께 둡니다.
결과는 3절에 있습니다.
| 라벨 상태 | 어떻게 정하나 | 비고 |
|---|---|---|
| 박스 경고 | boxed_warning 절 | 심각성 표시를 따로 붙입니다(근거 확실성과 다른 축) |
| 경고·주의사항 | warnings_and_cautions, 구형 warnings, 구형 precautions의 일반 항목 | 구형 PRECAUTIONS의 약물상호작용·임부·소아 항목 속 언급은 경고급으로 세지 않습니다 |
| 이상반응(임상시험) | 이상반응 절에서 시판 후 제목 앞부분 | 위약 대비 근거가 있는 부분 |
| 이상반응(시판 후) | "Postmarketing Experience" 제목 뒤, 또는 "identified during post-approval use" 문장 뒤 | 분모가 없고 정형 단서가 붙는 부분. 공백(gaps)에 따로 적습니다 |
| 이상반응(구분 없음) | 구형 라벨처럼 나눌 수 없는 경우, 임상시험과 시판 후를 합쳐 적은 경우 | |
| 금기 | contraindications 절 | 기재로 세지 않습니다. "금기 절에만 환자 조건으로 언급"으로 표시합니다 |
반영 전 측정(캐시된 라벨 186개, 신호 추출본의 약물-반응 12,445쌍)입니다.
- 금기 절 때문에 '기재'가 된 쌍: 19쌍이었습니다(예: 메트포르민–당뇨병성 케톤산증, 로페라미드–궤양성 대장염, "known hypersensitivity" 문장 8건).
- 금기 절 때문에 순위가 올라간 쌍: 23쌍이었습니다.
- 데모 440건에 미친 영향: 금기 절 때문에 판단이 바뀐 사례는 없었습니다.
라벨 문자열 일치의 반대쪽 위험도 고쳤습니다. 라벨에 있다고 잘못 판정하면 사례가 "예상된 반응"으로 보여 신속보고(중요한 사례를 정해진 기한 안에 규제기관에 보고하는 의무)에서 빠질 수 있어, 안전하지 않은 방향의 오류입니다.
- 잘못 '기재'로 판정된 경우: 적응증(약을 쓰도록 허가된 질환) 문장("patients with heart failure"), 복합어("hepatitis B reactivation"), 부정문("no deaths")이 기재로 판정되던 경우를 문맥 검사로 막았습니다.
- 동의어로 놓친 경우: pyrexia↔fever, acute kidney injury↔acute renal failure 등 정확히 같은 뜻의 동의어만 목록으로 두었습니다. 넓거나 좁은 용어는 넣지 않았습니다.
- ICH(의약품 국제조화위원회) E2A(중대성 정의와 신속보고 원칙 가이드라인)의 예처럼 라벨의 "hepatitis"가 "hepatitis fulminant"를 예상된 반응으로 만들지 않도록 테스트로 고정했습니다.
국내 허가사항은 아직 자동으로 읽지 않습니다. 대신 한국어 정형 문구 "인과관계가 입증된 것을 의미하는 것은 아니다"를 인과 미확립 단서에서 제외하는 처리를 미리 넣었습니다. 금기·신중 투여 항을 기재로 세지 않는 원칙도 같습니다.
한 글자 등급은 팀 시제품과 비교하려고 남기고, 화면의 중심은 라벨 상태 × SDR로 정하는 PV 분류입니다. 공식 용어를 빌리고 모두 "후보"를 붙입니다.
| 검토 우선순위 | PV 분류 | 조건 |
|---|---|---|
| 1 | 검토가 필요한 SDR (새 신호 후보) | 라벨 미기재(또는 라벨 확인 불가) + SDR |
| 2 | 잠재적 위해성 후보 | 라벨 기재 + 그 반응에 인과 미확립 단서 |
| 2 | 판정 불가 | 라벨이나 FAERS 통계를 확인하지 못함 |
| 3 | 규명된 위해성 후보 | 라벨 기재 + SDR |
| 4 | 알려진 위험 · SDR 없음 | 라벨 기재 + SDR 없음 |
| 5 | 해당 없음 | 라벨 미기재 + SDR 없음 |
PV 검토 우선순위대로 라벨에 없는데 SDR이 선 쌍을 가장 먼저 봅니다. 분류와 별도로 붙이는 표시가 있습니다.
- 심각성: 박스 경고
- EMA DME: 우선순위를 2 이상으로 올립니다
- 보고 편향 의심: 변호사·소비자 보고 편중
- 금기 절 언급
- 적응증 용어와 겹침
- 문헌 근거 수준
통계 기준을 넘은 상태는 SDR(불균형 보고 신호)이라 부르고 "검증된 신호가 아닙니다(EU GVP Module IX)"(GVP는 EMA의 약물감시 모범 실무 지침이고, Module IX는 신호 관리 편입니다)를 함께 적습니다.
- 바꾼 곳: 크리틱 규칙 R4와 작성자 프롬프트도 SDR로 바꿨습니다.
- 남긴 곳: "신호 관리", "신호 검토"(과정), 화면 이름 "신호 타임머신"은 남겼습니다.
EMA DME 목록(EMA/326038/2020, 62개 PT)을 넣었습니다. 보고된 PT 중 하나라도 DME이면 결정 정책(확률을 행동과 기한으로 바꾸는 규칙표)이 종결·모니터링·System-2 검토를 사람 우선 검토로 바꿉니다. 신속보고 기한은 붙이지 않습니다.
- FAERS 전체: DME PT가 있는 보고는 4.5%입니다. 그중 결과 코드가 없는 보고는 1.1%뿐이라 과잉 상향은 거의 없습니다.
- 데모 440건: DME PT가 있는 사례 15건은 모두 중대 사례였습니다. 결과 코드를 가린 조건에서 그중 1건이 안전망으로 사람 우선 검토가 되었고, 나머지 14건은 판단만으로 이미 사람 우선이었습니다.
- 경계 사례: 올란자핀–약물 유발 간손상 사례는 중대성 0.49로 경계에 걸립니다. 안전망이 있으면 판단값과 관계없이 늘 사람에게 갑니다.
실제 FAERS 440건(중대 250건, 비중대 190건)을 네 조건으로 처리했습니다. 네 조건 모두 같은 판단 모델을 쓰고, 입력에서 결과 코드를 가렸습니다.
재현: pipeline/bench/ablation.py → web/public/data/bench.json의 ablation_blind.
| 조건 | 검토에 닿은 중대 사례 | 자동 큐에 남은 중대 사례 | 사람 우선 | 비중대 → 사람 우선 | 특이도(실제 음성 중 음성으로 맞게 거른 비율) |
|---|---|---|---|---|---|
| FlyVigilance 워크플로 | 247 / 250 | 3 | 138 | 3 | 0.984 |
| FlyVigilance · 라벨 근거 주입(라벨 원문을 조회해 판단에 넣는 것) 없음 | 248 / 250 | 2 | 144 | 3 | 0.984 |
| FlyVigilance · DME 안전망 없음 | 247 / 250 | 3 | 137 | 3 | 0.984 |
| 모델 단독 · 질문 하나 ("먼저 봐야 하나?", p ≥ 0.5) | 234 / 250 | 16 | 302 | 68 | 0.642 |
"검토에 닿은"은 사람 우선, System-2 검토(NVIDIA Nemotron 숙고 + 3단 크리틱, Nemotron은 NVIDIA 언어 모델 계열), 추가정보 요청 중 하나로 간 경우입니다. FlyVigilance에서 중대 250건은 사람 우선 135건, System-2 검토 97건, 추가정보 요청 15건, 모니터링 3건으로 갔습니다.
짝지은 McNemar 정확 검정(같은 사례에서 한쪽 조건만 해당한 수)입니다. p값은 실제로 차이가 없다고 가정할 때 이만한 차이가 우연히 나올 확률입니다.
| 비교 | FlyVigilance만 | 질문 하나만 | p |
|---|---|---|---|
| 자동 큐에 남은 중대 사례 | 3 | 16 | 0.0044 |
| 사람 우선으로 보낸 비중대 사례 | 0 | 65 | 5.4 × 10⁻²⁰ |
| 사람 우선으로 보낸 사례 전체 | 1 | 165 | 3.6 × 10⁻⁴⁸ |
- 중대 사례는 더 많이 검토에 닿고, 사람 업무량은 절반 아래로 줄었습니다. 질문 하나는 '예'와 '아니오' 두 경로뿐이라, 놓치지 않으려면 사람에게 많이 넘겨야 합니다. FlyVigilance는 규제 용어로 나눈 7문항과 결정 정책으로 System-2 검토라는 중간 경로를 둡니다.
- 라벨 근거 주입: 결과 코드를 가린 조건에서 경로가 바뀐 사례는 63건이었습니다. 중대 사례를 사람 우선으로 올린 수는 주입 후에만 12건, 주입 전에만 18건으로 차이가 없었습니다(p = 0.36). 이 부품의 역할은 업무량 조정이 아니라 예측성(라벨 기재 여부)을 원문 근거로 정하는 것입니다. 라벨을 찾은 321건 중 159건에서 모델 추정과 라벨 원문이 달랐고, 원문을 따랐습니다.
- DME 안전망: 1건을 사람 우선으로 올렸습니다(2.4절).
- Q1 라벨 기재·신호 없음: 1-2와 같습니다. 라벨 기재를 1차 근거, SDR을 보조 근거로 둡니다.
- Q2 음성 대조: OMOP·EU-ADR·Harpaz 참조 세트(정답을 미리 정해 둔 평가용 목록)를 이미 씁니다.
- OMOP 음성 대조 오분류(Hauben 2016, 17%)는 한계로 밝혀 두었습니다.
- Harpaz 세트로 한 전향 검증(그 시점까지의 자료만으로 나중 일을 맞히는지 보는 검증) 결과에는 "FDA 내부 검토가 라벨 개정보다 최대 2년 앞설 수 있다"는 단서를 붙였습니다.
- Q3 예측성: 절과 관계없이 허가사항에 적혀 있는지로 판단합니다. 종류·심각도·특이성이 같아야 하므로 문자열 일치에 문맥 검사와 ICH E2A 예시 테스트를 더했습니다.
- 미국과 한국의 보고 기한 차이는 규정 모드로 이미 나눠 두었고, 국내 요건은 13번과 같이 고쳤습니다.
- Q4 논문 초록 항목: 실제로 다루는가(직접 다룸 / 보고함 / 지나가는 언급 / 무관)를 먼저 묻고, 지나가는 언급은 지지 편수에서 뺍니다. 설계별로 묻는 항목은 다음과 같습니다.
- 증례보고: 발현 시간, 중단 후 호전, 재투여, 대안 원인 배제와 객관적 확인, 인과성 척도
- 비교 연구: 효과 방향·유의성, 환자 수, 비교군, 용량 관계
- 공통: 작용 기전과 계열 효과
- 실제 호출에서 관련도 상위 문헌의 39.5%가 지나가는 언급이나 무관으로 판정되었습니다.
- 논문 증례와 FAERS 보고의 이중 집계도 쟀습니다. FAERS 사례의 5.8%가 문헌 출처를 적었고, 메트포르민–젖산산증은 40%였습니다. 그래서 두 수를 독립 근거로 더하지 않는다는 문구를 등급에 붙입니다.
- Q5 인과성 평가표의 논문 자리: "알려진 정보"는 FDA 허가 라벨 기재 +3, 라벨에 없고 PubMed(의학 논문 검색 서비스) 증례보고가 있으면 +2, 없으면 0입니다. 모델에 묻지 않습니다.
- 평가 반응이 이 약의 적응증과 겹치면 증례보고가 그 질환 자체를 다룬 글일 수 있어 +2를 주지 않습니다.
- 식약처 허가사항은 의약품안전나라가 자동 수집을 막고 있어(robots.txt: 사이트가 자동 수집 허용 범위를 적어 두는 파일) 조회하지 않았습니다. "식약처 허가사항 미확인"을 늘 표시하고 검색 링크를 붙입니다. 예를 들어 테고프라잔은 국내 허가사항 이상반응 항에 두드러기가 있어 +3이 맞습니다.
- 비약물요인 점수는 환자 사례 정보로만 매깁니다.
- Q6 규제기관 목록: 이번에는 구현하지 않았습니다. 주의점(PRAC(EMA 약물감시위험평가위원회) 결론 가려 쓰기, 조치일 이전 데이터만 쓰기, 제형 구분, 계열 단위 결론, 용어 맞추기)과 국내 목록(변경명령, 안전성서한)은 다음 단계 계획에 옮겨 적었습니다.
- Q7 용어 버전: FAERS 쪽 PT는 사용권 없이 맞출 수 있으므로, 급성 신손상(18.0부터 PT)과 옛 "renal failure acute"를 동의어로 묶었습니다. MedDRA 코드 기반 대조는 사용권 문제로 다음 단계로 둡니다.
- 모니터링·종결 사례도 신호 집계에 남습니다. 신호 통계는 트리아지(사례 분류)와 관계없이 중복을 제거한 FAERS 전체로 계산합니다. 벤치마크 440건은 경로와 관계없이 모두 집계에 들어 있습니다.
- 경로 전체: README에 사람 우선, System-2 검토, 추가정보 요청, 모니터링, 종결을 모두 적고 경로마다 중대 사례 수를 붙였습니다.
- 추가정보 요청 42건은 모두 환자 정보가 빠진 사례이고, 그중 15건이 중대 사례입니다.
- 요소가 빠져도 중대해 보이면 이제 사람이 먼저 추가정보를 요청하도록 표시합니다.
- 주 사용자:
- FAERS 대량 선별은 규제기관 이상사례 검토자와 제약사 신호 관리팀입니다.
- 국내 모드는 지역의약품안전센터(개별 사례의 인과성을 평가하는 국내 센터) 평가자와 제약사 PV 담당자입니다.
- 판정과 보고는 평가자와 담당자가 합니다.
- 국내 15일 규칙:
- 별표 4의3(의약품 등의 안전에 관한 규칙 별표) 제1호 차목에 따르면 인과관계를 모르는 자발보고는 약물이상반응으로 봅니다. 보고자와 품목허가권자가 모두 관련 없다고 판단해야만 제외됩니다.
- 모델은 그 둘이 아니므로, 모델이 "가능성 적음"이라 해도 기한을 멈추지 않고 사람 확인으로 보냅니다.
- 인과성 8개 항목의 약사 검증: 제안해 주신 평가 사례 정답이 있으면 본선에서 모델 판단과 비교하겠습니다.
- 신호 타임머신의 보고자 구성:
- 레보플록사신–대동맥류는 첫 SDR까지의 사례 11건이 모두 소비자 보고였습니다. 조치 전 사례의 99%도 소비자 보고였고, 53%가 2017년 2분기 한 분기에 접수되었습니다.
- 그래서 이 사례의 "994일 선행"은 보고자 구성과 함께 봅니다.
- 카나글리플로진–당뇨병성 케톤산증, 프레가발린·가바펜틴–호흡억제는 의료인 보고가 대부분이었습니다.
- 화면에 보고자 구성과 주의 표시를 붙였습니다.
- 크리틱 보강(v2): JSON 파싱에 실패한 메모는 "주장 없음"으로 반려하고, 안전 가드는 주장마다 따로 검사합니다.
- 식약처 허가사항 연동(data.go.kr 의약품 제품 허가정보 API, 서비스 키 필요)
- 규제기관 확정 목록(PRAC 제품정보 변경, 실마리정보, 변경명령)으로 만든 양성 대조 세트
- MedDRA 코드 기반 용어 대조(사용권 확인 후)
- 인과성 8개 항목과 약사 평가의 일치도 검증