---
title: 종이 한 장을 AI는 어떻게 읽을까 — OCR 112년을 따라가며, 스캔 문서에서 결론까지 뽑는 장난감을 만들었다
url: https://oosioo.com/p/%EC%A2%85%EC%9D%B4-%ED%95%9C-%EC%9E%A5%EC%9D%84-ai%EB%8A%94-%EC%96%B4%EB%96%BB%EA%B2%8C-%EC%9D%BD%EC%9D%84%EA%B9%8C
date: 2026-10-19T12:01:38+00:00
author: SYSOP
summary: 사진 찍거나 스캔한 문서에서 글자를 읽어 내는 OCR은 1914년 글자를 소리로 바꾸던 기계에서 시작해, 지금은 1B 안팎의 작은 모델이 표와 수식까지 마크다운으로 옮기고 Claude Code 같은 도구에 MCP로 붙는 단계에 왔다. 그 112년을 정리하고, 스캔된 영수증·청구서·명세서를 흑백으로 나누고, 글자를 찾고, 블록과 읽는 순서를 정하고, 글자를 맞히고, 표와 키-값을 데이터로 바꿔 검산까지 하는 문서 읽기 해부기를 한 파일로 만들었다.
---
# 종이 한 장을 AI는 어떻게 읽을까 — OCR 112년을 따라가며, 스캔 문서에서 결론까지 뽑는 장난감을 만들었다

![문서 읽기 해부기로 가상의 전기요금 청구서를 읽은 모습. 왼쪽은 그림자와 잡음이 섞인 스캔 이미지, 가운데는 제목·키-값 줄·그래프·표를 상자로 나누고 읽는 순서를 번호로 매긴 레이아웃, 오른쪽은 읽어 낸 숫자로 계산한 결론 카드다. 금액 열의 합이 청구 금액 78,350원과 맞고, 이번 달 412 kWh는 지난달보다 23.4% 적다고 적혀 있다](/uploads/64633a83ffaecd93.webp)

Claude Code에 PDF를 하나 던져 주면 표까지 정리된 마크다운이 돌아온다. 사진으로 찍은 영수증을 넣으면 합계를 뽑아 준다. 요즘은 이런 일을 따로 떼어 MCP 서버로 붙여 쓰기도 한다. PaddleOCR, MinerU, Docling 같은 이름이 개발자 도구 설정 파일에 한 줄씩 들어간다.

이 일은 생각보다 오래됐다. 기계에게 인쇄된 글자를 읽히려는 시도는 112년 전에 시작됐다. 그 사이 방법이 세 번 바뀌었고, 바뀔 때마다 사람이 정해 줘야 하는 몫이 줄었다. 그리고 그 의미는 작지 않다. 사람이 종이에 남긴 기록 대부분은 아직 이미지로만 있다. 구글은 2010년에 세상의 책을 약 1억 3천만 권으로 셌고, 그중 4천만 권 넘게 스캔했다고 2019년에 밝혔다. 그걸 글자로, 다시 표와 숫자로 바꿀 수 있어야 검색하고 계산하고 AI에게 읽힐 수 있다.

이번 회에서는 그 112년을 따라가 보고, 마지막 단계까지 흉내 내는 장난감을 만들었다. 글자를 읽는 데서 끝나지 않고, 문서의 짜임을 알아보고, 숫자를 데이터로 뽑아, 문서가 스스로 맞는지 검산하는 데까지 간다.

## 무엇을 하려 했나

1. 초창기 OCR부터 2026년 가을의 최신 모델까지, 무엇이 글자를 알아봤는지 시대별로 정리한다. 수치는 1차 출처로만 적는다.
2. 스캔된 문서를 **흑백으로 나누고 → 글자를 찾고 → 블록과 읽는 순서를 정하고 → 글자를 맞히고 → 표와 키-값을 데이터로 바꾸고 → 그 데이터로 결론을 내는** 과정을 단계마다 눈으로 볼 수 있게 만든다.
3. 설치 없이 이 글 안에서 돌아가게 한다. 스캔 상태를 일부러 망가뜨려 볼 수 있게 한다.

조사는 AI 에이전트에게 맡겼다. 특허 원문, 논문, 공식 저장소와 블로그만 출처로 삼고, 확인하지 못한 연도는 미확인으로 표시하게 했다.

## 112년을 한 장에

![OCR 112년 연표. 1914년 옵토폰, 1929년 타우셰크 읽기 기계, 1959년 수표 MICR 글자, 1965년 미국 우체국 주소 판독기, 1976년 커즈와일 읽기 기계까지가 빛·본·규칙의 시대(회색), 1989년 르쿤 CNN, 2005년 테서랙트 오픈소스, 2015년 CRNN, 2019년 CRAFT·LayoutLM, 2021년 Donut까지가 학습하는 인식기의 시대(파랑), 2023년 GPT-4V, 2025년 olmOCR·DeepSeek-OCR·PaddleOCR-VL, 2026년 1B 안팎 전용 모델이 문서 벤치 95점대에 오른 시기가 VLM 시대(주황)다](/uploads/d68ac5d8060c4961.webp)

### 빛과 본의 시대 (1914~1980년대)

**처음에는 기계가 글자를 판정하지 않았다.** 1914년 아일랜드 물리학자 푸르니에 달브가 왕립학회 회보에 발표한 옵토폰은 셀레늄 광전 소자로 인쇄된 줄을 훑어, 글자 모양에 따라 달라지는 빛의 양을 서로 다른 높이의 소리로 바꿨다. 글자를 알아듣는 건 귀에 헤드폰을 낀 사람이었다. 시각장애인을 위한 감각 바꾸기 장치였다.

![1922년 잡지 사진. 헤드폰을 쓴 여성이 책상 앞에 앉아, 잡지를 올려 둔 옵토폰 장치의 손잡이를 잡고 있다. 오른쪽에는 진공관이 꽂힌 증폭기 상자가 있다](/uploads/f9735c6e726b1c84.webp)

*옵토폰으로 잡지를 읽는 마거릿 호건. Harper's Magazine 1922년 7월호, 퍼블릭 도메인(위키미디어 공용)*

**기계가 스스로 판정하기 시작한 건 1920년대 말이다.** 오스트리아 빈의 구스타프 타우셰크가 1929년 미국에 낸 「읽기 기계(Reading Machine)」 특허(US 2,026,329, 1935년 등록, 우선권은 1928년 오스트리아)가 원리를 잘 보여 준다. 숫자 모양으로 구멍을 뚫은 원판이 돌아가고, 그 뒤에 광전 셀이 있다. 인쇄된 숫자의 그림자와 원판의 구멍이 딱 겹치는 순간 셀에 닿는 빛이 바뀌고, 그 신호로 계전기가 그 숫자를 기록한다. 미리 만든 **본(템플릿)**과 겹쳐 보고 가장 잘 맞는 것을 고르는 방식이다. 이 글의 장난감도 5단계에서 같은 일을 한다. 빛 대신 픽셀을 쓸 뿐이다.

![타우셰크 특허 US 2,026,329의 도면 1. 왼쪽에 인쇄된 숫자 카드와 렌즈, 가운데에 「PHOTO ELECTRIC CELL」이라 적힌 셀과 둘레에 숫자 모양 구멍이 뚫린 회전 원판, 오른쪽에 숫자를 기록하는 톱니바퀴와 전자석이 있다. 상단에 「Dec. 31, 1935. G. TAUSCHEK READING MACHINE Filed May 27, 1929」](/uploads/154557871874607e.webp)

*타우셰크 「Reading Machine」 미국 특허 도면(1935). 미국 특허 문서*

그 뒤 30년은 **글자를 기계에 맞추는** 쪽으로 갔다. 1959년 뱅크오브아메리카와 SRI가 만든 수표 처리 시스템 ERMA는 수표 하단에 자성 잉크로 찍은 MICR 글자를 초당 10장씩 읽었다. 1965년 11월 미국 우체국은 디트로이트에 고속 주소 판독기를 들였고, 1970년까지 9개 우체국으로 늘렸다. OCR-A, OCR-B처럼 기계가 읽기 쉽게 설계한 글꼴도 이 무렵 나왔다. 칸이 정해진 서식에 정해진 글꼴로 찍으면 본 맞추기로 충분했다.

**어떤 글꼴이든 읽겠다는 기계는 1976년에 나왔다.** 레이 커즈와일이 1976년 1월 13일 공개한 커즈와일 읽기 기계는 평판 스캐너로 책을 찍고, 여러 글꼴을 가리지 않는 옴니폰트 OCR로 읽고, 음성 합성기로 소리 내 읽었다. 반세기 전 옵토폰이 하던 일을 이번에는 기계가 끝까지 해냈다.

![검은 평판 스캐너 위에 스페인어 책이 세워져 있다. 기계 앞면에 「THE READING EDGE, A KURZWEIL READER」, 오른쪽에 「Xerox Imaging Systems」 로고가 있다](/uploads/fd037b60ffaff07d.webp)

*커즈와일 읽기 기계의 후기 모델 「The Reading Edge」. 사진 Beatrice Murch, CC BY-SA 2.0(위키미디어 공용). 1976년 첫 모델은 아니다*

### 학습하는 인식기의 시대 (1989~2022)

1989년 벨 연구소의 얀 르쿤은 손으로 쓴 우편번호를 합성곱 신경망(CNN)으로 읽었다. 본을 사람이 만드는 대신, 예시를 잔뜩 보여 주고 기계가 스스로 특징을 배우게 했다. 그가 만든 수표 판독 기술은 2000년대 초 **미국 전체 수표의 10~20%**를 읽었다고 그의 공식 약력에 적혀 있다.

인쇄 글자 쪽에서는 HP가 1985~1994년에 만든 **테서랙트**가 2005년 오픈소스로 풀렸고, 구글이 2017년까지 이어 개발했다. 2018년 4.0판에서 글자를 하나씩 자르지 않고 줄 하나를 통째로 읽는 LSTM 엔진을 넣었다. 지금도 무료 OCR의 기본값으로 쓰인다.

2015년 이후에는 단계마다 신경망이 들어섰다.

- **줄 단위 인식**: CRNN(2015)은 CNN으로 줄 이미지의 특징을 뽑고, LSTM으로 앞뒤 맥락을 보고, CTC(2006)로 글자 위치를 몰라도 학습되게 했다. 글자를 먼저 잘라야 한다는 오래된 숙제를 비켜 간 것이다.
- **글자 찾기**: EAST(2017), 네이버 클로바의 CRAFT(2019)가 사진 속 어디에 글자가 있는지를 히트맵으로 찾았다.
- **문서의 짜임**: 마이크로소프트의 LayoutLM(2019년 말 공개)은 글자와 함께 그 **좌표**를 학습시켰다. 「합계」라는 낱말과 그 오른쪽에 있는 숫자가 짝이라는 걸 위치로 안다. 표 구조는 IBM의 TableFormer(2022) 같은 모델이 맡았다.
- **OCR 없이 바로 구조로**: 네이버 클로바의 Donut(2021)은 글자를 먼저 읽지 않고 이미지에서 곧바로 구조화된 결과를 써 냈다. 메타의 Nougat(2023)은 논문 PDF를 수식까지 마크업으로 옮겼다.

이 시대의 OCR은 여러 모델을 줄줄이 이은 파이프라인이었다. 각 단계는 똑똑해졌지만, 단계 사이의 이음매에서 오류가 쌓였다.

![글자를 읽는 방법의 세 세대를 그린 흐름도. 1930~70년대는 스캔 이미지 → 글자 하나씩 자르기 → 미리 만든 본과 겹쳐 보기 → 글자. 1990~2010년대는 스캔 이미지 → 전처리 → 글자 영역 찾기(EAST·CRAFT) → 줄 단위 인식(CNN+LSTM+CTC) → 레이아웃·표(LayoutLM·TableFormer) → 글자+좌표. 2023년 이후는 페이지 이미지 → 비전 인코더와 언어 모델이 읽는 순서대로 써 내려감 → 마크다운·JSON](/uploads/13e9c1646ddefba5.webp)

### 문서를 통째로 읽는 VLM의 시대 (2023~)

2023년 9월 GPT-4V가 나오면서 범용 비전-언어 모델(VLM)이 문서를 읽기 시작했다. 다만 그해 10월 나온 평가 논문은 라틴 문자는 잘 읽지만 비라틴 문자, 손글씨 수식, 표 구조에서는 전용 OCR 모델을 넘지 못한다고 적었다.

2025년부터는 **문서 파싱만 하는 작은 VLM**이 쏟아졌다. 공통점은 페이지 이미지를 넣으면 읽는 순서대로 마크다운을 써 내려가고, 표는 HTML로, 수식은 LaTeX로 옮긴다는 것이다.

- **olmOCR**(앨런 AI 연구소, 2025년 2월, 7B): PDF를 언어 모델 학습 데이터로 바꾸려고 만들었다. 논문은 GPT-4o로 100만 쪽을 처리하면 6,240달러가 넘게 들지만 olmOCR은 176달러라고 적었다. 10월의 2판은 「이 표의 이 칸에 이 숫자가 있어야 한다」 같은 단위 테스트를 보상으로 강화학습했다.
- **DeepSeek-OCR**(2025년 10월, 약 3B): 발상이 독특하다. 긴 글을 글자 토큰으로 넣는 대신 **페이지 이미지로 찍어서 넣으면** 토큰이 훨씬 적게 든다. 논문에 따르면 글자 토큰이 이미지 토큰의 10배 안쪽이면(10배 압축) 97%를 정확히 되살렸고, 20배 압축에서도 약 60%를 맞혔다. OCR을 넘어 「AI의 긴 기억을 그림으로 압축할 수 있나」라는 질문이 됐다.
- **PaddleOCR-VL**(바이두, 2025년 10월, 0.9B): 109개 언어. 2026년 1.5판과 1.6판까지 나왔다.
- **MinerU 2.5**(상하이 AI 연구소, 2025년 9월, 1.2B): 저해상도로 먼저 레이아웃을 보고, 원래 해상도에서 영역별로 잘라 읽는 2단계다. 2026년의 Pro판은 구조는 그대로 두고 학습 데이터만 1천만에서 6,550만 건으로 늘렸다.
- 그 밖에 dots.ocr(3B), Chandra(데이터랩), GLM-OCR(0.9B), 2026년 여름의 OvisOCR2(0.8B)와 TeleOCR(1.2B)까지.

![OmniDocBench v1.6 종합 점수 막대그래프. 문서 파싱 전용 모델(파랑)인 TeleOCR(1.2B) 96.91, OvisOCR2(0.8B) 96.47, PaddleOCR-VL-1.6(0.9B) 96.34, MinerU2.5-Pro(1.2B) 95.75, GLM-OCR(0.9B) 95.22가 위에 있고, 범용 VLM(주황)인 Gemini 3 Pro 92.91, Qwen3-VL-235B 89.78, GPT-5.2 86.59가 그 아래다. dots.ocr(3B) 90.77, DeepSeek-OCR 2(3B) 90.25, olmOCR(7B) 85.74, Mistral OCR 85.66, 여러 모델을 잇는 파이프라인 Marker 78.44](/uploads/0248c1f03d274582.webp)

가장 눈에 띄는 건 크기다. 문서 파싱 벤치마크 OmniDocBench의 2026년 9월 표에서 1위부터 5위까지가 모두 **0.8B~1.2B짜리 전용 모델**이다. 2,350억 파라미터짜리 Qwen3-VL이나 GPT-5.2, Gemini 3 Pro 같은 범용 모델보다 점수가 높다. 노트북 GPU로도 돌릴 만한 크기다. 이 벤치마크의 이전 판(v1.5)에서 GPT-4o는 75.02점이었다.

### 그리고 MCP로 붙는다

이 모델들이 개발자 손에 닿는 길은 MCP(모델 컨텍스트 프로토콜) 서버다. Claude Code나 Codex 같은 에이전트에게 「이 스캔 PDF를 마크다운으로 바꿔」라는 도구를 쥐여 주는 방식이다.

| MCP 서버 | 하는 일 |
|---|---|
| [PaddleOCR MCP](https://github.com/PaddlePaddle/PaddleOCR/tree/main/mcp_server) (공식) | 글자 검출·인식(`ocr`), 레이아웃을 살린 마크다운(`pp_structurev3`), VLM 파싱(`paddleocr_vl`). 로컬로도 API로도 돈다 |
| [MinerU Open MCP](https://github.com/opendatalab/MinerU-Ecosystem) (공식) | PDF·워드·PPT·이미지를 마크다운으로. 키 없이 쓰는 무료 모드가 있다 |
| [Docling MCP](https://github.com/docling-project/docling-mcp) (IBM 계열) | 레이아웃 모델과 TableFormer로 문서를 변환한다 |
| [MarkItDown MCP](https://github.com/microsoft/markitdown/tree/main/packages/markitdown-mcp) (마이크로소프트) | 도구 하나(`convert_to_markdown`). OCR 엔진이라기보다 여러 포맷을 마크다운으로 바꾸는 변환기다 |
| [Upstage MCP](https://github.com/UpstageAI/mcp-upstage) (업스테이지) | 문서 파싱과 스키마에 맞춘 정보 추출. API 키가 필요하다 |

한국 사용자에게 남는 숙제가 하나 있다. 위 도구들의 지원 형식 목록에 한글(HWP)이 없다. 공공기관 공고 첨부는 아직 .hwp가 많아서, 실무에서는 PDF로 바꾼 뒤 읽히는 경우가 많다.

## 그래서 만든 것: 문서 읽기 해부기

아래가 만든 장난감이다. 가상의 진료비 영수증, 전기요금 청구서, 거래명세서 세 장을 브라우저에서 그리고, 스캐너를 흉내 내 그림자·잡음·번짐을 섞은 다음, 그 이미지를 일곱 단계로 읽는다. 위쪽 단추로 단계를 넘기면 왼쪽 그림과 오른쪽 설명이 바뀐다.

```map /embed/doc-ocr-2026.html 4:5
문서 읽기 해부기. 가상의 진료비 영수증·전기요금 청구서·거래명세서 가운데 하나를 고르고, 기울기·그림자·잡음·번짐 손잡이로 스캔 상태를 정한다. 1 스캔(회색 이미지) → 2 전처리(지역 문턱으로 흑백 나누기, 가로 방향 잉크 분포로 기울기 찾기) → 3 글자 찾기(잉크 덩어리와 줄, 표의 선) → 4 레이아웃(XY 자르기로 블록과 읽는 순서) → 5 글자 인식(글꼴 본과 겹쳐 보기, 잘게 쪼갠 뒤 다시 붙이기) → 6 구조화(마크다운·JSON) → 7 인사이트(검산과 계산). 5단계에서 글자를 누르면 후보와 닮은 정도가 뜬다. 아래쪽에 정답과 비교한 글자 오류율이 나온다.
```

모든 계산은 글 안에서 돈다. 바깥 라이브러리는 글꼴 하나뿐이다.

**① 스캔.** 컴퓨터가 받는 건 720×1000개의 회색 점이다. 정답 글자는 영수증 297자, 청구서 268자, 명세서 226자다.

**② 전처리.** 점마다 잉크인지 종이인지 정한다. 이미지 전체에 문턱 하나를 쓰는 오츠 방식(1979)과, 주변 25×25칸의 밝기와 얼룩을 보고 문턱을 그때그때 정하는 사우볼라 방식(2000)을 둘 다 넣었다. 그다음 잉크 점을 각도별로 돌려 가로줄마다 세어 본다. 각도가 맞으면 줄 사이가 텅 비어 막대가 가장 뾰족해진다. 2.5° 기울인 문서에서 2.50°를 찾았다.

**③ 글자 찾기.** 붙어 있는 잉크 점을 한 덩어리로 묶는다. 한글은 「시」처럼 ㅅ과 ㅣ가 떨어져 있어서 한 글자가 덩어리 여러 개다. 높이가 겹치고 가까운 덩어리를 이어 줄을 만든다. 길고 얇은 잉크는 표의 선으로, 너무 큰 덩어리는 그림이나 도장으로 뺀다.

**④ 레이아웃.** 줄·표·그림을 상자로 놓고 XY 자르기를 한다. 위아래로 빈 띠가 있으면 가로로 자르고, 좌우로 빈 띠가 있으면 세로로 자르기를 되풀이한다. 자르는 순서가 그대로 읽는 순서가 된다. 단이 둘인 전기요금 청구서에서 왼쪽 단을 다 읽고 오른쪽 표로 넘어가는 게 이 덕분이다. 글자를 읽기 전, 크기와 모양과 위치만으로 제목·키-값·문단·표·그림을 나눈다.

**⑤ 글자 인식.** 여기는 일부러 옛날 방식이다. 문서에 나오는 글자 166종을 같은 글꼴로 미리 그려 본을 만들고, 겹쳐서 가장 닮은 것을 고른다. 타우셰크의 원판과 같은 생각이다. 대신 글자 경계를 먼저 정하지 않는다. 줄을 잘게 쪼갠 뒤 「이」를 「o」+「l」로 읽을지 「이」 한 글자로 읽을지 점수로 골라 다시 붙인다(동적 계획법). 1990년대의 과분할 인식 방식이다. 숫자가 대부분인 낱말은 숫자 본만 놓고 한 번 더 읽는다.

**⑥ 구조화.** 글자만 있으면 아직 데이터가 아니다. 표는 선이 만든 칸에 글자를 넣어 행과 열로 만든다. 나머지는 「:」로 나뉘거나, **같은 높이 오른쪽에 숫자가 있는 줄**을 키-값으로 묶는다. LayoutLM이 좌표를 학습한 것과 같은 생각을 규칙으로 흉내 냈다. 결과는 마크다운과 JSON으로 나온다. VLM 문서 파서들이 내놓는 형태다.

**⑦ 인사이트.** 뽑은 숫자로 문서가 스스로 맞는지 검산하고, 사람이 물을 만한 것을 계산한다. 영수증에서는 각 열의 항목 합이 합계와 맞는지 보고, 총 진료비 116,560원 가운데 내가 낸 돈이 52,470원(45.0%)이라는 것과 비급여 비중을 낸다. 청구서에서는 사용량 증감과 1 kWh당 평균 단가(190.2원)를 낸다.

거래명세서에는 일부러 틀린 줄을 하나 넣어 뒀다. 첫 줄의 A4 복사용지 5박스 × 24,500원은 122,500원인데 112,500원으로 적었고, 공급가액·부가세·합계는 그 틀린 값에 맞춰 적었다. 합계끼리는 서로 맞으니 눈으로 훑으면 지나치기 쉽다. 해부기는 행마다 수량 × 단가를 다시 계산해 그 줄을 짚고, 바로잡으면 합계가 202,730원이어야 한다고 결론을 낸다.

## 돌려 보니

깨끗하게 스캔하면 세 문서 791자 가운데 31자를 틀렸다. **글자 오류율 3.9%**다(띄어쓰기는 빼고 셌다). 틀린 자리는 대개 획 하나 차이다. 「항목」을 「집목」으로, 「부담금」의 「담」을 「납」으로 읽었다.

그다음 스캔을 하나씩 망가뜨려 봤다.

![장난감 OCR의 글자 오류율. 왼쪽 선그래프는 기울기만 줬을 때로, 전처리를 켜면 0°에서 4%, 0.5°~4°에서 15~20% 사이를 오가고, 전처리를 끄면 2°에서 40%, 3°에서 84%, 4°에서 90%까지 오른다. 오른쪽 막대그래프는 망가뜨린 방식별로 깨끗한 스캔 3.9%, 그림자 0.8은 5.6%, 같은 그림자에 전처리를 끄면 18.1%, 잡음 0.4는 13.3%, 번짐 0.5는 9.0%, 번짐 1.0은 75.9%, 기울기 1°는 19.7%다](/uploads/c5b5d7b57de3ae15.webp)

- **그림자는 전처리가 막는다.** 그림자를 짙게(0.8) 깔아도 지역 문턱을 쓰면 5.6%다. 전처리를 끄고 전역 문턱 하나로 나누면 18.1%로 오른다.
- **기울기는 반만 막는다.** 전처리를 끄면 3° 기울기에서 84%가 틀린다. 줄이 비스듬해서 줄 나누기부터 무너진다. 전처리를 켜면 15~20%로 버틴다. 줄은 되살렸는데 글자는 다 못 되살린 것이다(아래 「어디서 틀렸나」).
- **번짐에는 속수무책이다.** 번짐 0.5에서 9%, 1.0에서 76%다. 획이 서로 붙으면 본과 겹쳐 볼 모양 자체가 사라진다.

처리 시간은 노트북 브라우저에서 문서 한 장에 2~5초다. 대부분 글자 인식 단계가 쓴다.

## 어디서 틀렸나

만들면서 틀린 자리를 순서대로 적는다.

- **깨끗한 스캔인데도 다섯 자에 한 자를 틀렸다.** 처음 돌린 영수증의 오류율은 19.5%였다. 문서는 사우볼라로 흑백을 나눠 획이 굵게 잡혔는데, 본은 훨씬 엄격한 문턱으로 만들어 획이 가늘었다. 같은 글자를 굵기만 다르게 비교하고 있었다. 본의 문턱을 문서 쪽과 같은 밝기로 맞추자 7.7%로 내려갔다.
- **쉼표와 쌍점이 사라졌다.** 잡음 점을 지우는 단계가 작은 점을 모두 지웠다. 「5,200」이 「5200」이 됐다. 지우는 건 주변 7픽셀 안에 다른 잉크가 없는 외톨이 점으로 좁혔다. 그래도 쉼표가 빠졌다. 쉼표는 줄 아래로 처져 있어서, 줄과 높이가 겹치지 않는다며 혼자 다른 줄이 된 뒤 버려졌다. 작은 덩어리는 줄 높이 근처에만 있으면 붙이게 고쳤다.
- **「사」를 「시」로 읽었다.** 「사용」에서 ㅏ의 짧은 가로획 끝이 옆 글자 ㅇ에 닿아 있었다. 두 글자가 잉크 덩어리 하나로 붙어서, 덩어리 단위로는 나눌 수가 없었다. 넓은 덩어리는 세로 한 줄 단위로 쪼갤 후보를 만들게 했다.
- **막대그래프가 화면 반을 덮는 「줄」이 됐다.** 지역 문턱은 주변보다 어두운 점만 잉크로 본다. 넓고 고른 회색 막대 안쪽은 주변도 다 어두워서 종이로 판정됐고, 막대는 테두리만 남았다. 그 테두리 조각들이 글자처럼 이어 붙어 거대한 줄 하나가 생겼다. 아주 어두운 점은 무조건 잉크로 치고, 줄이 이어 붙으면서 위아래로 1.6배 넘게 커지지 못하게 막았다.
- **0을 9로 읽었다.** 빨리 돌리려고 후보를 미리 걸러 상위 몇 개만 꼼꼼히 비교하게 했더니, 「9」의 본 세 벌(조금씩 위치를 옮겨 그린 것)이 후보 자리를 다 차지해 진짜 답인 「0」이 빠졌다. 깨끗한 영수증 오류율이 4.4%에서 14.5%로 튀었다. 글자마다 후보를 두 벌까지만 두게 했다.
- **숫자 제약이 글자를 지웠다.** 숫자가 대부분인 줄은 숫자 본만으로 다시 읽게 했더니, 「진료 기간: 2026-10-12」의 「진료 기간」까지 숫자로 읽혀 「0075102026-10-12」가 됐다. 줄이 아니라 낱말 단위로 걸었다.
- **각도는 맞혔는데 글자가 틀렸다.** 가장 오래 붙잡은 문제다. 2.5° 기울인 문서에서 각도는 2.50°로 정확히 찾았고 줄도 반듯하게 돌아왔다. 그런데 오류율은 3.9%에서 20% 안팎으로 올랐다. 이미지를 돌렸다가 되돌리면 픽셀을 다시 찍으면서 획 모양이 조금씩 뭉개지는데, 본 맞추기는 그 작은 차이를 견디지 못한다. 본도 같은 각도로 돌렸다 되돌려 만들어 보고, 줄마다 흑백 문턱을 다시 고르게도 해 봤다. 조금씩 나아졌을 뿐 깨끗한 스캔 수준으로는 돌아오지 않았다.

마지막 항목이 이 장난감의 한계이자, OCR이 학습하는 쪽으로 넘어간 이유다. 본은 「이 글자는 이렇게 생겼다」를 사람이 한 벌 정해 준 것이다. 종이가 조금 돌거나 잉크가 번지면 글자는 본에서 벗어나고, 그 벗어남을 사람이 하나하나 규칙으로 막을 수는 없다. 학습하는 인식기는 기울고 번지고 얼룩진 예시 수백만 장을 보고 「이 정도 벗어나도 같은 글자」를 스스로 배운다.

**검산은 문서의 오류와 인식의 오류를 구분하지 못한다.** 기본 스캔 상태에서 해부기는 영수증의 비급여 합계 「25,000」을 「25,900」으로 읽고 「항목 합 25,000 ≠ 합계 25,900」이라는 경보를 냈다. 공단부담금 열에서도 어느 칸의 0 하나를 9로 읽어 합이 9원 어긋났다. 문서는 멀쩡하다. 거래명세서의 진짜 오류를 잡은 것과 같은 장치가 이번에는 가짜 경보를 낸 것이다. 그래도 경보가 울리는 쪽이 낫다. 틀린 숫자가 조용히 결론까지 흘러가는 것보다는.

## 최신 모델은 어디서 틀리나

VLM 문서 파서도 틀린다. 틀리는 방식이 다를 뿐이다.

- **없는 글자를 지어낸다.** 본 맞추기는 모르면 엉뚱한 글자를 내놓지만, 언어 모델은 모르면 **그럴듯한 글자**를 내놓는다. 2026년 여름 나온 FaithC4 연구는 영어·중국어·한국어 문서에 일부러 틀린 글자를 섞어 넣고 모델이 그대로 옮기는지 봤다. 범용 VLM은 틀린 글자를 맞는 낱말로 「고쳐 써」 단어 오류율이 최대 6.9%포인트 나빠졌고, 4~6자 짧은 낱말은 최대 10%가 고쳐졌다. 전통 OCR은 0.8%포인트 미만이었다. 원문을 있는 그대로 옮겨야 하는 기록물에서는 이게 치명적이다.
- **옛 스캔은 여전히 어렵다.** 앨런 AI 연구소의 olmOCR-Bench에서 「오래된 스캔」 항목은 최고 모델도 50점 안팎이다.
- **빈 페이지에서도 뭔가를 쓴다.** olmOCR은 2025년 8월 릴리스에서 빈 문서를 넣으면 글을 지어내던 문제를 고쳤다고 밝혔다.
- **압축에는 대가가 있다.** DeepSeek-OCR도 20배로 압축하면 60%만 맞힌다.

그래서 최신 시스템도 이 장난감의 7단계 같은 장치를 붙인다. 표의 합계를 다시 더해 보고, 날짜 형식을 확인하고, 확신이 낮은 칸은 사람에게 넘긴다. 읽는 기술은 112년 동안 바뀌었지만, 읽은 것을 의심하는 일은 여전히 따로 해야 한다.

## 왜 한 줄로 되는가

이번에도 재료가 다 공개돼 있었다. 오츠 문턱(1979), 사우볼라 문턱(2000), 투영 막대로 기울기 찾기, 연결 요소 묶기, XY 자르기(1984), 과분할 뒤 동적 계획법으로 다시 붙이기. 모두 교과서에 있는 방법이고, AI는 이것들을 한 파일로 조립했다.

한 줄로 된 건 거기까지다. 위의 일곱 가지 실수는 문서를 실제로 망가뜨려 보고, 정답과 글자 단위로 대조해 보기 전에는 보이지 않았다. 처음 판도 화면은 그럴듯하게 돌아갔다. 오류율을 세는 줄을 넣고 나서야 다섯 자에 한 자를 틀리고 있다는 걸 알았다.

## 따라 하려면

- **정답을 아는 문서로 시작해라.** 이번에는 문서를 직접 그려서 글자마다 정답과 위치를 알았다. 그래서 단계를 고칠 때마다 오류율이 몇 % 바뀌는지 바로 셀 수 있었다. 남의 스캔으로 시작하면 틀렸는지조차 모른다.
- **한 번에 하나씩 망가뜨려라.** 기울기, 그림자, 잡음, 번짐을 따로 넣어 봐야 어느 단계가 약한지 보인다. 이번에는 기울기와 번짐이 약점이었다.
- **실제로 쓸 거면 MCP 서버를 붙여라.** 장난감으로 원리를 봤다면, 실제 문서는 위 표의 PaddleOCR이나 MinerU MCP 서버에 맡기는 게 맞다. 0.9B~1.2B짜리 모델이 이 장난감보다 훨씬 잘 읽는다.
- **검산을 꼭 붙여라.** 어떤 OCR을 쓰든 합계를 다시 더해 보는 몇 줄이 틀린 숫자를 걸러 낸다. 문서가 틀렸는지 인식이 틀렸는지는 사람이 봐야 하지만, 적어도 어디를 봐야 하는지는 알려 준다.

## 못 하는 것

- **글꼴을 미리 안다.** 본을 같은 글꼴로 만들었으니 반칙에 가깝다. 다른 글꼴, 손글씨, 사진으로 찍은 문서는 못 읽는다.
- **아는 글자만 읽는다.** 세 문서에 나오는 166종의 글자만 본이 있다. 그 밖의 글자는 가장 닮은 다른 글자로 읽는다.
- **문서 종류를 제목으로 가린다.** 「영수증」 「요금」 「명세」 같은 낱말이 제목에 있어야 한다. 인사이트 규칙도 세 문서에 맞춰 썼다.
- **표는 선이 다 그어져 있어야 한다.** 선 없이 줄 맞춤만 된 표는 칸을 못 나눈다.
- **기울기와 번짐에 약하다.** 1°만 기울여도 다섯 자에 한 자를 틀린다.
- **문서는 모두 가상이다.** 기관 이름, 사람 이름, 번호는 지어낸 것이다.

112년 전 옵토폰을 쓰던 사람은 귀로 글자를 알아들었다. 지금은 1B짜리 모델이 표와 수식까지 읽고, 에이전트가 그걸 받아 계산까지 한다. 그래도 위의 손잡이를 조금만 돌려 보면, 읽는다는 게 아직 얼마나 아슬아슬한 일인지 보인다.

### 재미있게 읽었다면 꼭 의견을 달아달라.

## 출처

- 옵토폰: E. E. Fournier d'Albe, On a type-reading optophone, [Proc. Royal Society A 90](https://doi.org/10.1098/rspa.1914.0061) (1914)
- 타우셰크: [US 2,026,329 Reading Machine](https://patents.google.com/patent/US2026329A/en) (1929 출원, 1935 등록)
- ERMA·MICR: 컴퓨터역사박물관 [ERMA Can Do It](https://computerhistory.org/blog/erma-can-do-it/)
- 미국 우체국 OCR: USPS, [The United States Postal Service: An American History](https://about.usps.com/publications/pub100.pdf)
- 커즈와일: [Electronic Design 인터뷰](https://www.electronicdesign.com/technologies/industrial/boards/article/21770130/interview-with-ray-kurzweil), [Lemelson-MIT](https://lemelson.mit.edu/resources/raymond-kurzweil)
- 르쿤: [공식 약력](http://yann.lecun.com/ex/bio.html), Backpropagation Applied to Handwritten Zip Code Recognition, [Neural Computation 1(4)](https://doi.org/10.1162/neco.1989.1.4.541) (1989)
- 테서랙트: [GitHub README](https://github.com/tesseract-ocr/tesseract), [4.0.0 릴리스](https://github.com/tesseract-ocr/tesseract/releases/tag/4.0.0)
- CTC [Graves 외 2006](https://doi.org/10.1145/1143844.1143891), CRNN [arXiv 1507.05717](https://arxiv.org/abs/1507.05717), EAST [1704.03155](https://arxiv.org/abs/1704.03155), CRAFT [1904.01941](https://arxiv.org/abs/1904.01941), LayoutLM [1912.13318](https://arxiv.org/abs/1912.13318), Donut [2111.15664](https://arxiv.org/abs/2111.15664), TableFormer [2203.01017](https://arxiv.org/abs/2203.01017), Nougat [2308.13418](https://arxiv.org/abs/2308.13418)
- GPT-4V OCR 평가: [arXiv 2310.16809](https://arxiv.org/abs/2310.16809)
- olmOCR [2502.18443](https://arxiv.org/abs/2502.18443)·[저장소](https://github.com/allenai/olmocr), DeepSeek-OCR [2510.18234](https://arxiv.org/abs/2510.18234), PaddleOCR-VL [2510.14528](https://arxiv.org/abs/2510.14528), MinerU 2.5 [2509.22186](https://arxiv.org/abs/2509.22186)
- OmniDocBench: [opendatalab/OmniDocBench](https://github.com/opendatalab/OmniDocBench) README v1.6 표(2026-09-11 갱신), v1.5 표는 [v1_5 브랜치](https://github.com/opendatalab/OmniDocBench/tree/v1_5)
- FaithC4: [arXiv 2607.21617](https://arxiv.org/abs/2607.21617)
- 구글 북스: [15주년 블로그](https://blog.google/products/search/15-years-google-books/)(2019), [세상의 책 수](https://booksearch.blogspot.com/2010/08/books-of-world-stand-up-and-be-counted.html)(2010)
- 오츠 문턱: N. Otsu, A Threshold Selection Method from Gray-Level Histograms, IEEE Trans. SMC (1979). 사우볼라 문턱: J. Sauvola, M. Pietikäinen, Adaptive document image binarization, Pattern Recognition 33 (2000). XY 자르기: G. Nagy, S. Seth, Hierarchical representation of optically scanned documents, ICPR (1984)
- 사진: 옵토폰 [위키미디어 공용](https://commons.wikimedia.org/wiki/File:Optophone_-_Jul_1922_Harpers.jpg)(퍼블릭 도메인), 커즈와일 리더 [위키미디어 공용](https://commons.wikimedia.org/wiki/File:Kurtzweil_Reader.jpg)(Beatrice Murch, CC BY-SA 2.0)
- 해부기 화면과 오류율은 모두 이 글의 장난감으로 만들었다. 오류율은 헤드리스 크롬과 Pretendard 글꼴로 잰 값이라, 기기와 글꼴에 따라 조금 다를 수 있다

