지난 글에서 그림과 표가 섞인 자료를 검색하는 이야기를 했다. 거기서는 많은 문서 가운데 관련 있는 것을 찾는 일이 문제였다. 이번에는 반대 방향이다. 문서 하나가 이미 주어져 있고, 그 안에서 정해진 값을 정확히 읽어 내야 한다. 세금계산서에서 공급가액을, 계약서에서 해지 조항의 통지 기간을, 실적 보고서에서 3분기 영업이익률을 뽑는 일이다.
이 일을 "OCR을 붙이면 되는 것"으로 잡으면 대개 첫 배포에서 막힌다. 글자를 다 뽑아냈는데도 문서를 못 읽는 상황이 계속 나오기 때문이다.
읽는 차례가 첫 관문이다
가장 먼저 깨지는 것이 순서다. OCR은 글자와 그 위치를 알려 주지만 어느 글자가 어느 글자 다음에 오는지는 알려 주지 않는다.
두 단으로 짠 보고서를 위에서 아래로 한 줄씩 훑으면 왼쪽 단의 첫 줄과 오른쪽 단의 첫 줄이 이어 붙는다. 각각은 멀쩡한 문장인데 합쳐 놓으면 뜻이 없다. 그리고 이건 오류로 잡히지 않는다. 뒤에 붙은 LLM은 그 뒤죽박죽 텍스트를 받아 그럴듯한 답을 만들어 낸다.
순서 말고도 이 단계에서 가려야 하는 것이 몇 가지 더 있다.
- 머리말과 쪽 번호는 본문이 아니다. 페이지마다 반복되어 들어오면 문맥을 오염시킨다
- 각주는 본문의 흐름 밖에 있다. 문단 중간에 끼워 넣으면 문장이 끊긴다
- 표는 줄 단위로 읽으면 안 된다. 셀 사이의 공백이 사라지면 어느 값이 어느 열인지 알 수 없다
- 캡션은 그림에 붙어야 한다. 떨어지면 그림도 캡션도 쓸모가 없다
그래서 문서 파싱의 첫 단계는 글자 인식이 아니라 레이아웃 분석이다. 페이지에서 제목·문단·표·그림·머리말·각주의 영역을 먼저 찾고, 그 영역들의 읽는 차례를 정한 다음, 각 영역 안에서 글자를 뽑는다.
두 가지 접근이 있고, 갈림이 뚜렷하다
문서 이해를 구현하는 길은 크게 둘이다.
전통 파이프라인은 단계를 나눈다. 레이아웃 검출 → OCR → 표 구조 인식 → 후처리로 이어지고, 각 단계에 전용 모델이 붙는다.
VLM 단일 모델은 페이지 이미지를 그대로 넣고 원하는 것을 바로 뽑는다. 중간 단계가 없다.
| 전통 파이프라인 | VLM 단일 모델 | |
|---|---|---|
| 정해진 서식 | 아주 강하다. 좌표 규칙으로 못 박을 수 있다 | 서식이 고정이어도 매번 추론한다 |
| 처음 보는 서식 | 규칙이 없으면 못 한다 | 상당히 잘한다. 가장 큰 강점 |
| 좌표 | 자연스럽게 나온다 | 따로 요구해야 하고 정확도가 들쭉날쭉하다 |
| 실패 지점 찾기 | 어느 단계에서 틀렸는지 보인다 | 통째로 틀린다. 원인 추적이 어렵다 |
| 지어내기 | 없다. 없는 글자는 안 나온다 | 있다. 흐린 칸을 그럴듯한 값으로 채운다 |
| 비용 | 낮다 | 페이지 이미지 토큰이 붙는다 |
| 구축 기간 | 단계마다 손이 든다 | 프롬프트만으로 시작할 수 있다 |
지어내기 항목이 실무에서 가장 중요하다. 전통 파이프라인이 못 읽으면 빈칸이 나오지만, VLM이 못 읽으면 그럴듯한 값이 나온다. 세금계산서에서 흐릿한 숫자를 "12,500,000"으로 채워 넣었을 때 그것이 맞는지 틀리는지는 사람이 원본을 봐야만 알 수 있다. 빈칸은 눈에 띄지만 틀린 값은 안 띈다.
그래서 실제 시스템은 대체로 섞어 쓴다. 레이아웃과 OCR은 전용 도구로 하고, 뽑아낸 텍스트와 페이지 이미지를 함께 VLM에 넣어 구조화한다. 흐린 칸이 있으면 OCR 신뢰도가 먼저 알려 주고, 서식이 처음 보는 것이면 VLM이 감당한다.
표에서 대부분의 시간이 간다
문서 이해의 난도를 실제로 정하는 것은 표다. 표 이해에서 다룬 문제들이 여기서 그대로 나온다.
- 병합된 셀. 세로로 합친 칸의 값이 아래 행에도 적용되는데, 뽑아내면 첫 행에만 붙는다
- 여러 층의 열 이름. 「2026년」 아래에 「1분기」「2분기」가 있는 구조에서, 값 하나를 지목하려면 두 층을 다 알아야 한다
- 여러 쪽에 걸친 표. 다음 쪽에서 열 이름 없이 이어지는 표를 별개의 표로 처리하면 뒷부분이 통째로 못 쓰게 된다
- 선이 없는 표. 괘선 없이 공백으로만 정렬한 표는 열 경계를 찾는 것 자체가 어렵다
- 빈칸의 뜻. 값이 0인지, 해당 없음인지, 그냥 안 적은 것인지가 서식마다 다르다
여기서 실용적인 요령 하나. 표를 뽑아낸 뒤 표의 자체 검산을 돌린다. 합계 행이 있으면 실제로 더해 보고, 소계가 있으면 맞춰 본다. 계산이 안 맞으면 그 표는 잘못 읽은 것이다. 사람이 보기 전에 기계가 잡아내는 가장 값싼 검사다.
값과 함께 근거를 뽑는다
문서 이해 시스템이 실무에서 쓸 만해지는지 아닌지를 가르는 설계 결정이 하나 있다. 뽑아낸 값만 내놓을 것인가, 그 값이 어디서 나왔는지까지 함께 내놓을 것인가.
값만 있으면 확인하려는 사람이 문서를 열고 눈으로 찾아야 한다. 좌표가 붙어 있으면 화면에서 그 자리를 바로 띄워 준다. 검수 한 건에 드는 시간이 3분에서 3초로 바뀐다. 자동화의 실제 이득은 여기서 나온다.
출력 구조에 넣을 것은 넷이다.
- 페이지와 좌표 — 어디를 보면 되는지
- 신뢰도 — 낮은 것만 골라 사람에게 보내기 위해
- 원문 그대로의 문자열 — 모델이 정규화한 값과 문서에 실제로 적힌 글자를 나눠 둔다.
12500000과"12,500,000"을 둘 다 갖고 있으면 변환에서 생긴 오류를 잡을 수 있다 - 출처 종류 — 표에서 나왔는지, 본문 문장에서 나왔는지, 도장이나 손글씨에서 나왔는지
그리고 출력 형식은 JSON 스키마로 못 박는다. 자유 형식으로 받으면 필드 이름이 조금씩 달라지고 값 타입이 흔들려서, 뒤에 붙는 처리가 매번 깨진다. 출력 검증을 파이프라인의 한 단계로 넣어 스키마에 안 맞는 응답은 재시도한다.
신뢰도는 저절로 생기지 않는다
"신뢰도를 함께 내라"고 프롬프트에 적으면 모델이 숫자를 하나 적어 주기는 한다. 그런데 그 숫자는 대체로 실제 정확도와 잘 맞지 않는다. 틀린 값에 0.95를 붙이는 일이 흔하다.
쓸 만한 신뢰도는 다른 데서 만든다.
- OCR 자체의 신뢰도. 글자 인식 단계에서 나오는 값이고, 흐린 부분·기울어진 부분에서 실제로 떨어진다. 가장 믿을 만하다
- 두 번 돌려 비교하기. 같은 페이지를 온도를 올려 두 번 뽑고 값이 다르면 그 필드를 의심 대상으로 표시한다. 비용은 두 배지만 잡아내는 것이 확실하다
- 두 경로로 뽑아 대조하기. 전통 파이프라인 결과와 VLM 결과가 다른 필드를 표시한다
- 규칙 검사. 사업자등록번호 검증식, 날짜 형식, 세액이 공급가액의 10%인지, 합계가 항목의 합인지. 문서 종류마다 이런 규칙이 열 개쯤 나온다
- 필드가 아예 안 나온 것. 필수 필드가 비어 있으면 그 자체가 강한 신호다
이 신호들을 합쳐 필드마다 점수를 붙이고, 임계값 아래는 사람에게 보낸다.
사람 검수를 나중에 붙이지 않는다
문서 이해 시스템에서 자주 하는 실수가 완전 자동을 목표로 만들고 정확도가 안 나오면 그때 사람을 붙이는 순서다. 이러면 검수 화면이 급하게 만들어지고, 좌표가 없어서 검수자가 문서를 뒤져야 하고, 고친 값이 다시 학습에 안 쓰인다.
처음부터 이렇게 잡는다.
임계값을 정하고 문서를 세 갈래로 나눈다. 전부 통과한 것은 그대로 넘기고, 일부 필드가 낮은 것은 그 필드만 검수 큐에 넣고, 여러 필드가 낮거나 서식을 아예 못 알아본 것은 문서 전체를 사람에게 보낸다.
검수 화면은 좌표를 쓴다. 값 옆에 원본 이미지의 해당 부분을 잘라 보여 주면 검수자가 문서를 열 필요가 없다.
고친 값을 모은다. 어떤 필드가 자주 틀리는지, 어느 서식에서 많이 틀리는지가 여기서 나온다. 이게 다음 개선의 유일한 재료이고, 나중에 평가 집합이 된다.
그리고 검수율 자체를 지표로 삼는다. "정확도 몇 %"보다 "사람 손이 몇 건에 갔는가"가 사업 쪽에 훨씬 잘 통한다.
평가는 문서 단위로도 본다
필드 단위 정확도만 재면 실제 쓸모를 놓친다. 필드 20개짜리 문서에서 19개를 맞히면 정확도 95%인데, 그 문서는 여전히 사람이 봐야 한다. 한 칸만 틀려도 그 건은 자동 처리가 안 되기 때문이다.
그래서 두 가지를 함께 본다.
- 필드 정확도 — 어느 필드가 약한지 찾는 용도
- 문서 완전 일치율 — 모든 필드가 맞은 문서의 비율. 자동화율의 상한이다
평가 집합은 서식별로 고르게 만든다. 실제 유입 비율대로만 뽑으면 흔한 서식에 묻혀 드문 서식의 실패가 안 보인다. 그리고 품질이 나쁜 스캔을 일부러 넣는다. 기울어진 것, 흐린 것, 도장이 글자에 겹친 것, 손글씨가 섞인 것이 실제 유입에는 늘 있다.
정리
- 글자를 다 뽑아도 읽는 차례가 틀리면 뜻이 사라진다. 레이아웃 분석이 OCR보다 앞이다
- 머리말·쪽 번호·각주·캡션은 본문 흐름에서 따로 가려낸다
- 전통 파이프라인은 정해진 서식에 강하고 좌표가 자연스럽게 나온다. VLM은 처음 보는 서식에 강하다
- 결정적인 차이는 실패 모양이다. 파이프라인은 빈칸을 내고 VLM은 그럴듯한 값을 낸다. 틀린 값은 빈칸보다 훨씬 위험하다
- 그래서 섞어 쓴다 — 레이아웃과 OCR은 전용 도구로, 구조화는 텍스트와 페이지 이미지를 함께 넣은 VLM으로
- 난도를 실제로 정하는 것은 표다. 병합 셀·다층 헤더·여러 쪽에 걸친 표·선 없는 표·빈칸의 뜻
- 표는 자체 검산으로 잡는다. 합계와 소계를 실제로 더해 본다
- 값만 뽑지 말고 페이지·좌표·신뢰도·원문 문자열·출처 종류를 함께 뽑는다. 검수 한 건이 3분에서 3초가 된다
- 모델이 스스로 적은 신뢰도는 잘 안 맞는다. OCR 신뢰도·두 번 돌려 비교·두 경로 대조·규칙 검사로 만든다
- 사람 검수를 처음부터 설계에 넣는다. 임계값으로 세 갈래로 나누고, 좌표로 검수 화면을 만들고, 고친 값을 모은다
- 평가는 필드 정확도와 문서 완전 일치율을 함께 본다. 후자가 자동화율의 상한이다
읽어주셔서 감사합니다. 😊

