OCRGate OCR-first Document Validation with Selective VLM Fallback

금융 문서(신분증·통장사본) 자동 검수 시스템  |  pass / review / retake / invalid_doc_type 판정

1 프로젝트 배경 / 문제 정의

금융 문서 검수에서 단순 OCR만으로는 blur/crop/glare 환경에서 안정적인 자동 판정이 어렵습니다. 반대로 VLM을 전면 적용하면 latency/cost가 커집니다. 따라서 "빠른 1차 판정 + 필요한 경우만 VLM 보조" 구조가 필요하다고 판단했습니다.

핵심 과제

input quality failure(재촬영 필요)와 semantic uncertainty(담당자 확인 필요)를 구분하는 것.
retake 남용 → UX 저하, review 남용 → 운영 비용 증가. 두 축의 균형이 시스템 가치를 결정합니다.

목표

신분증/통장사본 이미지에 대해 자동 검수 decision 제공.
pass retake review invalid
정확도뿐 아니라 latency와 운영 가능성까지 고려한 설계.

2 왜 OCR-first + Selective VLM이었는가

핵심 판단: 중요한 건 큰 모델이 아니라 fallback을 어디에 쓰지 않을지 설계하는 것. 이 프로젝트는 OCR 정확도 향상보다 "안전한 자동 판정 시스템 설계"에 가깝습니다.
  1. OCR만으로 충분한 케이스가 대다수 — 정상 이미지는 OCR confidence가 높고 필드 추출이 안정적. 굳이 VLM을 호출할 필요 없음.
  2. VLM은 "애매한 경우"에만 가치 있음 — 문서 유형 불명확, OCR 필드 누락/저신뢰 등. 모든 요청에 VLM을 쓰면 latency 2.5s → 3.3s로 32% 증가.
  3. 숫자 필드는 VLM도 보수적으로 — 주민번호·계좌번호는 OCR-VLM 정확 일치 시에만 승격. 틀린 값에 높은 confidence를 부여하는 것이 가장 위험.

3 시스템 설계: 4-Gate Pipeline

Gate 1 — 입력 유효성

이미지 읽기, 최소 크기(100px), 검은/흰 화면 검사. 실패 시 OCR 스킵.

retakenext
OCR — PaddleOCR

한국어 텍스트 추출 → 문서별 규칙으로 구조화 필드 파싱. CTC monkey-patch로 글자별 confidence.

Gate 2 — 문서 유형

키워드로 유형 판별. 불일치 → invalid. 애매 + 품질 문제 → retake. 애매 + 품질 정상 → VLM 분류.

invalidretakenext
Gate 3 — 필수 정보

필수 필드 존재 확인. 일부 문제 시 VLM reread로 보완 시도 후 재평가.

retakereviewnext
Gate 4 — 형식 + Confidence

필드별 confidence(핵심 0.7, 이름 0.6, 보조 0.5) + 글자별 0.5 미만 검사.

reviewpass

VLM Reread 전략

FieldSituationActionResult
Text
name, bank_name 등
Missing / LowVLM 값 보완 (0.8)pass 가능
Numeric
id_number, acct_no
MissingVLM 값 + low confreview 유지
NumericLow confOCR-VLM 정확 일치만불일치 → review

Response → Gate 영향도

Response 필드G1G2G3G4영향 방식
quality.blur_score<100 → flag, ambiguous+blur → retake
quality.low_resolution<100px → flag, ambiguous+lowres → retake
ocr.raw_text (키워드)문서 유형 판별. 불일치 → invalid
ocr.raw_text (길이)<10자 → retake
fields[].value 존재전무 → retake, 일부 누락 → VLM reread
fields[].confidence임계값 미달 → review
fields[].char_confidences글자별 <0.5 → review
id_number 형식\d{6}-\d{7} 불일치 → review

◈ 직접 영향 (판정 변경)   ◇ 간접 참조 (조건부 사용)

서비스/운영 관점

  1. Request path를 OCR-only / VLM fallback으로 분리하여 latency/cost trade-off 관리
  2. 2단계 SSE 스트리밍으로 OCR 결과 즉시 표시 → VLM 보완 후속 전송. 사용자 체감 대기 최소화
  3. FastAPI 기반 서비스 구조로 외부 GPU 환경 배포 가능한 형태로 구조화

에러 처리 및 재시도

컴포넌트재시도실패 시
OCR (PaddleOCR)최대 2회503 Service Unavailable
VLM (classify / reread)최대 2회503 Service Unavailable
HTTP 상태상황클라이언트 대응
200정상 (pass/retake/review/invalid 모두)decision 필드로 분기
400이미지 아닌 파일파일 형식 확인
503OCR/VLM 재시도 소진잠시 후 재시도
500내부 에러관리자 확인
OCRGate — Portfolio 1 / 4

4 UI & 사용자 경험

Streamlit 기반 3-column 레이아웃. 판정별 색상 코딩, 글자별 confidence 시각화, review 시 편집 모드.

PASS
PASS  통장사본 — 은행명·계좌번호·예금주 모두 고신뢰 추출
RETAKE
RETAKE  신분증 (downscale) — 텍스트 인식 불가, 구체적 재촬영 가이드 제공
REVIEW
REVIEW  신분증 (glare) — 주소 글자별 confidence 낮음 표시. OCR vs VLM 불일치 사유. 편집 모드로 담당자 수정 가능.

5 핵심 기술적 의사결정

1. Gate 2 invalid_doc_type 조건 재설계
초기에는 OCR 텍스트 부족이 invalid_doc_type으로 오판되는 문제가 발생했습니다. VLM 단독으로 invalid 판정을 내리지 못하게 하고, 반대 타입의 strong OCR signal이 있을 때만 invalid를 허용하도록 변경. 결과: invalid_doc_type 오판 0건 달성.
2. review를 줄이는 것이 아닌 unsafe pass를 줄이는 방향
금융 서비스에서는 review가 많은 것보다 잘못된 pass가 위험합니다. review를 줄이는 대신 pass 판정의 정확성(Safe Pass Rate)을 핵심 지표로 설정했습니다.
3. 모든 요청에 VLM을 적용하지 않음
ambiguity case에만 selective fallback. OCR-only path(46.8%)는 평균 2.5s, VLM path(53.2%)는 3.3s. 정상 이미지 대부분은 VLM 없이 빠르게 pass.
4. VLM 2B/4B/8B 비교 → 소형 모델 활용 가능성 확인
VLM 호출 대상 41건에서 세 모델 모두 동일한 decision 분포(pass 5, review 18, retake 18). 4B가 latency 최적(3.0s). 모델 크기 영향이 작음을 확인하고 소형 모델 활용 가능성을 도출했습니다.
OCRGate — Portfolio 2 / 4

6 성능 평가 결과

77 samples (valid 7장 + 9종 degradation) · Ground truth 라벨링 기반 정량 평가

Decision Distribution

pass
19
24.7%
review
22
28.6%
retake
36
46.8%
invalid
0.0%

Latency & VLM Call Rate

2.5s
OCR only (36건, 46.8%)
3.3s
VLM called (41건, 53.2%)

Top Failure Modes

ModeCount
account_number not found after OCR + VLM reread10
No required fields (account_number, name)6
account_number confidence too low (0.50)6
OCR extracted too little text3
No required fields (name, id_number)3

Per-folder Decision Distribution

Folder
Pass
Review
Retake
Latency
valid
6
1
0
2.6s
blur
0
0
7
2.5s
compression
3
0
4
4.0s
crop
0
1
6
2.2s
crop_bottom
3
4
0
2.9s
crop_left
0
2
5
3.1s
crop_top
0
2
5
3.0s
downscale
0
2
5
3.1s
glare
1
4
2
2.9s
low_contrast
3
4
0
2.8s
rotation
3
2
2
2.8s

Safe Pass Rate

94.7%
Safe Pass Rate (18/19)
100%
account_number
88.9%
id_number
Safe Pass Rate = (pass AND 핵심 필드 GT 일치) / 전체 pass
1건 unsafe: compression 열화로 name/id_number 오인식 (김유스비→김유수미, 960201→950201)
OCRGate — Portfolio 3 / 4

7 VLM Effect

VLM 도입 전후 decision 변화 (14건 변경)

DecisionWithout VLMWith VLMDelta
pass1519+4
review3622-14
retake2636+10
review → pass 4건 (불필요 수동확인 제거)
review → retake 10건 (명확한 실패 조기 식별)
review 36 → 22, 39% 감소

VLM Model Comparison (2B / 4B / 8B)

Metric2B4B8B
Decisionp4/rv18/rt19p4/rv17/rt20p4/rv17/rt20
Latency3.3s3.3s3.4s
Safe Pass Rate3/4 (75.0%) — 동일

8 실패 사례와 개선 과정

1. invalid_doc_type 오판 문제
초기에는 OCR 텍스트가 부족한 이미지가 invalid_doc_type으로 잘못 분류됨. VLM 단독 판정을 금지하고 strong OCR signal을 요구하도록 Gate 2를 재설계. → invalid_doc_type 오판 0건 달성.
2. 통장 crop에서 은행명이 name으로 오인
crop된 통장사본에서 "농협"이 name 필드로 추출되는 실패 케이스 발견. hard/soft keyword 분리, 라벨 중심 추출 전략의 필요성을 도출.
3. compression에서 이름 오인식
JPEG quality=5 환경에서 "홍길동"→"울을", "김유스비"→"김유수미" 등 name 오인식. compression은 OCR에 직접적인 글자 변형을 일으키며 blur보다 탐지가 어려움을 확인.

9 내가 기여한 부분

  1. 4-Gate Validation Pipeline 설계 — 문제를 "의사결정 under imperfect input"으로 정의하고 Gate별 책임을 분리
  2. OCR 필드 추출 heuristic 설계 — 신분증/통장사본별 필드 파싱 규칙, 이름 후보 점수화 알고리즘
  3. VLM fallback 조건 정의 — text/numeric 구분, 보수적 승격 정책, "불확실하면 unknown" 원칙
  4. FastAPI/Streamlit 기반 서비스 구현 — SSE 2단계 스트리밍, 실시간 진행 표시
  5. Failure mode taxonomy 설계 — 9종 degradation 생성, GT 라벨링, 7개 metric 평가 체계
  6. 성능 평가 및 rule 개선 — invalid_doc_type 오판 제거, Gate 2 재설계, 필드별 confidence 임계값 조정

10 최종 인사이트

1. 중요한 건 큰 모델이 아니라 fallback을 어디에 쓰지 않을지 설계하는 것.
2. 이 프로젝트는 OCR 정확도 향상이 아닌 "안전한 자동 판정 시스템 설계"에 가까움.
3. 금융 서비스에서는 review를 줄이는 것보다 unsafe pass를 줄이는 게 더 중요.
4. VLM 2B/4B/8B 비교에서 decision/Safe Pass Rate 차이 미미. 소형 모델로도 충분한 fallback 품질 확보 가능.

11 Known Limitations

이름 추출 Heuristic

bbox 없이 텍스트 순서 기반. line order 깨지면 오인식.
→ bbox 좌표 기반 후보 선택

은행명 Exact Match

하드코딩 리스트. OCR 오인식 시 실패.
→ fuzzy matching 도입

Glare 감지 OFF

흰 배경 구분 불가로 비활성화.
→ gradient 기반 분석

계좌번호 Partial Match

exact match 기준. service-acceptable partial match 필요 가능성.

Tech Stack

FastAPI

REST + SSE

Streamlit

Web UI

PaddleOCR

Korean OCR

Qwen3-VL

VLM 2B

OCRGate — Portfolio 4 / 4