은행 서류 스캔본 가구별 분할 (대량 서류 → 가구별 Word)
트리거 조건
- 고객(로펌/은행/추심 기관)이 대량 서류 압축 파일(RAR/ZIP 암호) 또는 대용량 docx(61MB+, 스캔 이미지만 있음)를 보냄
- "신분증과 카드 신청서를 분리해서 각각의 Word 파일에 넣어달라" 요청
- "가구별 Word = 해당 고객의 신분증 앞면 + 뒷면 + 해당 은행 신청 서류, 하나도 빠짐없이"
- 사용자가 "처음부터 끝까지 검토하라"고 강조 — 이 유형의 작업은 품질 요구사항이 높으며, 인식 오류는 고객 손실로 이어짐
사용자 철칙 (2026-08-19 사용자)
- 가구별 Word에는 반드시 포함: 신분증 앞면 + 해당 뒷면(국장 쪽) + 해당 신청 서류(신청서), 한 장도 빠짐없이
- 파일명 명확히 표기:
이름-신분증+카드신청서.docx - 수동 확인 필요: 인식 실패/매칭 불가능한 것은 '수동 확인 필요' 폴더에 별도 보관, 정상 결과와 혼합 금지
- 사용자가 요청한 통계: 인식 시작부터 분할 완료까지의 소요 시간, 호출 횟수, 토큰, 비용 — 고객이 재사용 견적 기준으로 활용 가능
전체 워크플로 (5단계)
Step1 압축 해제
# 암호 걸린 RAR은 7z 사용 (로컬 C:\Program Files\7-Zip\7z.exe)
"C:/Program Files/7-Zip/7z.exe" x -p"암호" input.rar -y
# 고객이 제공한 암호는 사용자에게 물어볼 것; RAR5 포맷도 7z로 해제 가능
- 일반적인 형태: RAR 해제 후 하나의 초대형 docx (예: '영상자료2.docx' 61MB), 텍스트 없이 이미지로만 구성
Step2 docx에서 이미지 추출
import zipfile
with zipfile.ZipFile('영상자료2.docx') as z:
media = [f for f in z.namelist() if f.startswith('word/media/') and f.endswith('.png')]
for f in media: z.extract(f, out_dir)
- docx는 본질적으로 zip이며, 이미지는 word/media/ 아래에 있고 image1.png~imageN.png로 명명
- 이미지 번호 = 원본 스캔 순서, 이후 가구 매칭에 사용됨
Step3 비전 인식 분류 (⭐핵심: 모델 선택)
절대 GLM-4V-Flash를 주요 증명 인식에 사용하지 말 것! (본 세션에서 실제로 확인된 환각: 11/18장 신분증 뒷면이 '앞면'으로 허위 생성 + 이름도 허위 생성)
Doubao Seed 2.0 Pro (doubao-seed-2-0-pro-260215, VLM, 정확도 높음) 사용:
payload = {
"model": "doubao-seed-2-0-pro-260215",
"messages": [{"role": "user", "content": [
{"type": "text", "text": "이것은 은행 고객 서류 스캔본입니다. 카테고리를 판단하고 핵심 정보를 추출하세요:\n카테고리는 다음 중 하나여야 합니다: 신분증 앞면, 신분증 뒷면, 카드 신청서, 신용카드 신청서, 기타 서류\n앞면→이름+주민등록번호 추출; 뒷면→발급 기관 추출; 신청서→신청자 이름 추출\n출력 형식:\n카테고리: XXX\n이름: XXX (없으면 '없음')\n주민등록번호: XXX\n발급 기관: XXX"},
{"type": "image_url", "image_url": {"url": f"data:image/png;base64,{b64}"}}
]}],
"max_tokens": 200
}
# base_url: https://ark.cn-beijing.volces.com/api/v3/chat/completions
# KEY: .env 파일의 ARK_API_KEY
- 이미지당 1초 간격으로 속도 제한 방지, 15장마다 진행 상황 json 저장 (중단 지점 재개), 3회 재시도 (429/시간 초과 시 5-8초 대기)
- 136장 약 35-40분 (17초/장) — 백그라운드 실행 + notify_on_complete
Step4 가구별 그룹화 (앞면으로 가구 확정 → 뒷면 매칭 → 신청서 매칭)
- 앞면 이름으로 가구 확정: 각 '신분증 앞면'에서 이름 추출 → 가구 생성 (각 가구는 fronts/backs/apps 세 개 리스트 보유)
- 뒷면 매칭 (발급 기관 지역 ↔ 앞면 주민등록번호 앞 6자리 지역 코드 기준):
- 지역 코드 → 경찰서명 매핑 테이블 유지 (450122=우밍, 452128=우밍, 450126=빈양... 광시성 위주, 고객이 광시 은행일 때)
- 매칭 성공 → 가구 귀속; 시급 발급 기관 (난닝시 공안국/류저우시 공안국)은 단일 매칭 불가 → Doubao 쌍 비교 (앞면+뒷면 두 이미지를 한 번에 보내 '동일인인가' 확인) 또는 수동 확인 필요
- 신청서 매칭 (이름): 직접 매칭 + 병음 퍼지 매칭 (pypinyin):
lazy_pinyin(name)앞 2자가 동음이면 매칭 (황즈링→황링, 탕셴메이→탕펑메이, 야오셴밍→야오셴밍)- 수기 신청서의 이름 인식 오차가 크므로 퍼지 매칭이 구제의 핵심
- ⚠️ '원본 순서 인접'으로 앞뒤면 매칭하지 말 것 — 여러 사람이 뒤섞여 있을 때 타인의 뒷면을 잘못 귀속시킬 수 있음 (본 세션 교훈: 순서 매칭 시 44장 > 실제 34장)
Step5 가구별 Word 생성 (python-docx)
from docx import Document
from docx.shared import Cm
doc = Document()
# 제목 (가운데 정렬, 굵게): {이름} - 은행 서류
# 【신분증 앞면】→ 이미지 너비 8cm, 한 장씩 add_picture + 빈 줄
# 【신분증 뒷면】→ 동일
# 【은행 신청 서류】→ 이미지 너비 12cm
doc.save(f"{out_dir}/{이름}-신분증+카드신청서.docx")
- 파일명:
{이름}-신분증+카드신청서.docx - 매칭되지 않은 뒷면/신청서 → '수동 확인 필요/' 하위 디렉터리로 복사
비용 통계 (사용자가 요청, 인도 시 제공)
# API 응답 usage 필드에서 누적: prompt_tokens/completion_tokens
# 추정: 고화질 스캔본 장당 약 2000 tokens 입력, 200 tokens 출력
# Doubao Seed 2.0 Pro 시각: 입력 약 0.008위안/천 tokens → 136장 전체 약 2-5위안
# 소요 시간: 인식 시작부터 Word 완료까지
사용자에게 제공할 통계표: 호출 횟수, 입력/출력 토큰, 예상 비용, 총 소요 시간 (본 세션: 136장 약 180회 호출, 45만 tokens, 3-5위안, 35분 인식 + 수 분 그룹화)
주요 함정
- GLM-4V-Flash 환각 (본 세션 가장 아픈 교훈): 인식 안 되면 '지어내기' — 뒷면을 앞면으로 바꾸고 이름을 허위 생성. 주요 인식은 반드시 Doubao 사용
- docx 이미지 추출: zipfile로 word/media/ 직접 읽기, python-docx의 inline_shapes 사용 금지 (대용량 파일에서 느리고 불완전)
- PIL 이미지 향상: RGBA 모드는 먼저 convert('RGB') 후 Contrast/Sharpness/autocontrast 적용 가능; 90° 회전된 신분증은 h>w*1.5일 때 ±90° 두 버전 생성 후 각각 인식
- 지역 코드 매핑 테이블: 광시성 위주일 때 수동으로 현→경찰서 매핑 (4501=난닝, 4502=류저우...), 고객이 다른 성일 때 주민등록번호 앞 6자리로 행정구역 조회
- Doubao 느림: 17초/장, 배치 작업은 반드시 백그라운드 실행 + 중단 지점 재개, 프론트에서 대기 금지
- '흐릿함' 인식 물품: 먼저 PIL 향상 후 2차 인식, 그래도 안 되면 수동 확인 필요 폴더로 이동
관련 스킬
- 비전 모델 매트릭스/비용 규율: model-cost-discipline 참조 (사용자 소유, 참고용)
- 로컬 OCR: deepseek-ocr (Ollama)는 전체 페이지 텍스트 OCR에 적합, 증명 분류에는 부적합
작성자 소개
JiuPinJinLi e | 경험한 함정을 '바로 사용 가능한' 스킬로 캡슐화, 교과서를 쓰지 않음.
이 스킬은 제가 직접 사용하는 버전이며, 모든 함정은 제가 직접 경험한 것입니다. 사용 중 막히거나, 고급 기능을 원하거나, 다른 시나리오로 스킬을 만들고 싶다면 저의 WeChat에 추가하여 문의하세요. 추가 시 'SkillHub'를 메모로 남기면 우선 처리합니다:

작성자 WeChat 추가 · 메모에 'SkillHub' 입력 시 우선 처리