본문으로 건너뛰기

LLM 앞 PII 계층을 측정한 방법

Presidio 기반 PII 계층의 조용한 실패를 Greek AFM 실험으로 측정했습니다.

이 요약은 AI가 원문을 분석해 생성했습니다. 정확한 내용은 원문 기준으로 확인하세요.

TL;DR

규제 환경에서 LLM 앞단의 PII masking은 기능을 붙이는 것보다 실제 탐지율과 오탐률을 측정하는 일이 중요합니다. Microsoft Presidio의 영어 기본 파이프라인은 Greek AFM을 인식하지 못하거나 라벨만 마스킹할 수 있으므로 전용 recognizer에 숫자 패턴, 체크섬, 주변 문맥을 결합해야 합니다. 체크섬을 통과한 후보의 점수를 무조건 1.0으로 만들면 무작위 숫자의 약 9.95%가 오탐으로 잡히며, 반대로 임계값을 0.7로 올리면 최고 산출 점수 0.65를 넘어서 모든 AFM을 놓칩니다. 30개 문장 실험에서 임계값 0.5가 precision·recall 1.00을 기록했지만, 이 결과는 작성자의 데이터에만 해당하므로 자체 도메인 데이터와 pytest로 재검증하고 결정 과정까지 감사 기록에 남겨야 합니다.

섹션별 상세

01
실제 사용자 요청에 고객 기록이 붙으면 공격자가 없어도 Greek 세금번호가 미국 추론 로그로 전송될 수 있어 개인정보 보호 계층이 필요합니다. 글의 Version One은 Greek NER가 ΑΦΜ이라는 라벨을 ORGANIZATION으로 판단해 라벨만 <ORGANIZATION>으로 바꾸고 EL526018151은 그대로 통과시켰습니다. HTTP 200과 정상적인 요청 성공만으로는 보호 기능이 작동했다는 근거가 되지 않으며, 오류 신호 없이 개인정보가 로그에 남는 실패가 핵심 위험으로 제시됩니다.
02
Microsoft Presidio는 spaCy NER와 recognizer 묶음으로 텍스트 구간, entity type, score를 산출하는 AnalyzerEngine과 해당 구간을 치환하는 AnonymizerEngine으로 구성됩니다. 그러나 영어 파이프라인을 Greek 문장에 적용하면 ζητάει προσφορά라는 동사구를 0.85 PERSON으로 분류하고 526018151에는 US_SSN, US_PASSPORT, US_BANK_NUMBER를 각각 0.05로 부여해 실제 AFM을 사실상 보이지 않게 만듭니다. language="el"을 지정해도 기본 recognizer가 없어 ValueError가 발생하므로 Greek AFM에는 supported_language 설정과 전용 recognizer가 필요합니다.
python
from presidio_analyzer import AnalyzerEngine
from presidio_anonymizer import AnonymizerEngine
text = "Contact Jane Doe, visa 4012 8888 8888 1881, [email protected]"
hits = AnalyzerEngine().analyze(text=text, language="en")
print(AnonymizerEngine().anonymize(text, analyzer_results=hits).text)
# Contact <PERSON>, visa <CREDIT_CARD>, <EMAIL_ADDRESS>

Presidio의 AnalyzerEngine으로 영어 문장에서 개인정보 후보를 찾고 AnonymizerEngine으로 유형별 플레이스홀더로 치환합니다.

03
Greek AFM recognizer는 아홉 자리 숫자 패턴, 체크섬 검증, 주변 문맥 단어를 결합해 후보의 점수를 계산합니다. 패턴은 숫자열을 후보로 올리고, 체크섬 실패는 후보를 제거하며, 체크섬 통과 뒤 ΑΦΜ·tax·vat·tin 같은 단어가 없으면 0.30, 주변 문맥이 있으면 0.65를 부여하는 방식입니다. 무작위 아홉 자리 숫자의 9.95%가 체크섬을 통과하므로 validate_result()에서 True를 반환해 점수를 1.0으로 고정하면 주문번호와 세금번호를 구분하지 못하고 오탐이 늘어납니다.
python
def validate_result(self, pattern_text: str) -> bool | None:
# True -> score forced to 1.0, context stops mattering
# False -> candidate eliminated
# None -> eligible; the context words decide
return None if afm.is_valid(afm.normalise(pattern_text)) else False

AFM 체크섬이 맞아도 탐지를 확정하지 않고 None을 반환해 주변 문맥이 최종 점수에 영향을 주도록 합니다.

04
30개의 Greek·English 문장과 전화번호, IBAN, AMKA, 체크섬을 우연히 통과하는 아홉 자리 주문번호를 포함한 데이터로 임계값을 측정했습니다. 임계값 0.3에서는 precision 0.80, recall 1.00, TP 16, FP 4, FN 0, TN 10이었고, 0.5에서는 precision과 recall이 모두 1.00으로 측정됐습니다. 최고 점수가 0.65인데 임계값을 0.7로 올리면 precision 1.00과 recall 0.00이 되어 오류나 경고 없이 모든 세금번호가 모델로 전송되므로 임계값은 감사 기록과 테스트에 함께 고정해야 합니다.
05
실제 문서에서 AFM은 공백과 하이픈이 들어간 526 018 151, 526-018-151 또는 EU VAT 형식인 EL526018151로 나타날 수 있습니다. 정규화 단계에서 공백·하이픈·EL 접두사를 제거하되 체크섬은 아홉 개의 표준 숫자만 받게 하고, 그룹 구분 기호는 필수로 두어 IBAN 블록이나 전화번호가 잘못 매칭되지 않게 해야 합니다. 또한 Greek Α와 Latin A가 같은 모양으로 보인다는 점을 반영해 AΦΜ과 ΑΦΜ을 모두 문맥 목록에 넣어야 하며, 서비스가 실제로 마스킹할 entity allow list를 별도로 유지해야 합니다.
python
AFM_SPELLINGS = tuple(a + "Φ" + "m" for a in "ΑA" for m in "ΜM")

Greek 문자와 모양이 같은 Latin A가 문맥 탐지를 우회하지 못하도록 AFM 표기의 조합을 확장합니다.

06
이 계층의 출력은 단순히 문자열을 바꾸는 결과가 아니라 entity_types, count, max_score, threshold, ruleset_version을 담은 PiiFindings 결정 기록입니다. 개인정보가 탐지되면 정책 계층이 EU 내부 모델 또는 온프레미스 모델로 요청을 보내고, 어떤 detector와 임계값이 clean 판정을 냈는지 서명된 감사 흐름에서 확인할 수 있어야 합니다. 글은 이 처리가 재식별 경로를 남기는 pseudonymisation이며, GDPR Recital 26 기준으로 여전히 개인정보인 만큼 마스킹 기능을 법적 익명화 판단과 혼동해서는 안 된다고 결론짓습니다.

용어 해설

개인정보 마스킹(PII masking)
개인정보를 탐지한 뒤 원문을 플레이스홀더나 대체값으로 바꾸는 처리입니다. LLM에 프롬프트를 보내기 전에 이메일, 전화번호, 세금번호 같은 식별자를 제거해 로그와 추론 입력의 노출을 줄이는 데 쓰입니다.
개체명 인식(Named Entity Recognition)
문장 안에서 사람, 조직, 장소, 식별자처럼 의미 있는 구간을 찾아 유형과 신뢰도 점수를 부여하는 기술입니다. 이 글에서는 Greek 텍스트에 영어 NER 파이프라인을 적용할 때 잘못된 구간을 개인정보로 판단하는 문제가 발생했습니다.
체크섬(Checksum)
숫자열이 특정 규칙을 만족하는지 계산해 형식상 유효성을 확인하는 검증값입니다. Greek AFM 후보를 걸러내는 데 사용할 수 있지만, 무작위 아홉 자리 숫자의 약 9.95%도 검사를 통과하므로 이것만으로 개인정보 여부를 확정할 수 없습니다.
가명처리(Pseudonymisation)
식별자를 다른 값으로 바꾸되 별도의 정보나 복호화 경로를 통해 원래 주체를 다시 알아볼 수 있는 처리입니다. 글은 Presidio의 reversible encrypt operator를 포함한 이 방식을 익명화와 구분하며, 재식별 경로가 있으면 GDPR상 여전히 개인정보라고 설명합니다.
정밀도와 재현율(Precision and Recall)
탐지 결과의 정확성과 실제 대상 포착률을 함께 평가하는 지표입니다. 30개 문장 실험에서 임계값 0.5는 정밀도와 재현율 모두 1.00이었지만, 0.7에서는 정밀도 1.00과 재현율 0.00이 되어 모든 세금번호를 놓쳤습니다.

기술

  • Microsoft Presidio
  • AnalyzerEngine
  • AnonymizerEngine
  • spaCy
  • Python
  • QuoteBot
  • Cedar
  • OPA
  • Microsoft Foundry

활용 사례

  • 대출 가격 산정 assistant인 QuoteBot
  • 보험·의료 등 규제 산업의 LLM 입력 보호
  • EU 또는 온프레미스 모델로 개인정보 포함 요청 라우팅
  • PII 탐지 임계값과 ruleset_version을 포함한 감사 기록

언급된 리소스

GitHubQuoteBot / From Prompt to Proof repo
문서GDPR Recital 26
문서EU AI Act Article 9 / Article 10
AI 분석 전체 내용 보기

AI 요약 · 북마크 · 개인 피드 설정 — 무료

출처 · 인용 안내

원문 발행 2026. 08. 26.수집 2026. 08. 26.출처 타입 RSS

인용 시 "요약 출처: AI Trends (aitrends.kr)"를 표기하고, 사실 확인은 원문 보기 기준으로 진행해 주세요. 자세한 기준은 운영 정책을 참고해 주세요.