PresidioEntityExtractor

PresidioEntityExtractor

PresidioEntityExtractor는 문서에서 개인 식별 정보(PII)를 감지하고, 문서 텍스트는 수정하지 않은 채 감지된 엔티티를 "entities" 키 아래의 구조화된 메타데이터로 저장해요. 각 항목은 엔티티 타입, 문자 오프셋, 신뢰 점수를 담고 있죠.

출처: 문서

본문

항목 내용
파이프라인에서 가장 흔한 위치 인덱싱 파이프라인에서 Document Store에 문서를 쓰기 전
필수 run 변수 documents: Document 객체 목록
출력 변수 documents: PII 메타데이터가 추가된 Document 객체 목록
API reference Presidio
GitHub 링크 presidio 통합
패키지 이름 presidio-haystack

개요

Microsoft Presidio는 PII 감지와 익명화를 위한 오픈소스 프레임워크예요. PresidioEntityExtractor는 Presidio의 Analyzer Engine을 사용해 문서 텍스트를 스캔하고 이름, 이메일 주소, 전화번호 등 엔티티를 식별해요.

이 추출기는 문서 텍스트를 수정하지 않아요. 대신 감지된 엔티티를 구조화된 메타데이터로 추가해서, 원본 내용을 바꾸지 않고 PII 발견 결과를 검사하거나 조치할 수 있게 해 주죠. 어떤 PII가 있는지 감사한 뒤 어떻게 처리할지 결정하고 싶을 때 유용해요. 예를 들어 문서를 검토 큐로 라우팅하거나, PII 발견을 로깅하거나, 조건부로 익명화를 적용할 때 말이에요.

PII를 주석으로 다는 대신 직접 교체하고 싶다면, 문서용 PresidioDocumentCleaner 또는 일반 문자열용 PresidioTextCleaner를 보세요.

구성

파라미터 기본값 설명
language "en" PII 감지를 위한 ISO 639-1 언어 코드. 지원 언어에 대해 적절한 spaCy 모델이 자동 선택돼요. Presidio 지원 언어 참고
entities None 감지할 PII 엔티티 타입 목록 (예: ["PERSON", "EMAIL_ADDRESS"]). None이면 지원되는 모든 타입을 감지해요. 지원 엔티티 참고
score_threshold 0.35 감지된 엔티티가 포함되기 위한 최소 신뢰 점수(0–1)
models None 고급 오버라이드: spaCy 모델 구성의 명시적 목록 (예: [{"lang_code": "fr", "model_name": "fr_core_news_md"}]). 특정 모델 변형이나 내장 매핑에 없는 언어가 필요할 때만 사용하세요. None이면 language에 따라 모델이 자동 선택돼요

사용법

PresidioEntityExtractor를 사용하려면 presidio-haystack 패키지를 설치하세요.

pip install presidio-haystack

단독으로 사용하기

from haystack import Document
from haystack_integrations.components.extractors.presidio import PresidioEntityExtractor

extractor = PresidioEntityExtractor()
result = extractor.run(
    documents=[Document(content="Contact Alice at [email protected]")],
)
print(result["documents"][0].meta["entities"])
# [{"entity_type": "PERSON", "start": 8, "end": 13, "score": 0.85},
#  {"entity_type": "EMAIL_ADDRESS", "start": 17, "end": 34, "score": 1.0}]

파이프라인에서 사용하기

from haystack import Document, Pipeline
from haystack.components.writers import DocumentWriter
from haystack.document_stores.in_memory import InMemoryDocumentStore
from haystack_integrations.components.extractors.presidio import PresidioEntityExtractor

document_store = InMemoryDocumentStore()

indexing_pipeline = Pipeline()
indexing_pipeline.add_component("extractor", PresidioEntityExtractor())
indexing_pipeline.add_component("writer", DocumentWriter(document_store=document_store))
indexing_pipeline.connect("extractor", "writer")

indexing_pipeline.run(
    {
        "extractor": {
            "documents": [
                Document(content="Alice Smith's email is [email protected]"),
                Document(content="Call Bob at 212-555-9876"),
            ],
        },
    },
)
# Documents are stored with detected PII in doc.meta["entities"]

커스텀 파라미터 사용하기

entities를 사용해 실제로 관심 있는 PII 타입에만 감지를 제한할 수 있어요. 필요 없는 recognizer를 건너뛰므로 오탐을 줄이고 성능도 높여 주죠.

score_threshold로 정밀도-재현율 트레이드오프를 조정할 수 있어요. 기본값 0.35는 넓게 잡기 때문에 일부 오탐을 포함할 수 있어요. 각 감지 엔티티에 높은 신뢰도가 필요하면 높이고요(예: 0.7), PII를 놓치는 것이 더 큰 위험이라면 낮추면 돼요.

from haystack_integrations.components.extractors.presidio import PresidioEntityExtractor

extractor = PresidioEntityExtractor(
    language="de",
    entities=["PERSON", "EMAIL_ADDRESS"],  # only detect names and emails
    score_threshold=0.7,  # higher precision, fewer false positives
)

비영어 언어

내장 매핑에 있는 언어라면 language만 설정하면 돼요. 적절한 spaCy 모델이 워밍업 시점에 자동으로 선택되고 로드되죠.

from haystack import Document
from haystack_integrations.components.extractors.presidio import PresidioEntityExtractor

# No `models` parameter needed — de_core_news_lg is selected automatically
extractor = PresidioEntityExtractor(language="de")
result = extractor.run(
    documents=[Document(content="Kontaktieren Sie Hans Müller unter [email protected]")],
)

지원 언어와 기본 모델은 PresidioEntityExtractor.SPACY_DEFAULT_MODELS에 나열돼 있어요. 그 매핑에 없는 언어를 models 없이 사용하면 워밍업 시점에 지원 언어 코드 목록과 함께 ValueError가 발생해요.

기본이 아닌 모델 변형이나 내장 매핑 밖의 언어를 사용하려면 models를 명시적으로 전달하세요:

extractor = PresidioEntityExtractor(
    language="fr",
    models=[{"lang_code": "fr", "model_name": "fr_core_news_md"}],
)

더 알아보기 (Learn more)