AEGIS Personal PII NER
GPT, Gemini 등 AI 서비스 사용 시 개인정보(PII) 유출을 방지하기 위한 다국어 NER 모델.
ONNX INT8 양자화 모델로, 크롬 확장 프로그램에서 onnxruntime-web으로 브라우저 내 실시간 추론합니다.
Current version:
v2| All versions
Model Details
| Base | bert-base-multilingual-cased (178M params) |
| Task | Token Classification (BIO tagging) |
| Labels | 37 (18 PII types × B/I + O) |
| Format | ONNX INT8 dynamic quantization |
| Languages | Korean, English |
| Version | v2 |
Supported PII Types (18)
GIVENNAME, SURNAME, USERNAME, EMAIL, TELEPHONENUM, DATEOFBIRTH, CREDITCARDNUMBER, IDCARD, STREET, CITY, ZIPCODE, BUILDINGNUM, IP_ADDRESS, PASSWORD, ACCOUNTNUM, DRIVERLICENSENUM, TIME, COMPANY
Benchmark — v2 (Current)
| Metric | Score |
|---|---|
| Entity-level Span F1 | 0.9234 |
| Token-level F1 | 0.9271 |
| English F1 | 0.9119 |
| Korean F1 | 0.9632 |
| False Positive Rate | 0.0033 |
| Latency (avg) | 55.28ms |
| Entity | F1 | Precision | Recall |
|---|---|---|---|
| IP_ADDRESS | 1.0 | 1.0 | 1.0 |
| 0.9978 | 0.9955 | 1.0 | |
| USERNAME | 0.9864 | 0.9898 | 0.9831 |
| CITY | 0.98 | 0.9787 | 0.9813 |
| TELEPHONENUM | 0.9568 | 0.958 | 0.9557 |
| ZIPCODE | 0.9358 | 0.9309 | 0.9409 |
| PASSWORD | 0.9268 | 0.9421 | 0.912 |
| IDCARD | 0.9222 | 0.908 | 0.9367 |
| DRIVERLICENSENUM | 0.9187 | 0.8972 | 0.9412 |
| GIVENNAME | 0.9114 | 0.9024 | 0.9206 |
| DATEOFBIRTH | 0.9096 | 0.9096 | 0.9096 |
| SURNAME | 0.8908 | 0.8979 | 0.8839 |
| BUILDINGNUM | 0.8735 | 0.8841 | 0.8631 |
| CREDITCARDNUMBER | 0.8603 | 0.8556 | 0.8652 |
| COMPANY | 0.8571 | 1.0 | 0.75 |
| STREET | 0.8308 | 0.8333 | 0.8282 |
| ACCOUNTNUM | 0.75 | 0.7213 | 0.7811 |
Version Comparison
| Version | Span F1 | EN F1 | KO F1 | FPR | Latency |
|---|---|---|---|---|---|
| v2 (current) | 0.9234 | 0.9119 | 0.9632 | 0.0033 | 55.28ms |
| v1 | 0.8788 | 0.9168 | 0.6842 | 0.0533 | 57.79ms |
Usage
Load specific version
from transformers import AutoTokenizer, AutoModelForTokenClassification
# Latest (main branch)
model = AutoModelForTokenClassification.from_pretrained("YATAV-ENT/aegis-personal-pii-ner")
tokenizer = AutoTokenizer.from_pretrained("YATAV-ENT/aegis-personal-pii-ner")
# Pin to specific version
model = AutoModelForTokenClassification.from_pretrained("YATAV-ENT/aegis-personal-pii-ner", revision="v2")
tokenizer = AutoTokenizer.from_pretrained("YATAV-ENT/aegis-personal-pii-ner", revision="v2")
ONNX Runtime (Browser / Node.js)
import { InferenceSession } from "onnxruntime-web";
const session = await InferenceSession.create("onnx/model_quantized.onnx");
Download specific version
from huggingface_hub import hf_hub_download
path = hf_hub_download(
repo_id="YATAV-ENT/aegis-personal-pii-ner",
filename="onnx/model_quantized.onnx",
revision="v1" # any tag or commit hash
)
Release Notes
v2 — 한국어 성능 대폭 개선 + 오탐률 감소
요약
v1 벤치마크 분석 결과를 기반으로, 한국어 F1을 0.68 → 0.96으로 대폭 개선하고 오탐률을 5.33% → 0.33%로 감소시킨 버전. 테스트 데이터의 비현실적 패턴 수정, 학습 데이터 다양화, 후처리 검증 강화를 동시에 진행.
v1 대비 변경사항
1. 테스트셋 수정
- 한국어 이메일 패턴 현실화:
민준.최@naver.com→minjun.choi@naver.com(로마자 username)- 실제 한국 이메일 서비스는 영문 아이디만 허용하므로, 현실적인 패턴으로 수정
- 한국어 테스트 데이터 확대: 200건 → 350건
- IDCARD(주민등록번호), CREDITCARDNUMBER, DRIVERLICENSENUM, USERNAME, COMPANY, BUILDINGNUM, DATEOFBIRTH 등 누락 유형 추가
- 종합 서류 시나리오 (계약서, 배송장 등 복합 PII 문서) 추가
2. 학습 데이터 보강 (Hard Negative + Augmentation)
- BUILDINGNUM Negative 3,000건: "회원 수 1,234명", "Total revenue: $4,567" 등 건물번호가 아닌 3~5자리 숫자 패턴
- 한국어 이메일 Augmentation 2,000건:
shin5349@kakao.com,minjun.kim@naver.com등 현실적 로마자 이메일 - 한국어 복합 PII Augmentation 2,000건: 이름+전화+주소가 함께 등장하는 계약서, 배송장, 이력서 시나리오
3. 후처리 검증(Validator) 강화
- BUILDINGNUM context-aware 필터링: 주변 50자에 "동", "번지", "building", "apt" 등 건물 관련 키워드가 없으면 제거
- Score threshold 필터링: BUILDINGNUM ≥0.90, STREET ≥0.80 등 저신뢰도 예측 차단
- STREET/ACCOUNTNUM validator: 최소 길이(3자) 및 포맷 검증 추가
- Span 경계 보정(correct_spans): EMAIL, IP_ADDRESS, TELEPHONENUM의 불완전한 span을 regex로 보정
4. 벤치마크 시스템 개선
benchmark.py의 FPR 평가에correct_spans적용하여 실제 운영 환경과 동일한 조건으로 측정
성과
| Metric | v1 | v2 | 변화 |
|---|---|---|---|
| Span F1 | 0.8788 | 0.9234 | +5.1%p |
| Korean F1 | 0.6842 | 0.9632 | +27.9%p |
| English F1 | 0.9168 | 0.9119 | -0.5%p |
| EMAIL F1 | 0.7408 | 0.9978 | +25.7%p |
| FPR | 5.33% | 0.33% | -5.0%p |
잔여 과제
- BUILDINGNUM 잔여 오탐 1건:
"Step 4100 of 1747 is now complete"→ BUILDINGNUM("1747", 0.974) - ACCOUNTNUM F1 0.75 — 다양한 한국 계좌번호 패턴 학습 필요
- STREET F1 0.83 — 한국 주소 체계 특화 학습 필요
- COMPANY F1 0.86 — 한국 기업명 데이터 보강 필요 (테스트 샘플 12건으로 적음)
v1 — 초기 학습 모델
요약
코드/CLI Hard Negative와 한국어 이름 Hard Negative를 포함한 첫 번째 정식 학습. 이전 실험 모델(v3~v5)을 모두 초기화하고, 정제된 데이터셋과 벤치마크 시스템을 기반으로 새로 시작한 버전.
학습 데이터
| 데이터셋 | 설명 | Train | Val |
|---|---|---|---|
| ko | 한국어 합성 PII (템플릿 기반) | 64,000 | 16,000 |
| ko_sentinel | BoB14TeamSentinel 한국어 외부 데이터 | 20,317 | 5,080 |
| ko_hard_neg | 한국어 Hard Negative (코드/CLI, 이름 등) | 19,404 | 4,851 |
| en | ai4privacy 영어 데이터 | 47,744 | 11,872 |
| en_hard_neg | 영어 Hard Negative | 18,550 | 4,637 |
| 합계 | 170,015 | 40,440 |
주요 특징
- 코드/CLI Hard Negative:
git commit,docker run, Python/JS/SQL 코드 조각 등을 학습하여 USERNAME/PASSWORD 오탐 방지 - 한국어 이름 Hard Negative: "경제", "서울", "화요일" 등 일상 한국어 단어가 SURNAME/GIVENNAME으로 오탐되는 것 방지
- Standalone PII 패턴: 문맥 없이 숫자만 입력해도 주민번호, SSN, 신용카드 등 구조적 PII 탐지
알려진 문제
- BUILDINGNUM 오탐 심각: 4자리 숫자를 건물번호로 과잉 탐지 → FPR 5.33%의 주요 원인
- 한국어 EMAIL F1 낮음 (0.74): 테스트셋의 이메일 패턴이 비현실적 (한글 username)이었고, 학습 데이터 다양성 부족
- 한국어 전체 F1 0.68: 이름, 주소, 계좌번호 등 한국어 PII 유형별 커버리지 부족
Resources
- Full benchmark reports:
benchmarks/directory - Detailed changelogs:
changelogs/directory
License
Apache 2.0