OpenCV, Presidio, LangGraph를 활용한 제로 트러스트 문서 파이프라인 구축 가이드
요약
LLM 애플리케이션에서 민감한 개인 식별 정보(PII)가 외부로 유출되는 위험을 방지하는 '엣지 게이트키퍼' 구축 가이드입니다. OpenCV와 Tesseract를 이용해 로컬에서 원본 문서를 처리하고, Presidio 및 spaCy를 활용하여 PII를 마스킹합니다. LangGraph는 이 과정을 복원력 있는 상태 기계로 오케스트레이션합니다.
핵심 포인트
- OpenCV/Tesseract로 로컬 비전 및 OCR 수행
- Presidio/spaCy로 LLM 전송 전 PII 결정론적 마스킹
- LangGraph를 사용해 안정적인 상태 기계 파이프라인 구축
- 신분증 등 민감 데이터 처리에 적합한 아키텍처 제시
LLM 애플리케이션을 구축할 때, 사용자 데이터를 프롬프트나 RAG 데이터베이스에 바로 전달하는 경우가 많습니다. 하지만 그 데이터가 여권, 운전면허증, 또는 의료 기록이라면 어떨까요? 원본 신분 문서를 외부의 신뢰 경계(trust boundary)를 넘어 LLM API로 전송하는 것은 엄청난 개인 정보 보호 위험을 초래합니다.
이 튜토리얼에서는 오픈 소스 '엣지 게이트키퍼(edge gatekeeper)'인 SecureKiosk AI를 구축할 것입니다. 로컬 컴퓨터 비전과 NLP를 사용하여 신분 문서를 가로채고, 텍스트를 추출하며, 이 데이터가 LLM에 도달하기 전에 개인 식별 정보(PII)를 결정론적으로 마스킹합니다.
사용할 기술 스택은 다음과 같습니다:
- OpenCV & Tesseract (컴퓨터 비전 및 OCR): 이미지 노이즈를 정리하고 원본 텍스트를 로컬에서 추출하는 데 사용합니다.
- Microsoft Presidio & spaCy (NLP): 메모리 내 민감한 PII를 감지하고 삭제(redact)하는 데 사용합니다.
- LangGraph (오케스트레이션): 파이프라인을 복원력 있는 상태 기계(state machine)로 관리하는 데 사용합니다.
- Streamlit: 깔끔하고 인터랙티브한 프런트엔드를 구축하는 데 사용합니다.
파이프라인 아키텍처 (Pipeline Architecture)
텍스트 추출 결과가 좋지 않을 때 충돌하는 선형적이고 취약한 Python 스크립트에 의존하기보다는, 이 파이프라인은 상태 기계(state machine)로 작동합니다:
아키텍처 파이프라인 (The Architecture Pipeline)
시작해 봅시다!
1단계: 환경 설정 (Setting Up the Environment)
네이티브 컴퓨터 비전과 OCR을 수행하기 때문에, Python 패키지 외에 OS 레벨의 종속성(dependencies)이 필요합니다.
1. 시스템 종속성:
Ubuntu/Debian을 사용하는 경우, 비전 및 OCR용 C 라이브러리를 설치해야 합니다:
sudo apt-get update
sudo apt-get install -y tesseract-ocr libgl1 libglib2.0-0
2. Python 환경:
가상 환경(virtual environment)을 생성하고 핵심 패키지를 설치합니다. (호환성을 위해 Python 3.11 사용을 강력히 권장합니다.)
💡 전문가 팁: OpenCV는 현재 NumPy 1.x를 기반으로 컴파일되었기 때문에 numpy<2.0.0 버전을 고정해야 합니다. NumPy 2.0 이상으로 업그레이드하면 CV 파이프라인이 충돌할 수 있습니다!
# requirements.txt
numpy<2.0.0
opencv-python-headless==4.9.0.80
...
2단계: '눈' (OpenCV & Tesseract)
신분증의 원본 사진은 지저분합니다. 빛 반사, 워터마크, 나쁜 조명 등이 있습니다. 만약 이러한 원본 이미지를 OCR(광학 문자 인식) 엔진에 바로 입력하면 텍스트 추출이 실패할 것입니다. 우리는 OpenCV를 사용하여 이미지를 전처리해야 합니다.
src/cv/processor.py와 src/ocr/extractor.py 파일을 생성합니다. 이미지의 색상을 그레이스케일로 변환하고, 가우시안 블러(Gaussian blur)를 적용하며, 적응형 이진화(adaptive binarization)를 사용하여 텍스트가 명확하게 드러나도록 만듭니다.
import cv2
import numpy as np
import pytesseract
...
3단계: '방패' (제로 트러스트 PII 마스킹)
이제 원본 텍스트를 얻었으므로, 이를 반드시 정제해야 합니다. 우리는 spaCy의 개체명 인식(NER) 기능을 활용하는 Microsoft Presidio를 사용할 것입니다.
정규 표현식 대신 Presidio를 사용하는 이유?
정규 표현식(Regex)은 이메일 주소나 전화번호 같은 고정된 패턴을 일치시키지만, 변동 가능한 문맥(예: 사람 이름, 실제 주소, 조직 개체 등)에서는 실패합니다. Presidio는 정규 표현식 패턴 인식과 spaCy의 개체명 인식(NER), 문맥 단어, 체크섬 검증을 결합합니다.
변환 예시
INPUT:
Issued to: Alex Vance
Passport No: P9482014
...
아키텍처 참고 사항: 우리는 Presidio가 가벼운 en_core_web_sm 모델(~12MB)을 사용하도록 특별히 구성하고 있습니다. 만약 대형 모델(~580MB)로 기본 설정하면, 무료 클라우드 티어에 배포할 때 애플리케이션이 메모리 부족(Out-Of-Memory, OOM) 충돌을 겪을 가능성이 높습니다.
src/privacy/redactor.py를 생성합니다:
from presidio_analyzer import AnalyzerEngine
from presidio_analyzer.nlp_engine import NlpEngineProvider
from presidio_anonymizer import AnonymizerEngine
...
✓ 원본 PII가 LLM으로 전송되지 않음
이것이 파이프라인의 핵심 보안 보장 사항입니다: 모든 문서 처리와 PII(개인 식별 정보) 마스킹은 다운스트림 AI 시스템이 콘텐츠를 받기 전에 로컬에서 발생합니다.
4단계: 두뇌 (LangGraph 오케스트레이션)
취약하고 선형적인 스크립트 대신, LangGraph를 사용하여 이러한 단계를 오케스트레이션할 것입니다. 상태 기계(state machine)는 파이프라인이 발전함에 따라 OCR 실패, 재시도 및 대체 처리 경로를 처리하기 위한 기반을 제공합니다.
src/graph.py 생성:
from typing import TypedDict
from langgraph.graph import StateGraph, START, END
...
5단계: 인터페이스 (Streamlit)
마지막으로, LangGraph 파이프라인을 깔끔한 Streamlit 인터페이스로 감쌉니다. app.py 생성:
import streamlit as st
from src.graph import document_pipeline
...
Streamlit Community Cloud 배포하기
# packages.txt
tesseract-ocr
libgl1
...
배포 설정에서 Python 3.11을 선택하고, '배포(deploy)'를 누르면 이제 라이브한, 엣지 실행형 제로 트러스트 AI 파이프라인을 갖게 됩니다!
성능 벤치마크 및 엣지 발자국(Edge Footprint)
주요 설계 목표는 메모리 부족(OOM) 오류 없이 경량 컴퓨팅 환경에서 로컬 인-메모리 실행하는 것이었습니다:
- RAM 사용량: 안정 상태 약 145 MB (더 무거운 트랜스포머 체크포인트를 피하고 en_core_web_sm을 사용하여 달성).
- 처리 지연 시간(Processing Latency): 표준 2코어 CPU 환경에서 페이지당 320 ms ~ 650 ms.
- 네트워크 이그레스(Network Egress): PII 제거 전 0 바이트.
이러한 벤치마크는 GPU 가속 없이 표준 2코어 CPU 환경에서 수집되었습니다.
개인 정보 보호 규제가 더욱 엄격해지고 조직들이 LLM을 점점 더 채택함에 따라, 추론(inference) 전에 데이터 노출을 최소화하는 아키텍처가 선택이 아닌 필수 요소가 될 것입니다.
앞으로 사생활 보호를 최우선으로 하는 AI 파이프라인에 가장 중요하다고 생각하는 기능은 무엇인가요? 아래에 의견을 남겨주시거나, GitHub에서 전체 소스 코드를 확인해 보세요.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기
