Field Log · Entry
RAG 문서 구조 추출: PDF Layout·OCR·표·읽기 순서를 보존하는 법 (2/10)
오늘의 결론
- PDF에서 복사되는 문자열은 문서의 의미 구조가 아닙니다. RAG가 보존해야 할 것은 element 종류, 읽기 순서, 계층, 표의 행·열, page와 bounding box입니다.
- 문서 전체에 무조건 OCR을 적용하지 않습니다. Native text가 신뢰할 만한 영역은 그대로 쓰고, scan·깨진 glyph·그림 속 글자만 region OCR로 보완합니다.
- 표는 줄바꿈이 들어간 text가 아니라 grid입니다. Table detection, row·column·span 구조, cell text와 header 관계를 분리해 저장합니다.
- “가장 좋은 parser”는 제품 이름으로 정해지지 않습니다. 실제 문서 유형을 층화한 gold pages에서 layout·reading order·OCR·table·citation round-trip과 비용을 함께 측정합니다.
- Parser output을 Markdown 하나로만 저장하면 나중에 품질을 고칠 수 없습니다. Rich canonical JSON을 정본으로 두고 Markdown·HTML·chunk text는 파생물로 만듭니다.
앞 글에서는 raw snapshot에서 active index generation까지의 지식 수명주기를 설계했습니다. 이번 글은 그중 raw page를 citation 가능한 canonical document로 바꾸는 변환 계층을 깊게 다룹니다.
render and inspect each page
→ classify digital / scanned / hybrid / corrupted
→ extract native glyphs and selective OCR spans
→ detect layout regions and reading order
→ reconstruct tables, figures, equations, callouts
→ reconcile conflicts into canonical elements
→ validate structure and citation round-trip
이 글에서 답하는 질문
- PDF text extraction이 다단 문서와 표에서 깨지는 이유는 무엇인가?
- Born-digital, scanned, hybrid page를 어떻게 구분하는가?
- OCR은 어느 영역에 적용하고 confidence를 어떻게 다루는가?
- Layout과 reading order를 어떤 schema로 보존하는가?
- 표를 검색 가능한 문장으로 만들면서 원래 grid를 잃지 않는 방법은 무엇인가?
- Parser를 고를 때 어떤 gold set과 metric이 필요한가?
그림 1. Parser의 목적은 보기 좋은 Markdown이 아니라 source 좌표를 가진 ordered element graph다. Export format과 chunking은 이 canonical representation에서 다시 만든다.
1. PDF는 문서 의미가 아니라 그리기 명령에 가깝다
사람에게 보이는 한 문장은 PDF 내부에서 다음처럼 저장될 수 있습니다.
draw glyph "V" at (81.2, 702.4)
draw glyph "a" at (88.9, 702.4)
draw glyph "c" at (95.1, 702.4)
...
PDF에는 heading level, paragraph, table header 같은 의미가 항상 들어 있지 않습니다. Text object 순서도 사람이 읽는 순서와 다를 수 있습니다.
특히 다음 문서가 문제입니다.
- 두 단·세 단 편집 문서
- 본문 사이에 figure와 caption이 끼어 있는 기술 보고서
- 선이 없는 표와 여러 줄 header
- scan image 위에 보이지 않는 OCR text layer가 겹친 문서
- 글자는 있지만 font encoding이 깨진 PDF
- 가로·세로 페이지가 섞인 manual
- page마다 반복되는 header, footer, watermark
- warning box와 footnote가 본문 순서 밖에 있는 SOP
단순 extract_text()가 실패하는 것은 도구가 나빠서만이 아니라 입력에 semantic structure가 없기 때문입니다.
2. Page Type을 먼저 분류한다
Document 하나에도 서로 다른 page type이 섞일 수 있습니다.
| Page type | 신호 | 기본 처리 |
|---|---|---|
| Born-digital | 충분한 glyph, 정상 Unicode, image coverage 낮음 | Native text + layout |
| Scanned | page 대부분이 raster image, text layer 없음 | Full-page OCR + layout |
| Hybrid | native text와 scan 영역·도면이 공존 | Native + region OCR |
| Corrupted text layer | glyph는 있으나 replacement char·순서 오류 | Render 기반 OCR fallback |
| Form/table dominant | 짧은 text box가 격자에 반복 | Table/form structure 우선 |
문서 단위 flag 하나로 처리하면 scan appendix 때문에 300페이지 전체를 OCR하거나, 반대로 1페이지 scan insert를 놓칩니다. Page별로 route하고 document 수준에서 결과를 합칩니다.
def classify_page(page):
native = inspect_native_text(page)
image_ratio = page_image_area(page) / page.area
if native.char_count == 0 and image_ratio > 0.85:
return "scanned"
if native.invalid_unicode_ratio > 0.05:
return "corrupted_text"
if native.char_count > 100 and image_ratio > 0.25:
return "hybrid"
return "born_digital"
Threshold는 예시값입니다. Font, 언어, page size와 drawing style에 따라 target corpus에서 조정합니다.
3. Render 좌표계를 고정한다
Parser마다 coordinate convention이 다릅니다.
PDF points: origin bottom-left, 72 points per inch
image pixels: origin top-left, depends on render DPI
normalized: x, y, width, height in [0, 1]
Canonical schema에서는 원본 page 크기, rotation, render transform과 normalized bbox를 함께 둡니다.
{
"page": 12,
"page_size_points": [595.28, 841.89],
"rotation_degrees": 0,
"render": {"dpi": 200, "width_px": 1654, "height_px": 2339},
"bbox_norm": [0.112, 0.204, 0.786, 0.092],
"bbox_pdf_points": [66.7, 592.8, 467.9, 77.5]
}
이 정보가 있어야 retrieved chunk를 page image 위에 다시 highlight해 citation을 검증할 수 있습니다. Render DPI나 rotation을 버리면 bbox가 있어도 위치를 재현하지 못합니다.
4. Native Text를 먼저 활용한다
Born-digital PDF에서는 embedded glyph가 OCR보다 정확할 가능성이 큽니다.
- 숫자와 단위가 원문 encoding대로 남습니다.
- 작은 font와 저대비 색상도 image OCR보다 안정적입니다.
- 위치, font size, weight를 직접 얻을 수 있습니다.
- OCR inference 비용과 latency가 없습니다.
다만 native text가 존재한다는 사실만으로 신뢰하지 않습니다.
native text health checks
- Unicode replacement character ratio
- invisible text vs visible render agreement
- glyph overlap and impossible coordinates
- text coverage relative to visible regions
- repeated single-character fragments
- extraction order discontinuity
Health가 낮은 page나 region만 OCR fallback으로 보냅니다.
5. OCR은 Recognition 이상의 문제다
OCR pipeline을 한 함수로 뭉치면 어느 단계가 틀렸는지 모릅니다.
image preprocessing
→ text detection
→ line / word grouping
→ character recognition
→ language and script handling
→ confidence calibration
→ region-to-layout attachment
Preprocessing
- Rotation과 deskew
- Denoise·contrast normalization
- Border·hole punch 제거
- Low-resolution upscale
- Region crop
과한 preprocessing은 0과 O, decimal point, 얇은 table line을 지울 수 있습니다. 원본과 transform config를 같이 보존합니다.
Language
한글·영문·숫자·장비 code가 섞인 문서에서 일반 language model이 E204를 자연어 단어로 교정할 수 있습니다. Domain critical token은 allowlist·regex와 visual crop으로 별도 검증합니다.
critical token classes
alarm code: E[0-9]{3}
pressure: [0-9.]+ (Pa|Torr|mTorr)
part ID: [A-Z]{2,}-[0-9A-Z-]+
safety state: OPEN|CLOSE|LOCK|BYPASS
Confidence
OCR confidence는 engine마다 정의와 calibration이 다릅니다. 0.92라는 숫자를 서로 다른 engine 사이에서 그대로 비교하지 않습니다. Gold set에서 confidence bucket별 실제 character accuracy를 확인합니다.
6. Full-page OCR보다 Selective OCR을 우선한다
Hybrid page에는 native text, raster diagram label, scan stamp가 공존합니다.
1. native glyph and image regions detect
2. layout regions classify
3. trustworthy native spans retain
4. text-like image or corrupted spans crop
5. region OCR execute
6. overlap spans reconcile
장점:
- 비용과 latency 감소
- Native 숫자·symbol 보존
- 두 text layer가 겹치는 중복 감소
- 어떤 span이 OCR에서 왔는지 provenance 유지
단, scan page 전체에 tiny text가 빽빽하면 region routing overhead가 커질 수 있으므로 full-page OCR과 비교합니다.
7. Layout Analysis는 영역의 역할을 찾는다
Layout model은 page image에서 영역과 class를 예측합니다.
title · heading · paragraph · list
table · figure · caption · equation
header · footer · footnote · page number
callout · warning · code block
DocLayNet은 다양한 문서 source의 80,863개 page에 11개 layout class를 사람이 annotation한 dataset입니다. 논문의 중요한 교훈은 큰 scientific-paper dataset에서 잘 된 model도 다양한 business document layout으로 옮기면 성능이 떨어질 수 있다는 점입니다.
따라서 공개 benchmark mAP가 높다고 내부 manual에도 잘 맞는다고 가정하지 않습니다. Domain page를 annotation해 확인합니다.
8. Reading Order를 별도 Graph로 본다
위에서 아래, 왼쪽에서 오른쪽 정렬만 하면 두 단 문서가 섞입니다.
잘못된 순서:
left heading → right heading → left paragraph 1 → right paragraph 1
의도한 순서:
left heading → left paragraph 1 → left paragraph 2
→ right heading → right paragraph 1
Reading order는 element 사이의 directed relation으로 표현할 수 있습니다.
{
"elements": ["e1", "e2", "e3", "e4"],
"order_edges": [
["e1", "e2"],
["e2", "e3"],
["e3", "e4"]
],
"linearized_order": ["e1", "e2", "e3", "e4"]
}
Figure caption은 가장 가까운 paragraph가 아니라 연결된 figure 뒤에 와야 하고, footnote는 참조 mark와 관계를 가질 수 있습니다. Linear order와 semantic relation을 모두 남깁니다.
9. Header와 Footer 제거는 Document-level 문제다
Page마다 같은 위치에 반복되는 문자열을 찾아 제거할 수 있습니다.
candidate repeated region
= same normalized band
+ similar normalized text
+ repeated across many pages
하지만 다음은 제거하면 안 됩니다.
- Page마다 바뀌는 revision·confidentiality label
- Section 이름이 들어간 running header
- 표가 다음 page로 이어짐을 나타내는 header
- Safety classification이나 equipment ID
삭제 대신 role=header, searchable=false, audit_relevant=true처럼 역할을 분리하면 원문 traceability를 유지할 수 있습니다.
10. 표는 Detection, Structure, Content로 분해한다
Table Detection
Page에서 표 영역을 찾습니다.
Structure Recognition
행, 열, header, merged cell과 spanning relation을 복원합니다.
Cell Content
각 cell의 native text 또는 OCR text를 연결합니다.
{
"type": "table",
"page": 12,
"bbox_norm": [0.08, 0.34, 0.84, 0.41],
"grid": {"rows": 5, "columns": 4},
"cells": [
{"row": 0, "col": 0, "row_span": 2, "col_span": 1,
"role": "row_header", "text": "Alarm"},
{"row": 0, "col": 1, "row_span": 1, "col_span": 3,
"role": "column_header", "text": "Recovery sequence"}
]
}
TableFormer은 table structure sequence와 cell bounding box를 함께 예측하고, programmatic PDF에서는 cell content를 PDF source에서 가져오는 접근을 제시합니다. 핵심은 표 image를 Markdown pipe 문자열 하나로 바꾸기 전에 구조와 content source를 분리한다는 것입니다.
11. 표를 검색용 Text로 파생한다
Grid 정본을 보존한 뒤 query 유형에 맞는 representation을 추가합니다.
HTML Representation
Merged cell과 header scope를 비교적 잘 보존합니다.
Markdown Representation
사람이 읽기 쉽지만 complex span과 nested table에 약합니다.
Semantic Row Representation
Table: Vacuum alarm recovery
Alarm = E204
Condition = chamber pressure > 50 mTorr
Action step 1 = close isolation valve
Action step 2 = verify roughing pump
Source = page 12, table 3, row 4
Field name을 각 row에 반복해 embedding과 keyword retrieval에서 의미를 보강합니다. 그러나 이 text가 정본은 아닙니다. 답변 citation은 table·cell ID와 page bbox를 가리켜야 합니다.
12. Table Continuation을 합칠 때 주의한다
여러 page에 걸친 표는 다음 신호로 연결할 수 있습니다.
- Column count와 width pattern
- Repeated header text
Table 3 (continued)caption- 앞 page 하단과 다음 page 상단의 위치
- Row key continuity
잘못 합치면 서로 다른 표가 하나가 됩니다. continuation_confidence와 merge evidence를 남기고, gold set에서 page-boundary table을 별도 평가합니다.
13. Figure, Chart, Equation을 버리지 않는다
Text-only RAG라도 비텍스트 element의 존재와 관계를 저장합니다.
{
"type": "figure",
"asset_ref": "s3://canonical/.../page12-figure2.png",
"caption_element_id": "e_219",
"nearby_heading_path": ["Vacuum", "Recovery"],
"ocr_labels": ["V1", "PUMP", "CHAMBER"],
"description": null,
"description_status": "not_generated"
}
Description model을 쓰면 model revision과 prompt를 provenance에 넣습니다. Diagram에서 생성한 설명을 원문 사실과 같은 confidence로 저장하지 않습니다.
Equation은 LaTeX 변환이 실패할 때 의미 없는 문자로 오염시키기보다 image crop과 주변 text를 보존하고 quarantine할 수 있습니다.
14. Warning과 Callout은 Semantic Role이다
기술 manual에서 색상 box는 단순 장식이 아닙니다.
DANGER → 즉시 생명·중대 위험
WARNING → 잠재적 위험
CAUTION → 장비 손상 가능성
NOTE → 보조 설명
Style만 보고 role을 단정하지 않고 label text, icon, border, domain template를 함께 봅니다. Chunking과 retrieval에서는 warning을 다음 procedure step에 붙이되 별도 element ID를 유지합니다.
15. Canonical Element Schema
최소 schema 예시입니다.
element_id: elem_01j...
document_version_id: docv_01j...
type: warning
semantic_role: safety_warning
order_index: 37
heading_path:
- Vacuum System
- Alarm E204
page: 12
bbox:
normalized: [0.08, 0.62, 0.84, 0.09]
pdf_points: [47.6, 244.1, 500.0, 75.8]
text: "Isolation valve를 먼저 닫으십시오."
text_spans:
- source: native_pdf
glyph_range: [1820, 1847]
confidence:
layout: 0.97
text: null
relations:
next: elem_01k...
applies_to: elem_01h...
parser:
name: example-parser
revision: config-7
Confidence가 없다는 의미와 완벽하다는 의미를 구분하기 위해 null을 씁니다. 여러 engine score를 하나의 숫자로 평균내지 않습니다.
16. Reconciliation에서 중복과 충돌을 푼다
Native text와 OCR text가 같은 영역에 있으면 두 후보가 생깁니다.
candidate A: native text "E204", bbox A
candidate B: OCR text "E2O4", bbox B
Reconciliation rule 예시:
- Bbox overlap이 높고 normalized text가 같으면 하나로 합칩니다.
- Native health가 높으면 native text를 primary로 둡니다.
- Critical token pattern에서 충돌하면 auto-select하지 않고 validation flag를 냅니다.
- Layout region과 맞지 않는 span은 orphan queue로 보냅니다.
- 원 후보와 선택 근거를 provenance에 남깁니다.
{
"selected": "native:E204",
"alternatives": ["ocr:E2O4"],
"decision": "native_health_high_and_alarm_regex_valid",
"requires_review": false
}
17. Markdown은 Export일 뿐이다
Markdown은 LLM context와 사람 검토에 편리하지만 다음을 완전하게 표현하지 못합니다.
- 정확한 page bbox
- Overlapping region
- Complex merged table cell
- Figure와 caption relation
- 여러 reading-order 후보
- Native/OCR span provenance
- Confidence와 parser decision
따라서 다음 순서를 지킵니다.
canonical JSON / document graph ← source of truth
├─ Markdown export
├─ HTML export
├─ chunk text
├─ table semantic rows
└─ citation renderer
Markdown을 다시 parse해 canonical 구조를 복원하려 하지 않습니다.
18. Parser 제품보다 Routing Policy를 고른다
Docling은 layout analysis와 table structure recognition을 결합한 document conversion toolkit을 제시합니다. MinerU와 Marker도 PDF·image에서 Markdown·JSON과 table·formula 등을 추출하는 공개 구현을 제공합니다.
이 목록은 순위가 아닙니다. Version과 backend가 빠르게 바뀌므로 다음처럼 비교합니다.
| Dimension | 질문 |
|---|---|
| Domain quality | 우리 manual·SOP·report에서 구조가 맞는가? |
| Modality | Scan, table, equation, handwritten mark를 처리하는가? |
| Source fidelity | Page·bbox·cell·span을 반환하는가? |
| Privacy | Local execution이 가능한가, 외부 전송 조건은 무엇인가? |
| Throughput | Page/s, GPU·CPU memory, batch 성능은 어떤가? |
| Determinism | 같은 input·revision에서 결과가 안정적인가? |
| Extensibility | Custom class, OCR, postprocessor를 붙일 수 있는가? |
| License | Code·model·dataset license가 사용 조건에 맞는가? |
한 parser가 모든 page에서 이기지 않을 수 있습니다.
born-digital simple → fast native parser
scanned Korean SOP → OCR pipeline B
complex table page → table specialist C
formula-heavy paper → document model D
low confidence → fallback + quarantine
19. Gold Set은 Document Class를 층화한다
무작위 100페이지보다 실패 위험을 반영한 sample이 필요합니다.
strata:
- born_digital_single_column
- born_digital_multi_column
- scanned_clean
- scanned_noisy_rotated
- mixed_korean_english_codes
- borderless_table
- merged_header_table
- multi_page_table
- diagram_with_labels
- warning_and_footnote
- corrupted_font_encoding
각 stratum에서 page뿐 아니라 downstream 질문도 annotation합니다.
page gold:
element boxes, labels, order, exact text, table grid
query gold:
answerable source element/cell, expected citation region
20. Metric을 단계별로 나눈다
Element Detection
Class별 precision, recall과 bbox IoU를 봅니다. 평균 mAP만 보면 rare warning class가 가려질 수 있습니다.
Reading Order
- 인접 pair accuracy
- 전체 pair order accuracy
- Sequence edit distance
- Section boundary violation
OCR
Character Error Rate:
$$ CER=\frac{S+D+I}{N} $$
일반 CER 외에 alarm code·숫자·단위 같은 critical token exact match를 따로 봅니다.
Table Structure
- Row·column count exact match
- Header association accuracy
- Cell text exact/normalized match
- Span accuracy
- Tree-edit-distance 기반 similarity
TableFormer 논문이 사용하는 TEDS 계열 score도 참고할 수 있지만, downstream query가 필요한 cell을 찾는지 함께 봅니다.
Citation Round-trip
canonical element ID
→ source page and bbox
→ render evidence crop
→ human can verify the exact claim
Round-trip 실패는 검색 점수가 좋아도 release를 막는 것이 안전합니다.
21. End-to-end RAG Metric만 보면 원인을 잃는다
Answer exact match가 낮을 때 다음이 모두 원인일 수 있습니다.
parser omitted a row
→ chunker split header from value
→ retriever missed the row
→ generator misread the context
따라서 같은 sample에 stage label을 남깁니다.
| Stage | 핵심 질문 |
|---|---|
| Parse | Gold element와 text·structure가 존재하는가? |
| Chunk | 필요한 element relation이 유지됐는가? |
| Retrieve | Gold chunk/cell이 top-k에 있는가? |
| Generate | 제공된 근거로 올바르게 답했는가? |
| Cite | 정확한 page·bbox를 반환했는가? |
검색 평가 글의 source-span gold set과 연결하면 parser regression이 retrieval 문제로 오인되는 것을 막을 수 있습니다.
22. Parser Release Gate 예시
candidate: parser-config-8
baseline: parser-config-7
gates:
required_class_recall:
safety_warning: ">= 0.995"
table: ">= baseline"
critical_token_exact_match: ">= 0.999"
reading_order_pair_accuracy: ">= baseline - 0.002"
citation_roundtrip: "1.0"
unparsed_page_rate: "<= 0.001"
p95_seconds_per_page: "<= capacity budget"
peak_memory: "<= worker limit"
수치는 예시값입니다. Safety document와 일반 newsletter에 같은 gate를 적용할 필요는 없습니다.
23. 가상 반도체 SOP Page 적용 예시
아래는 실제 회사 문서를 재현한 것이 아닌 가상 page입니다.
page 12
heading: "E204 Vacuum Alarm"
left column: condition and sensor values
right column: recovery sequence table
orange box: "Isolation valve를 먼저 닫을 것"
footer: revision 8 / internal
좋은 canonical output은 다음을 만족합니다.
- Heading이 두 column의 parent입니다.
- 왼쪽 condition을 다 읽은 뒤 오른쪽 recovery table로 이동합니다.
- Orange warning이 recovery step 1보다 먼저 적용되는 relation을 가집니다.
50 mTorr와E204가 character-level exact match입니다.- Footer는 검색 text에서 제외하되 revision·classification metadata로 보존합니다.
- Table row chunk가 heading과 warning context를 함께 참조합니다.
- Answer citation이 page 12의 warning과 해당 table row 두 region을 가리킵니다.
단순 Markdown의 시각적 품질만 보면 2·3·5·7을 검증하기 어렵습니다.
24. 운영에서 남길 Trace
{
"trace_id": "parse_01j...",
"document_version_id": "docv_01j...",
"page": 12,
"route": "hybrid_complex_table",
"native_text_health": 0.96,
"ocr_regions": 2,
"layout_model_revision": "layout-x@sha256:...",
"table_model_revision": "table-y@sha256:...",
"elements": 23,
"orphan_spans": 0,
"low_confidence_elements": 1,
"duration_ms": 842,
"artifact_refs": {
"page_render": "...",
"raw_candidates": "...",
"canonical_page": "...",
"visual_overlay": "..."
}
}
Quality issue를 재현하려면 최종 Markdown뿐 아니라 page render, raw model output, reconciliation decision과 overlay가 필요합니다.
25. 실패를 조용히 Text로 만들지 않는다
다음은 quarantine 또는 fallback 후보입니다.
- Page render 실패
- Native text와 image가 크게 불일치
- Reading order graph cycle
- Table grid에 cell이 배치되지 않음
- OCR critical token confidence 낮음
- Required warning class 누락
- Canonical schema violation
- Citation bbox가 page 밖
fail closed for knowledge quality:
malformed evidence
→ do not index as ordinary paragraph
→ preserve raw artifact
→ route to fallback or review
잘못된 표를 평문으로 넣으면 system은 “처리 성공”으로 보이지만 잘못된 답을 자신 있게 생성합니다.
실전 체크리스트
- Document가 아니라 page별 digital·scan·hybrid·corrupt route를 결정한다.
- 원본 byte와 page render config를 보존한다.
- Coordinate origin, unit, rotation과 transform이 명시돼 있다.
- Native text health를 검사하고 selective OCR fallback을 사용한다.
- OCR engine·model·language·preprocessing revision을 기록한다.
- Alarm code·숫자·단위의 critical token exact match를 본다.
- Layout element class와 bbox를 canonical schema에 저장한다.
- Reading order와 figure·caption·warning relation을 분리한다.
- Repeated header/footer를 삭제하기 전에 semantic relevance를 판정한다.
- Table grid, header, span, cell text와 bbox를 정본으로 둔다.
- Markdown·HTML·semantic row는 canonical table의 파생물이다.
- Native/OCR 충돌 후보와 선택 근거를 남긴다.
- Domain document class별 gold pages가 있다.
- Layout·order·OCR·table·citation metric을 따로 측정한다.
- Parser quality와 page/s·memory·privacy·license를 함께 비교한다.
- Low-confidence와 malformed page가 quarantine에 드러난다.
스스로 확인하기
Q1. PDF에서 text가 잘 복사되면 layout model이 필요 없는가?
단일 column 평문에는 필요 없을 수 있습니다. 그러나 heading hierarchy, multi-column order, table·caption·warning relation과 citation bbox가 필요하면 native glyph만으로 부족합니다. Document class별 fast path를 둘 수 있습니다.
Q2. OCR을 전체 page에 적용하면 native text 오류도 해결되지 않는가?
일부 오류는 해결하지만 정확한 native 숫자를 오인식하고 비용·latency가 늘며 중복 text가 생길 수 있습니다. Page health를 판정하고 필요한 region에만 OCR을 적용한 결과와 비교하세요.
Q3. 표를 Markdown으로 잘 출력하면 구조 보존이 끝난 것인가?
아닙니다. Merged cell, multi-row header, cell bbox와 page continuation이 손실될 수 있습니다. Grid와 relation을 canonical form으로 저장하고 Markdown은 export로 취급합니다.
Q4. 공개 benchmark에서 가장 높은 parser를 고르면 되는가?
아닙니다. Training·benchmark domain과 내부 문서의 layout·언어·scan quality가 다릅니다. 실제 corpus를 층화한 gold set에서 품질, cost, privacy, latency와 source fidelity를 비교해야 합니다.
Q5. RAG answer 평가만 통과하면 parser metric은 생략해도 되는가?
안 됩니다. 현재 query가 우연히 parser 누락 영역을 묻지 않을 수 있고, 실패 원인을 retrieval·generation과 구분할 수 없습니다. Stage metric과 end-to-end metric을 함께 유지합니다.
마무리
RAG 문서 파싱의 완료 조건은 “문자열을 얻었다”가 아닙니다.
meaningful elements
+ correct reading order
+ table and relation structure
+ native/OCR provenance
+ exact source coordinates
+ domain-specific quality gates
= citation-ready canonical document
다음 글 Canonical Document ID·Versioning·Dedup에서는 rename·재업로드·같은 내용·새 revision을 구분하는 identity 계층과 chunk ID, hash, exact·near duplicate, tombstone을 설계합니다.
참고문헌
- Auer et al., Docling Technical Report, 2024.
- Pfitzmann et al., DocLayNet: A Large Human-Annotated Dataset for Document-Layout Analysis, 2022.
- Nassar et al., TableFormer: Table Structure Understanding with Transformers, CVPR 2022.
- Zhong et al., PubLayNet: Largest Dataset Ever for Document Layout Analysis, ICDAR 2019.
- Docling Project, Docling Documentation and Usage, accessed 2026-07-16.
- OpenDataLab, MinerU Repository and Documentation, accessed 2026-07-16.
- Datalab, Marker Repository and Documentation, accessed 2026-07-16.
검증 메모 — 도구 문서와 논문은 2026년 7월 16일 확인했습니다. Parser와 OCR 성능은 version·backend·language·hardware·render DPI·문서 유형에 따라 달라집니다. 본문의 threshold, schema와 release gate는 시작 템플릿이며, 특정 회사 문서나 측정 결과를 주장하지 않습니다. 실제 corpus의 license와 privacy 조건을 확인하고 domain-stratified gold pages에서 후보를 같은 입력·revision으로 재평가해야 합니다.