LLM이 PHI를 유출할 때 빌드를 실패하게 만드는 npm 패키지를 출시했습니다
요약
LLM이 환자 식별 정보(PHI)를 유출할 경우 빌드를 실패하게 만드는 TypeScript 라이브러리 'phi-leak-guard'를 소개합니다. 외부 API 전송 없이 로컬에서 체크섬 기반의 정밀한 검증을 수행하여 데이터 보안 리스크를 줄여줍니다.
핵심 포인트
- 외부 API 전송 없는 로컬 실행 방식의 zero-dependency 라이브러리
- 단순 패턴 매칭을 넘어 체크섬 기반의 정밀한 PHI/PII 검증 제공
- Vitest/Jest와 통합하여 테스트 스위트 내 회귀 게이트 역할 수행
- HIPAA Safe Harbor 기준을 고려한 식별자 카테고리 커버리지 제공
아무도 깔끔한 해답을 내놓지 못했던 문제
저는 임상 텍스트(clinical text)를 기반으로 LLM 기능을 구축합니다. 기능을 출시하기 전에 저는 한 가지 지루하지만 확실한 보장을 원했습니다. 만약 모델이 출력값에 환자 식별 정보(patient identifier)를 포함한다면, 빌드가 실패해야 한다는 것입니다.
도구를 찾아보았습니다. 제가 발견한 모든 LLM 평가(LLM-eval) 라이브러리(autoevals, promptfoo, vitest-evals, evalite)는 두 가지 부류 중 하나였습니다. PHI(개인 건강 정보)에 대한 개념이 아예 없거나, 호스팅된 API로 출력을 전송하여 점수를 매기는 방식이었습니다. 두 번째 방식은 시작조차 할 수 없습니다. 평가하려는 대상이 환자 데이터일 때, 이를 제3자에게 전송하는 것은 바로 당신이 피하려고 하는 그 위험 자체이기 때문입니다.
그래서 저는 phi-leak-guard를 만들었습니다.
이것은 무엇인가
텍스트 내의 PHI/PII(개인 식별 정보)를 감지하고, 발견 시 테스트 스위트(test suite)를 실패하게 만드는 의존성 없는(zero-dependency) TypeScript 라이브러리입니다. 이는 Vitest/Jest에서 로컬로 실행됩니다. 네트워크도, 모델도 필요 없으며, 프로세스 외부로 아무것도 나가지 않습니다.
import 'phi-leak-guard/vitest';
test('clinical summary never leaks PHI', () => {
...
실패했을 때, 무엇이 유출되었는지 정확히 알려줍니다:
Expected output to contain no PHI, but found 2:
- [name] "John Smith" (pattern)
- [nhs-number] "943 476 5919" (validated)
흥미로운 부분: 모델 없는 정밀도(precision)
결정론적(deterministic) PHI 감지의 어려운 문제는 오탐(false positives)입니다. 단순한 \d{10} 정규 표현식(regex)은 모든 주문 번호를 NHS 번호로 표시하여 하루 만에 사용 중단될 것입니다. 핵심은 단순히 패턴을 매칭하는 것이 아니라 검증(validate)하는 것입니다:
- NHS 번호 → Modulus-11 체크섬(checksum)
- 차량 식별 번호(VINs) → ISO-3779 체크 디지트(check digit)
- IPv4 → 옥텟(octet) 범위 검증
- SSN / NINO → 구조적 + 접두사 규칙
무작위 10자리 숫자는 체크섬을 통과하지 못하므로 표시되지 않습니다. 일치하는 항목은 검증됨(checksum-backed) 또는 패턴(regex/context)으로 태그가 지정되어 각 탐지 결과를 얼마나 신뢰할 수 있는지 확인할 수 있습니다.
커버리지에 대해 정직하게 유지하기
HIPAA Safe Harbor는 18개의 식별자 카테고리로 구성된 유한한 목록이며, 이는 완수가 가능한 목표입니다. 반면 UK GDPR의 "개인 데이터 (personal data)"는 개방적(open-ended)이므로, 이 라이브러리는 "모든 것"이 아닌 일반적인 직접 식별자들을 다룹니다. coverageReport()는 표준에 따라 무엇이 확인되고 무엇이 확인되지 않는지를 정확하게 출력하며, 세 가지 카테고리(생체 인식 (biometrics), 사진 (photos), "기타 모든 식별자 (any other identifier)")는 커버된 것처럼 꾸미는 대신 텍스트에서 탐지할 수 없는 것으로 보고됩니다.
이것은 컴플라이언스 인증 (compliance certification)이 아니라, 리스크를 줄여주는 회귀 게이트 (regression gate)입니다. 또한 결정론적 매칭 (deterministic matching)은 의역된 재식별 (paraphrased re-identification)이나 모든 이름을 잡아낼 수 없으므로, NER (개체명 인식) 모델을 삽입할 수 있는 플러그형 이음새 (pluggable seam)가 마련되어 있습니다.
사용해 보기
npm install --save-dev phi-leak-guard
MIT 라이선스이며, ESM + CJS + 타입 (types)을 지원하고, 합성 벤치마크 (synthetic benchmark) 결과(정밀도 (precision) 1.00, 재현율 (recall) 0.97)를 보유하고 있습니다. 리포지토리: https://github.com/selvassn/phi-leak-guard — 다음에 어떤 식별자를 추가하면 좋을지에 대한 피드백을 진심으로 기다립니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기