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 정확도 향상보다 "안전한 자동 판정 시스템 설계"에 가깝습니다.
- OCR만으로 충분한 케이스가 대다수 — 정상 이미지는 OCR confidence가 높고 필드 추출이 안정적. 굳이 VLM을 호출할 필요 없음.
- VLM은 "애매한 경우"에만 가치 있음 — 문서 유형 불명확, OCR 필드 누락/저신뢰 등. 모든 요청에 VLM을 쓰면 latency 2.5s → 3.3s로 32% 증가.
- 숫자 필드는 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 전략
| Field | Situation | Action | Result |
Text name, bank_name 등 | Missing / Low | VLM 값 보완 (0.8) | pass 가능 |
Numeric id_number, acct_no | Missing | VLM 값 + low conf | review 유지 |
| Numeric | Low conf | OCR-VLM 정확 일치만 | 불일치 → review |
Response → Gate 영향도
| Response 필드 | G1 | G2 | G3 | G4 | 영향 방식 |
| 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 |
◈ 직접 영향 (판정 변경) ◇ 간접 참조 (조건부 사용)
서비스/운영 관점
- Request path를 OCR-only / VLM fallback으로 분리하여 latency/cost trade-off 관리
- 2단계 SSE 스트리밍으로 OCR 결과 즉시 표시 → VLM 보완 후속 전송. 사용자 체감 대기 최소화
- FastAPI 기반 서비스 구조로 외부 GPU 환경 배포 가능한 형태로 구조화
에러 처리 및 재시도
| 컴포넌트 | 재시도 | 실패 시 |
| OCR (PaddleOCR) | 최대 2회 | 503 Service Unavailable |
| VLM (classify / reread) | 최대 2회 | 503 Service Unavailable |
| HTTP 상태 | 상황 | 클라이언트 대응 |
| 200 | 정상 (pass/retake/review/invalid 모두) | decision 필드로 분기 |
| 400 | 이미지 아닌 파일 | 파일 형식 확인 |
| 503 | OCR/VLM 재시도 소진 | 잠시 후 재시도 |
| 500 | 내부 에러 | 관리자 확인 |
OCRGate — Portfolio
1 / 4
4 UI & 사용자 경험
Streamlit 기반 3-column 레이아웃. 판정별 색상 코딩, 글자별 confidence 시각화, review 시 편집 모드.
PASS 통장사본 — 은행명·계좌번호·예금주 모두 고신뢰 추출
RETAKE 신분증 (downscale) — 텍스트 인식 불가, 구체적 재촬영 가이드 제공
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
Latency & VLM Call Rate
2.5s
OCR only (36건, 46.8%)
3.3s
VLM called (41건, 53.2%)
Top Failure Modes
| Mode | Count |
| account_number not found after OCR + VLM reread | 10 |
| No required fields (account_number, name) | 6 |
| account_number confidence too low (0.50) | 6 |
| OCR extracted too little text | 3 |
| 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)
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건 변경)
| Decision | Without VLM | With VLM | Delta |
| pass | 15 | 19 | +4 |
| review | 36 | 22 | -14 |
| retake | 26 | 36 | +10 |
review → pass 4건 (불필요 수동확인 제거)
review → retake 10건 (명확한 실패 조기 식별)
review 36 → 22, 39% 감소
VLM Model Comparison (2B / 4B / 8B)
| Metric | 2B | 4B | 8B |
| Decision | p4/rv18/rt19 | p4/rv17/rt20 | p4/rv17/rt20 |
| Latency | 3.3s | 3.3s | 3.4s |
| Safe Pass Rate | 3/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 내가 기여한 부분
- 4-Gate Validation Pipeline 설계 — 문제를 "의사결정 under imperfect input"으로 정의하고 Gate별 책임을 분리
- OCR 필드 추출 heuristic 설계 — 신분증/통장사본별 필드 파싱 규칙, 이름 후보 점수화 알고리즘
- VLM fallback 조건 정의 — text/numeric 구분, 보수적 승격 정책, "불확실하면 unknown" 원칙
- FastAPI/Streamlit 기반 서비스 구현 — SSE 2단계 스트리밍, 실시간 진행 표시
- Failure mode taxonomy 설계 — 9종 degradation 생성, GT 라벨링, 7개 metric 평가 체계
- 성능 평가 및 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
OCRGate — Portfolio
4 / 4