README 검증 결과의 채점 기준·재현 방법·옵션별 수치입니다. 내부 코퍼스는 npm run bench:gate로 검증하고 배포 시 필수 게이트를 통과합니다. 외부 opendataloader-bench는 별도로 측정합니다.
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건은 별도 집계합니다.
opendataloader-bench 는 PDF 200문서(논문·보고서·슬라이드·포스터·스캔)을 사람이 만든 정답과 비교해 읽기 순서(NID)·표 구조(TEDS)·제목 위계(MHS) 를 잽니다(1.0 = 정답과 같음).
| 설정 | 종합 | 읽기 순서 | 표 | 제목 |
|---|---|---|---|---|
| 기본값 | 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 입니다.
| 설정 | 종합 | 읽기 순서 | 표 | 제목 | 쪽당 시간 |
|---|---|---|---|---|---|
| 기본값 (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.
기존 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초 |
벤치에 결과만 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 원본과 그 문서를 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², 낫표 「」 「」.
- 값 칸이 여러 줄로 나란히 쌓인 표 행은 줄 번호별로 펼칩니다.
같은 코퍼스를 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).
| 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 |