Engineering

작은 MoE 하나로 상용 한국어 OCR과 붙어봤다 — 학습은 아직 진행 중

활성 ~0.94B짜리 MoE OCR이 학습 8,000 step(전체 32,000 중) 시점에 Clova·Gemini·Upstage·MinerU·PaddleOCR과 5개 한국어 문서 트랙에서 정면 비교. 읽기순서는 이미 전체 1위, 추론은 4090 한 장으로 5트랙 8분(batch-1 대비 53배).

먼저 분명히 해두면 — 이 모델은 아직 학습 중이다. 전체 32,000 step 중 8,000 step 시점의 중간 체크포인트다. 그런데도 결과가 나쁘지 않아서, 중간 점검 겸 공개한다. 최종본은 더 좋아질 것이다.

작은 MoE 모델 하나(활성 파라미터 ~0.94B)가 Clova·Gemini·Upstage·MinerU·PaddleOCR 같은 상용 엔진과 같은 링에서 얼마나 버티는지, 5개 한국어 문서 트랙에서 정직하게 쟀다.

어떻게 측정했나

벤치마크는 OmniDocBench-KO Full eval. 한국어 문서를 5개 능력 트랙으로 나눠 채점한다.

트랙내용장수
일반 한국어 문서born-digital 일반 문서100
표 기반 금융표·폼 위주 금융 문서60
슬라이드·강의안발표자료 레이아웃100
옛스캔(필기·옛공문)열화된 한국어 스캔80
수능(인쇄+수식)수식 포함 시험지100

두 축으로 잰다 (둘 다 0 = 완벽, 1 = 전부 틀림):

  • 정확도(text) — 블록 매칭 후 각 블록의 정규화 편집거리(Levenshtein ÷ GT 길이). “글자를 얼마나 맞게 읽나”.
  • 순서(order) — 읽기순서(reading order) 블록 편집거리. “어느 블록이 먼저인지 구조를 맞게 잡나”.
  • 수능만 예외로 latexnorm CER(수식 정규화 후 문자 오류율).

그리고 mean과 median을 같이 본다. mean은 OmniDocBench 공식 지표(전 페이지 평균)이고, median은 표·복잡 레이아웃에서 터지는 폭발 페이지를 제외한 실제 중심 성능이다. 뒤에서 보겠지만, 이 둘의 차이가 많은 걸 말해준다.

공정성: 상용 엔진 5개를 우리 채점 파이프라인으로 재채점해 기존 측정치와 소수점까지 일치함을 확인했다(15개 전부 일치). 같은 자·같은 정답으로 잰 비교다. 우리 모델 출력(DocLang)만 동일 형식으로 변환해 조건을 맞췄다. 추론은 RTX 4090 한 장, vLLM.

전체 매트릭스

표기는 mean / median, 낮을수록 좋다. 보라색 행이 우리 MoE다.

일반 한국어 문서
엔진정확도 text순서 order
Clova 🥇0.019 / 0.0030.039 / 0.000
PaddleOCR0.065 / 0.0050.027 / 0.000
MinerU0.146 / 0.0330.151 / 0.041
우리 MoE0.161 / 0.0540.129 / 0.075
Upstage0.171 / 0.0230.156 / 0.000
Gemini0.246 / 0.0820.231 / 0.077
표 기반 금융 ⚠️ 표 채점의 함정
엔진정확도 text순서 order
Clova0.296 / 0.2600.433 / 0.467
우리 MoE0.340 / 0.2330.218 / 0.174 🥇
Gemini0.685 / 0.7510.645 / 0.721
Upstage0.733 / 0.7800.643 / 0.758
슬라이드·강의안
엔진정확도 text순서 order
Clova 🥇0.080 / 0.0000.085 / 0.000
Upstage0.132 / 0.0000.136 / 0.000
Gemini0.138 / 0.0000.136 / 0.000
MinerU0.171 / 0.0350.224 / 0.134
우리 MoE0.196 / 0.0420.186 / 0.000
PaddleOCR0.210 / 0.1190.111 / 0.000
옛스캔(필기·옛공문)
엔진정확도 text순서 order
Clova 🥇0.1230.004
우리 MoE0.157 / 0.0530.014 / 0.000
Gemini0.2600.136
PaddleOCR0.2900.062
MinerU0.2910.218
Upstage0.3730.282
수능(인쇄+수식, latexnorm CER)
엔진CER
MinerU 🥇0.214
Gemini0.251
Upstage0.485
우리 MoE0.600
Clova0.615
PaddleOCR0.909

종합 성적

4개 본문 트랙 평균(MinerU·Paddle은 금융 결측이라 4트랙 비교에서 제외).

종합 (text/order × mean/median)
엔진text meantext medianorder meanorder median
Clova0.130 🥇0.0880.1400.156
우리 MoE0.2140.1100.1370.083 🥇
우리 dense(32k)0.2460.169
Gemini0.3320.2780.2870.266
Upstage0.3520.2680.3040.253
  • 읽기순서(order)는 우리 모델이 median 기준 전체 1위(0.083) — Clova(0.156)도 앞선다. 구조를 정확히 잡는 게 강점이다.
  • 정확도(text)는 Clova가 최강(한국어 OCR 인식력). 우리는 그다음 그룹이되, 자사 dense를 능가한다.

표 채점의 함정 — median이 드러낸 것

금융에서 Gemini·Upstage는 median이 mean보다 더 높다(0.75, 0.78). 표를 markdown으로 출력하는데 정답은 plain 텍스트 블록이라, 거의 모든 페이지에서 매칭이 깨진다. OCR을 못해서가 아니라 표현 형식이 안 맞아서 점수가 터진다.

반대로 우리 모델만 median이 낮아진다(0.340 → 0.233). 표를 실제로 더 정확히 구조화한다는 뜻이다. 0.4 이상 점수는 “성능”이 아니라 “표 아티팩트”로 읽어야 한다 — 이게 이 트랙의 교훈이다.

추론 속도 — 4090 한 장으로 5트랙 8분

정확도만큼 중요한 게 속도다. Qwen2-VL 계열은 M-RoPE 위치 인코딩 때문에 일반적인 배치 추론이 출력을 오염시켜 batch-1을 강제당한다. 그대로 두면 한 장에 ~70초, 5트랙 460장이면 7.7시간이다.

여기에 세 가지를 얹었다 — vLLM의 ragged continuous batching, 발산 페이지 토큰 절단(무손실), 그리고 ngram speculative decoding(DocLang의 반복 구조를 draft로 제안, lossless라 출력 동일). 결과:

추론 속도 (RTX 4090 1장)
방식5트랙 460장처리량
단순 batch-1~7.7시간~1 img/min
vLLM + 2048 cap + ngram~8분~55 img/min

53배. 체크포인트가 2,000 step마다 쌓이는 학습 중에 매번 전 트랙을 빠르게 평가할 수 있다는 뜻이고, 온디바이스/엣지 배포에서도 의미 있는 throughput이다.

정리

활성 ~0.94B짜리 MoE가, 전체 학습의 4분의 1(8,000 / 32,000 step) 시점에 이미:

  • 읽기순서는 상용 포함 median 기준 전체 1위,
  • 금융·옛스캔 정확도는 자사 dense를 능가,
  • 추론은 4090 한 장으로 5트랙 8분(53배).

남은 약점도 분명하다. **수식(수능)**은 아직 약하고(formula 데이터 추가 학습이 다음 레버), clean 텍스트 인식력에선 Clova가 여전히 벽이다.

다시 강조하면 — 이건 학습 중간 결과다. 남은 24,000 step이 이 숫자들을 어디까지 끌어올리는지는, 끝나고 다시 쓰겠다.