PII Proxy는 애플리케이션과 클라우드 LLM 사이에 놓이는 로컬 미들웨어로, 프롬프트 내 개인식별정보(PII, Personally Identifiable Information)를 탐지·마스킹한 뒤 정제된 텍스트만 외부 모델에 전송하고, 응답을 받은 후 원래 값을 복원하는 아키텍처 패턴이다.
배경 문제
클라우드 LLM을 그대로 사용하면 고객 이름, 이메일, 전화번호, 계정 ID 같은 민감 정보가 서드파티 모델 제공자 서버로 전송된다. GDPR·HIPAA·개인정보보호법 등 컴플라이언스 요건을 충족하면서 고품질 클라우드 모델을 쓰고 싶을 때 이 문제가 발생한다.
대안은 세 가지다:
| 방식 | 특징 | 한계 |
|---|---|---|
| 클라우드 LLM 직접 사용 | 최고 품질 | PII 외부 유출 |
| 로컬 LLM 전용 | 완전한 데이터 격리 | 품질 저하 또는 고비용 |
| 정규식 마스킹 | 구조화된 패턴(이메일 등) 처리 | 문맥 의존 PII(인명 등) 누락 |
| 로컬 AI 프록시 | 품질·프라이버시 균형 | 지연 증가, 상태 관리 필요 |
스크럽-리하이드레이트 워크플로
PII Proxy는 요청마다 네 단계를 거친다:
- 탐지(Detect) — 로컬 NER 모델이 원문에서 민감 스팬을 추출. 정규식으로 구조화 패턴 보완
- 마스킹(Mask) —
<PERSON_0>,<EMAIL_1>같은 플레이스홀더로 치환. 동일 값은 동일 토큰 사용 - 추론(Infer) — 정제된 프롬프트만 클라우드 LLM에 전송
- 복원(Rehydrate) — 응답 내 플레이스홀더를 원본 값으로 교체 후 반환
클라우드 모델은 실제 개인정보를 전혀 보지 못하고 플레이스홀더만 처리한다.
PII 탐지 기술
GLiNER
GLiNER는 고정 레이블이 아닌 추론 시점에 레이블을 지정할 수 있는 경량 NER 모델이다. person, email, credit_card, account 등 원하는 엔티티 유형을 런타임에 전달하면 해당 스팬을 반환한다. 범용 SLM에 JSON 생성을 요청하는 방식보다 구조화된 출력이 보장되어 보안 전처리에 적합하다.
정규식 보완
GLiNER는 문맥 의존 엔티티(인명, 조직명 등)에 강하고, 이메일·전화번호 같은 구조적 패턴은 정규식이 더 빠르고 확실하다. 두 방식을 결합해 각각의 약점을 보완한다.
사용 대상
- 고객 지원 요약, 환자 노트, 사내 티켓 처리 등 민감 데이터가 포함된 LLM 워크플로를 운영하는 팀
- GDPR·HIPAA 등 컴플라이언스 요건 때문에 원시 데이터를 외부에 전송할 수 없지만 클라우드 모델 품질이 필요한 경우
관련 문서
- pii-proxy-tutorial-llm-redact — Node.js로 로컬 AI 프록시 구현하기 (GLiNER + Gemini)