Skip to content

Latest commit

 

History

History
149 lines (113 loc) · 11.4 KB

benchmarks.md

File metadata and controls

149 lines (113 loc) · 11.4 KB

벤치마크 상세

README 검증 결과의 채점 기준·재현 방법·옵션별 수치입니다. 내부 코퍼스는 npm run bench:gate로 검증하고 배포 시 필수 게이트를 통과합니다. 외부 opendataloader-bench는 별도로 측정합니다.

최신 배포 결과: 4.21.22 · 2026-10-11

4.21.22 dist 로 2026-10-11 에 잰 전 벤치 결과입니다(node bench/suite.mjs run). 직전 릴리스 4.21.21 과 문서별로 견줘 PDF 글·표·별표·score·OCR·열화 OCR·서식·왕복·생성·ODL 4모드 어디에서도 떨어진 문서가 없습니다.

대상 규모 결과
HWPX 2,424문서 · 10,342표 표 구조 일치 10,342/10,342 · 100%, 셀 글 완전 일치 99.9983%, 내용 NED 유사도 99.9955%
HWP 5.x ↔ HWPX 1,130쌍 · 4,315표 짝 문서 표 구조 일치 4,315/4,315 · 100%
PDF 글 744쌍 재현율 99.85%, 정확도 99.67%, 읽기 순서 99.23%, 어절 F1 99.02%
PDF 표 708쌍 · 2,331표 탐지 99.83%, 구조 일치 97.98%, 칸 F1 0.991228
법령 별표 272건 · 346표 HWP 구조 일치 346/346, PDF 338/346 · 97.69%
PDF 전체 1,911문서 중 1,729건 채점 글 커버리지 99.80%
OCR 53문서 · 102쪽 CER 0.0412, 글자 재현율 99.02%, 정확도 99.33%, 한글 재현율 99.40%
기타 포맷 / 왕복 / fuzz 146문서(PPTX 27 포함) / 왕복 75건 / fuzz 25,152건 배포 게이트 통과

표 구조 점수는 화면 재현·모든 셀 내용의 완전 일치와 다릅니다. 왕복 75건과 생성 fixture 8건은 별도 집계합니다.

PDF → Markdown — opendataloader-bench

opendataloader-bench 는 PDF 200문서(논문·보고서·슬라이드·포스터·스캔)을 사람이 만든 정답과 비교해 읽기 순서(NID)·표 구조(TEDS)·제목 위계(MHS) 를 잽니다(1.0 = 정답과 같음).

최신 별도 검증: 4.21.5 · 2026-10-09

설정 종합 읽기 순서 표 제목
기본값 0.963 0.963 0.980 0.948
기본값 + plain: true, htmlTables: true 0.974 0.979 0.983 0.958
ocr: true 0.964 0.964 0.980 0.954
ocr: false 0.939 0.939 0.937 0.934

각 모드 200문서, 실패·누락 0건입니다(node bench/suite.mjs run <태그> --only=odl,odlbest,odlocr,odlfast). 4.21.3(기본 0.958) 대비 네 모드 모두 문서별 하락 0 이고, 4.18.6(2026-10-02, 기본 0.960·plain+htmlTables 0.972·ocr: false 0.937)보다 기본 +0.002·ocr: false +0.001 입니다. 4.18.6 보다 낮은 문서는 그림 OCR 라벨 줄 정렬이 미세하게 다른 셋(100·134·115, 합 −0.004)입니다(세션 기록). 같은 날 같은 기기에서 잰 ODL 2.5.12 는 0.842 입니다.

옵션 전체 측정 이력: 2026-09-29

설정 종합 읽기 순서 표 제목 쪽당 시간
기본값 (OCR 모델 캐시 있음) 0.960 0.961 0.979 0.945 0.52초
기본값 + plain: true 0.968 0.969 0.981 0.952 0.52초
기본값 + plain: true, htmlTables: true 0.972 0.976 0.983 0.955 0.52초
ocr: false (= 기본값, OCR 모델 없음) 0.937 0.938 0.936 0.933 0.04초
ocr: false, plain: true 0.946 0.948 0.937 0.940 0.04초
ocr: false, plain: true, htmlTables: true 0.949 0.954 0.940 0.943 0.04초
ocr: true 0.960 0.960 0.979 0.949 0.57초
ocr: true, plain: true 0.967 0.968 0.981 0.956 0.57초
ocr: true, plain: true, htmlTables: true 0.973 0.977 0.983 0.959 0.58초

쪽당 시간은 2026-09-29 Apple M4 24GB 에서 200문서를 한 프로세스로 순차 파싱한 값(채점 제외)입니다.

옵션 설명

  • 기본값의 OCR — OCR 모델이 이미 캐시에 있으면(kordoc models·앞선 ocr: true 로 받은 경우) 텍스트층 없는 쪽(스캔·곡선 글자) 과 글 없는 큰 그림(쪽 면적 5% 넘는) 속 글을 자동으로 읽습니다(200문서 중 72개). 모델이 없으면 다운로드하지 않고 NEEDS_OCR·SKIPPED_IMAGE 경고만 냅니다.
  • ocr: true — 작은 그림(쪽 면적 2% 넘는)과 쪽 머리 로고까지 읽습니다. ocr: false 는 자동 OCR 도 끕니다(가장 빠름).
  • plain: true — 그림 자리 표시·링크 URL·밑줄/굵게 표기를 빼 색인·RAG 용 글만 냅니다. 정답지에 이런 표기가 없어 점수도 오릅니다.
  • htmlTables: true — 모든 표를 들여쓴 HTML 로 냅니다.

재현

  • 다른 엔진 점수는 벤치 저장소의 공개 결과(Apple M4 32GB)입니다.
  • kordoc 은 같은 PDF·정답·수정하지 않은 원본 채점기로 쟀습니다(Apple M4 24GB, 200문서 한 프로세스 순차).
  • 벤치의 opendataloader-hybrid 예측을 같은 채점기로 다시 재면 0.9066 으로 공개 점수와 같습니다.
  • 실행: node bench/odl-bench.mjs <벤치 클론> → 벤치의 src/evaluator.py.

공개 엔진 비교 기록: 2026-09-29

기존 README의 비교 기록입니다. 현재 순위나 동일 하드웨어 성능 비교를 뜻하지 않으며, 최신 kordoc 검증은 위의 4.18.6 표를 보세요.

순위 엔진 종합 읽기 순서 표 제목 쪽당 시간
1 kordoc 기본값 0.960 0.961 0.979 0.945 0.52초
참고 kordoc ocr: false (가장 빠름) 0.937 0.938 0.936 0.933 0.04초
참고 kordoc ocr: true, plain: true, htmlTables: true 0.973 0.977 0.983 0.959 0.58초
2 opendataloader-hybrid 0.907 0.934 0.928 0.821 0.46초
3 nutrient (상용) 0.885 0.925 0.708 0.819 0.01초
4 docling 0.882 0.898 0.887 0.824 0.76초
5 marker 0.861 0.890 0.808 0.796 53.9초
6 unstructured-hires 0.841 0.904 0.588 0.749 3.01초
7 edgeparse 0.837 0.894 0.717 0.706 0.04초
8 mineru 0.831 0.857 0.873 0.743 5.96초
9 opendataloader 0.831 0.902 0.489 0.739 0.02초
10 pymupdf4llm 0.732 0.885 0.401 0.412 0.09초
11 unstructured 0.686 0.882 0.000 0.388 0.08초
12 markitdown 0.589 0.844 0.273 0.000 0.11초
13 liteparse 0.576 0.866 0.000 0.000 1.06초

LM-Kit One 비교 이력 (2026-09-29, 당시 미병합 PR #34)

벤치에 결과만 PR 로 올라온 상용 LM-Kit One 은 OCR 없이 0.948·OCR 0.963 입니다. 격차 대부분은 표 칸을 정답지와 같은 HTML 모양(<td> 글 </td>, 머리행도 <td>)으로 내는 차이입니다. 같은 서식으로 맞추면 kordoc plain 0.951·LM-Kit 0.948 이고, htmlTables 까지 켜면 kordoc 이 OCR 없이 0.949·OCR 0.973 으로 둘 다 앞섭니다.

한국 공문서 — 원본 HWPX 를 정답으로

HWPX 원본과 그 문서를 PDF 로 내보낸 파일이 짝으로 있는 실제 정부 문서(보도자료·결재문서·법령 서식·예산서 등)로, 원본을 정답 삼아 PDF 에서 뽑은 글과 표를 잽니다.

채점 기준

2026-09-29 정비, 2026-09-30 보이는 표 기준 도입, 4.18.1 참조 추출기 정정 이력은 CHANGELOG에 기록돼 있습니다. 참조 정정과 실제 입력란 보존 수정은 원본 감사에서 구분합니다.

표 정답 = 원본에서 보이는 표 (v4.17.0)

  • 칸 테두리(header.xml borderFill, 선 종류 NONE·흰 선은 안 보임)가 그리는 모습대로 나눕니다(bench/ref/visible-tables.mjs, 파서와 코드 공유 0%).
  • 세로선이 보이는 행과 온 폭 가로선 사이 칸 둘 이상인 행이 표 행, 이어진 표 행 묶음 하나가 보이는 표 하나. 나머지 행은 글(글 재현율에는 그대로).
  • 어느 칸 모서리도 안 쓰는 격자선·보이는 변 밖 빈 들여쓰기 칸·선 없는 빈 여백 행·후행 빈 열은 접습니다.
  • 칸 두 개와 가로선으로 조립한 분수는 수식(글 모수에서 빼고 수식 존재 모수에 1개). 표 온 폭 두 칸은 2×1 표일 때만.
  • 법령 별표 한컴 PDF 그림 대조(원본 그림 66쪽, 보이는 표 50개): 일치 42/50, 여백 행(A1)·분수 오탐(P1) 보정 뒤 48/50. 남은 2개는 이어쓰기 행·공식 상자 각 1건이라 규칙을 두지 않았습니다.

법령 별표 (bench/annex-gt.mjs)

  • 법제처 별표 272건(licbyl-byl·licbyl-byl2)의 HWP 원본과 한컴 PDF 를 같은 정답으로 잽니다. PDF 는 ocr: false(법령 MCP·lexdiff 서버와 같은 조건).

PDF 글

  • 읽기 순서: 같은 글이 여러 번 나오는 줄은 순서가 맞는 등장 자리로 봅니다.
  • 떠 있는 글상자, 글자·숫자 없는 줄(마스킹 "*****")은 순서 채점에서만 뺍니다.
  • 양쪽 평문에서 목록 표지 "- " 와 각주 감싸개 "(주: …)" 괄호를 걷습니다.

PDF 글·표 모수

  • 원본과 다른 판(PDF 글이 3배 초과)인 쌍은 뺍니다.
  • PDF 텍스트층(pdftotext)이 정답 글자의 93% 를 못 담은 쌍(렌더 결함 재현본 등)은 뺍니다.
  • PDF 커버리지는 리더 점 런을 지웁니다.

OCR

  • 표본 쪽을 고정합니다(bench/ocr-pages.json).
  • 텍스트층 글이 없는 그림 영역의 OCR 글은 글자 대조에서 뺍니다(본문 블록에 섞인 로고 글은 그림만 따로 읽어 설명되는 잉여만).
  • 그려지지 않은 텍스트층 글(흰 글·덮인 글)은 글자 대조에서 뺍니다.
  • 글줄 안 글자를 그림으로 찍은 쪽은 표본에서 뺍니다.
  • 픽셀로 못 가르는 글자는 접습니다 — 가운뎃점 · • ∙, 단위 ㎡ 와 m², 낫표 「」 「」.
  • 값 칸이 여러 줄로 나란히 쌓인 표 행은 줄 번호별로 펼칩니다.

HWP·HWPX → Markdown — HwpForge 비교

같은 코퍼스를 HwpForge 0.16.6(to_md, lossy)과 kordoc 으로 변환해 원본 HWPX XML 을 정답으로 같은 채점기에 넣었습니다. 표는 두 출력 모두 같은 Markdown 표 파서로 격자화하고 1열 표는 뺐습니다.

  • 표 점수 차이 — HwpForge 는 생성·편집 중심이고 Markdown 표가 파이프 표뿐이라 병합 칸을 못 나타냅니다.
  • 1열 표를 뺀 이유 — 1열 표(1,288개)는 제목·본문 상자 43%·빈 여백 틀 28%·목록형 3% 인 꾸밈 틀이라 표/줄 글은 표현 선택이고, 그 글은 글 재현율이 채점합니다. 1열 표를 넣으면 HWPX 10,392표 kordoc 90.6%·HwpForge 36.0%, HWP 3,500표 92.8%·32.1%.
  • HWP 문서 수 — 짝 HWPX 가 배포용 암호라 정답이 없는 1건을 뺀 값입니다.
  • 재현 — bench/hwpforge-bench.py → node bench/compare-md-parsers.mjs <출력 폴더>(1열 표 포함은 --include-single-col).

v4.16 시점 비교 기록 (종전 HWPX XML 구조 기준, 현재 보이는 표 기준과 별도)

kordoc HwpForge 0.16.6
HWPX 2,305문서 — 변환 실패 0 123
HWPX — 글 재현율 (변환 성공 문서만) 100.00% (100.00%) 59.23% (98.64%)
HWPX — 표 완전 일치 (9,123표) 100.0% (9,122) 32.2%
HWPX — 칸 F1 1.000 0.428
HWP 5.x 1,108문서 — 변환 실패 0 19
HWP — 글 재현율 100.00% 86.41%
HWP — 표 완전 일치 (3,111표) 100% 27.0%
HWP — 칸 F1 1.000 0.349