← 아카이브로 돌아가기 · 함께 보기: 제20대 아카이브 · 제21대 아카이브
개표상황표 디지털화 파일럿 보고서
일자: 2026-10-23 · 프로젝트: electoral-hub-510410 (GCP) · 작업 위치: ~/workspace/digitization_pilot/
목적: 20대(2022)·21대(2025) 대통령선거 개표상황표 전체 아카이브(36,326쪽) 디지털화에 앞서, 추출 엔진 2종(Document AI OCR + 휴리스틱 파서 vs Gemini 2.5 Flash 비전)을 검증된 정답과 대조해 정확도·소요시간을 실측한다.
1. 요약
| 구분 |
엔진 |
필드 정확도 |
쪽 단위 완전일치 |
비고 |
| 21대 (450필드) |
Gemini 2.5 Flash |
100.0% (450/450) |
30/30쪽 |
인쇄·손글씨 모두 정확 |
| 21대 (450필드) |
Document AI + 파서 |
74.7% (336/450) |
2/30쪽 |
인쇄(분류) 100%, 손글씨 최종 54.7% · 재확인 69.3% |
| 20대 최종 4후보 (120필드, 선관위 공식결과 대조) |
Gemini 2.5 Flash |
97.5% (117/120) |
27/30쪽 |
오류 3건 모두 손글씨 숫자 1자리 오독 |
| 20대 최종 4후보 |
Document AI + 파서 |
40.0% (48/120) |
7/30쪽 |
손글씨 열에서 토큰 누락 다수 |
결론: 전체 실행은 Gemini 추출 + 산술 제약 검증(기존 검증 프로토콜) 조합으로 가는 것이 맞다. 정확도—특히 손글씨 열—에서 격차가 결정적이다.
2. 방법
표본
- 21대 30쪽: 검증 완료된 전사 정답 파일(
k21_precinct_classified_recheck.csv)에서 서울 강서구·광진구·서초구 각 10쪽 무작위 추출(판독방식 자동/수동, 제외 사유 없음, 15개 필드 전부 존재). 원본 PDF에서 200 DPI PNG로 추출.
- 20대 30쪽: 대구 달서구(15쪽)·수원시 장안구(15쪽) 개표상황표 PDF에서 추출. 정답은 선관위 공식 투표구별 개표결과(
results.csv)와 쪽 단위 대조로 확정 — 투표구명 + 인쇄 총계(투표지총수) 일치를 요구했고, 관내사전표는 총계가 유일하게 일치하는 공식 행과 매칭(최종값으로 재확인됨).
추출 필드
- 21대: 후보 5명 × (분류·최종·재확인) = 15필드. 개표상황표에서 분류 열은 인쇄, 최종·재확인 열은 손글씨다.
- 20대: 주요 4후보(이재명·윤석열·심상정·허경영)의 분류·재확인·최종 + 분류합계·미분류(재확인대상 총수)·투표지총수.
엔진
- A) Document AI OCR_PROCESSOR(us, pretrained-ocr v2.1)로 쪽별 동기 처리 → 토큰 좌표 기반 휴리스틱 파서(후보명 앵커로 쪽별 수평 이동 보정 + 행 간격 적응형 허용오차). 원본 OCR 텍스트와 응답 JSON을 쪽별로 보존했다.
- B) Gemini 2.5 Flash (Vertex AI, us-central1): 쪽 이미지를 인라인으로 보내고 필드만 담은 JSON만 반환하도록 강제(temperature 0, thinking budget 0).
채점
- 21대: 15필드 전부를 전사 정답과 정확일치로 채점.
- 20대: 최종 4필드는 선관위 공식결과와 대조(외부 정답). 분류·재확인 필드는 외부 정답이 없어 ① 산술 삼중식(최종 − 분류 = 재확인) 자기일관성, ② 공식 최종값에 고정하는 방식(분류 = 공식최종 − 읽은 재확인)으로 간접 채점했다.
3. 결과 상세
21대 (정답: 검증 전사)
| 엔진 |
분류(인쇄) |
재확인(손글씨) |
최종(손글씨) |
전체 |
쪽 완전일치 |
| Gemini |
100% |
100% |
100% |
100% (450/450) |
30/30 |
| DocAI+파서 |
100% |
69.3% |
54.7% |
74.7% (336/450) |
2/30 |
- DocAI의 인쇄 숫자 인식은 완벽했다(분류 150/150, 분류합계 행도 30/30). 실패는 전부 손글씨 열: 대표 오류 — 최종_이재명 436→36, 최종_김문수 495→35(첫 자리 토큰 탈락), 다수의 null(토큰 미검출). 손글씨 숫자의 첫 자리가 표의 괘선과 붙으면 토큰이 분리·누락되는 패턴이다.
20대 (정답: 선관위 공식 투표구 결과)
| 지표 |
Gemini |
DocAI+파서 |
| 최종 4후보 필드 정확도 |
97.5% (117/120) |
40.0% (48/120) |
| 최종 완전일치 쪽 |
27/30 |
7/30 |
| 투표지총수(인쇄) 정확도 |
100% (30/30) |
86.7% (26/30) |
| 산술 삼중식 성립률 (최종−분류=재확인) |
99.2% |
97.7% |
| 분류합계+미분류=총계 성립 쪽 |
29/30 |
11/30 |
| 분류 필드 간접 정확도 (공식최종 고정) |
96.6% |
44.1% |
- Gemini 오류 3건(전부 손글씨 최종 열): 최종_윤석열 4,374→4,256 / 3,122→3,227(백의 자리 숫자 혼동), 최종_심상정 152→151(1 차이). 모두 대형 관내사전표에서 발생했다.
- DocAI는 20대에서도 인쇄 열은 강했지만(총수 86.7%) 손글씨 최종 열은 40%에 그쳤다. 삼중식 성립률(97.7%)이 높은데도 값이 틀린 경우가 많았는데, 이는 파서가 옆 열(확인결과 a)을 최종으로 읽는 등 일관되게 틀린 열을 집는 오류가 있었기 때문이다 — 자기일관성만으로는 검출이 안 되고 외부 대조가 필요하다는 방증이다.
4. 권고
- 주 엔진은 Gemini 2.5 Flash. 인쇄·손글씨를 가리지 않는 정확도(21대 100%, 20대 최종 97.5%)가 단독 실행을 정당화한다. Document AI + 좌표 파서는 손글씨에서 무너져 주 엔진이 될 수 없다.
- 반드시 산술 제약 검증층과 결합할 것 (기존 검증 전사 프로토콜과 동일):
- 쪽별 검사: 후보별 최종 − 분류 = 재확인; 분류합계 + 미분류 = 투표지총수; 투표지총수 = 선거인수 대조열과 정합.
- 외부 대조: 선관위 공식 투표구 결과와 최종값 대조(20대는 전 투표구 보유, 21대도 공식 결과로 동일 대조 가능).
- 제약 또는 외부 대조에 실패한 쪽만 재독(프롬프트 변형/타 모델) → 그래도 실패하면 사람 확인 큐로. 파일럿에서 Gemini 오류 3건은 모두 이 층에서 걸러지는 유형이다(삼중식은 성립해도 공식값과 불일치).
- Document AI의 역할은 보조로: 인쇄 열(분류·총계)의 독립 제2판독과 투표구 식별(이번 파일럿의 표본 매칭에 실제로 사용됨)에는 충분히 강하다. 전 쪽 교차검증보다는 제약 실패 쪽의 판독 보조로 한정한다.
- 실행 순서: 21대(정답 대조 체계가 이미 있음) → 20대 순으로 돌리고, 구·시·군 단위로 제약 통과율을 모니터링해 통과율이 낮은 지역부터 사람 확인을 배치한다.
5. 한계와 주의
- 표본 편향: 21대 표본은 원 전사 파이프라인에서 이미 검증·채택된 행(읽기 수월한 쪽) 중심이라 전체 실행 정확도는 이보다 다소 낮을 수 있다. 20대 표본은 2개 구에 한정된다. 제약 검증층이 이 꼬리를 관리한다는 전제의 수치로 읽어야 한다.
- DocAI 파서는 고정 열 대역 + 쪽별 이동 보정의 휴리스틱이다. 스캔 변형이 큰 지역(수원 장안구 사례)에서는 열 보정 없이는 총수 정확도가 86.7%까지 떨어졌다 — 파서를 더 다듬으면 개선 여지는 있으나, Gemini 격차를 뒤집기는 어렵다.
- 이 파일럿에서는 전체 배치를 실행하지 않았다. Document AI 프로세서(
tally-ocr-pilot)는 ENABLED 상태로 남아 있으며, 전체 실행 방침이 정해지면 삭제하거나 그대로 쓰면 된다.
6. 산출물 (~/workspace/digitization_pilot/)
manifest21.json, manifest20.json — 표본 쪽 목록과 정답
samples21/, samples20/ — 표본 PNG(200 DPI)
docai_raw/, docai_raw_cand20/ — Document AI 원본 응답 JSON + 재구성 텍스트(쪽별)
results_docai21_v2/, results_docai20/ — DocAI 파서 출력
gemini_raw21/, gemini_raw20/ — Gemini 원응답·파싱 결과·토큰 사용량(쪽별)
results/scoring_summary.json — 채점 집계와 오류 목록
- 실행 스크립트:
run_docai.py, reparse_v2.py, run_gemini.py, score.py
7. 전수 실행 완료 (2026-10-24 20:00 EDT)
파일럿 권고에 따라 2026-10-23 22:54 EDT부터 시작된 전수 실행이 2026-10-24 20:00 EDT에 완료됐다. 최종 실적: 중복 제거 기준 36,342쪽 (21대 18,965 + 20대 17,377), 검증된 대조 기준 필드 일치율 98.8%. 자세한 내용은 최종 보고서를 참조한다.
최종 보고서: 전수 디지털화 실행 보고서 (양 아카이브에 동일본 게재) — 쪽·엔진별 처리량, 제약 통과율, 선관위 대조 일치율, 실패 사유 분해, 매니페스트 대조 결과, 21대 교차 검증, 수동 검토 잔량 포함.
디지털화 데이터: 각 아카이브 results/digitization.csv (쪽별 1행, 중복 제거).