TRENDSHIFT #14 딥다이브 · 2026-06-04

opendataloader-pdf 딥다이브
— PDF를 'AI가 바로 먹는 데이터'로 바꾸고 접근성까지 자동화

사람 눈에는 멀쩡한 PDF가 컴퓨터에게는 글자가 흩뿌려진 그림 한 장일 때가 많습니다. 표는 칸이 무너지고, 두 단(段) 글은 순서가 꼬이죠. OpenDataLoader PDF는 PDF를 분석해 제목·문단·표·읽는 순서를 살린 구조화 데이터(Markdown · 좌표 포함 JSON · HTML)로 바꿔, LLM·RAG에 바로 넣을 수 있게 합니다. 동시에 태그 없는 PDF를 시각장애인용 접근성 PDF로 자동 변환합니다. (저장소: opendataloader-project/opendataloader-pdf · Java 85%+ · Maven/PyPI/npm · ⭐ 약 23,000 · Apache-2.0)
목차
  1. 프로젝트 한줄 요약
  2. 왜 주목받는가
  3. 기술 스택 전체 지도
  4. 아키텍처 심화 분석
  5. 디렉토리 구조 해부
  6. 학습 포인트 (기술별)
  7. 시스템 요구사항
  8. 직접 해볼 수 있는 실습 과제
  9. 관련 기술 심화 학습 로드맵
  10. 핵심 키워드 사전
  11. 참고 링크

1프로젝트 한줄 요약

한 문장으로: "PDF를 AI가 읽기 좋은 구조화 데이터로 바꾸고, 동시에 접근성 PDF로 자동 태깅하는 오픈소스 파서."

OpenDataLoader PDF는 두 가지 일을 합니다. 첫째, PDF에서 제목·문단·표·리스트·이미지올바른 읽는 순서(reading order)로 뽑아 Markdown·JSON·HTML로 내보냅니다. 이때 모든 요소에 경계상자(bounding box, 화면상 위치 좌표)가 붙어, RAG에서 "이 답의 근거가 원문 몇 페이지 어디"인지 짚어 줄 수 있습니다. 둘째, 구조 정보가 없는 PDF를 시각장애인용 스크린리더가 읽을 수 있는 Tagged PDF자동 변환합니다.

코어는 Java(JVM)로 작성됐고, 파이썬·Node.js·자바용 SDK를 제공합니다. 만든 곳은 한글과컴퓨터, 즉 한컴(Hancom Inc.)입니다(소스 저작권 헤더와 연락처 open.dataloader@hancom.com으로 확인). 라이선스는 Apache-2.0로, 상업적 사용에 매우 너그럽습니다.

영웅 비유

"종이 서류를 정리해 항목별로 라벨 붙인 엑셀로 만들어 주는 비서"

책상 위에 뒤죽박죽 쌓인 서류 더미가 PDF라면, OpenDataLoader는 그걸 받아 "이건 제목, 이건 표의 셀, 이건 각주"라고 라벨을 붙이고 읽을 순서대로 정리해 주는 비서입니다. 정리된 결과는 컴퓨터(LLM)가 한눈에 알아보고, "몇 번째 서류 어느 줄에서 나온 정보"인지도 적어 둡니다. 게다가 이 비서는 같은 서류를 시각장애인도 읽을 수 있는 점자책 버전으로도 동시에 만들어 줍니다.

용어
RAG (Retrieval-Augmented Generation, 검색 증강 생성)
LLM이 답할 때, 미리 모아 둔 외부 문서를 검색해 근거로 삼는 기법. "통째로 외우게" 하는 대신 "필요할 때 자료를 찾아보게" 하는 방식이죠. 이때 PDF를 잘게 잘라(chunk) 검색 가능한 형태로 만들어야 하는데, PDF→구조화 텍스트 변환이 RAG 품질의 첫 단추이자 흔한 병목입니다. OpenDataLoader는 바로 이 단계를 담당합니다.
용어
읽는 순서 (Reading Order)
PDF는 글자를 "사람이 읽는 순서"가 아니라 "그려진 순서"로 저장합니다. 그래서 신문처럼 두 단으로 된 글을 그냥 추출하면 왼쪽 단과 오른쪽 단이 한 줄씩 번갈아 섞여 엉망이 됩니다. 읽는 순서 복원이란, 시각적 배치와 무관하게 사람이 실제로 읽는 논리적 순서로 텍스트를 다시 줄 세우는 일입니다.

2왜 주목받는가

'RAG 전처리 수요'와 '접근성 규제 강제화'라는 두 거대 흐름의 교차점

이 프로젝트가 약 2.3만 개의 별을 모은 건 운이 아니라 타이밍과 실력입니다. 지금 두 가지 거대한 수요가 동시에 폭발하고 있습니다. ① 모든 회사가 사내 PDF로 RAG·챗봇을 만들려 하는데 PDF 전처리가 병목이고, ② 유럽 접근성법(EAA, 2025-06-28 발효)·미국 ADA/Section 508·한국 디지털포용법 등으로 PDF 접근성이 법적 의무가 됐습니다(수동 보정 비용은 문서당 $50~200). OpenDataLoader는 이 둘을 한 번에 풉니다.

자체 벤치마크(opendataloader-bench, 실문서 200개)에서 하이브리드 모드가 종합 1위(0.907)를 주장합니다. 경쟁 오픈소스 파서와 비교하면:

엔진종합점수표 추출
opendataloader [hybrid]0.907 (1위)0.928
docling0.8820.887
marker0.8610.808
unstructured0.8410.588
opendataloader (로컬)0.8310.489
markitdown0.5890.273
차별점 1 · 모든 요소에 경계상자

RAG에서 "원문 위치 하이라이트"가 가능

대부분의 오픈소스 파서는 텍스트만 뽑고 버립니다. OpenDataLoader는 모든 요소에 [left, bottom, right, top] 좌표를 붙입니다. 그래서 챗봇이 답할 때 "이 근거는 원문 3페이지 여기"라고 정확한 위치를 짚어 인용할 수 있습니다. 신뢰가 생명인 법률·의료·금융 문서에서 결정적입니다.

차별점 2 · GPU 없는 결정론 로컬 모드

CPU에서 초당 60+ 페이지, 결과가 항상 같음

로컬 모드는 GPU가 필요 없고, 페이지당 약 0.015초로 매우 빠릅니다(marker는 GPU 필요 + 약 1,000배 느린 53.9초/페이지). 게다가 같은 입력이면 항상 같은 출력이 나오는 결정론적(deterministic) 동작이라, 데이터가 외부로 나가지 않습니다. 복잡한 페이지만 AI 백엔드로 보내는 '하이브리드'로 정확도를 더 끌어올릴 수 있죠.

차별점 3 · 오픈소스 최초 end-to-end Tagged PDF 생성

접근성 PDF를 처음부터 끝까지 무료로

docling 같은 도구는 Markdown·JSON만 내보내고 Tagged PDF는 못 만듭니다(보통 태그 쓰기 단계에 상용 SDK가 필요). OpenDataLoader는 미태깅 PDF→Tagged PDF 전 과정을 Apache-2.0 오픈소스로 처리합니다. 이 점이 접근성 시장에서 독보적입니다.

함정
"AI 안전"이 빠진 파서는 프롬프트 인젝션에 뚫린다

악의적인 PDF는 사람 눈에 안 보이는 글자(투명·0크기 폰트, 페이지 밖 텍스트)에 "이전 지시를 무시하고 ~하라" 같은 명령을 숨겨 둘 수 있습니다. 그냥 텍스트를 다 긁는 파서는 이 독을 그대로 LLM에 먹입니다.

해결
추출 단계에서 숨은 텍스트를 걸러낸다

OpenDataLoader는 투명/0크기 폰트, 페이지 밖 콘텐츠, 의심 레이어를 자동으로 필터링해 프롬프트 인젝션을 방어합니다(--sanitize). "AI가 먹을 데이터"를 만드는 도구답게, 안전을 파이프라인에 내장한 점이 돋보입니다.

3기술 스택 전체 지도

코어는 Java(JVM), 그 위에 Python·Node·Java SDK를 얹은 모노레포 — 엔진은 veraPDF가 받친다

이 프로젝트는 한 저장소 안에 여러 언어 패키지를 담은 모노레포입니다. 코드 바이트 비율은 Java가 압도적(약 168만 줄 분량)이고 Python·TypeScript·JavaScript·Shell이 보조합니다. 즉 진짜 엔진은 Java이고, 다른 언어는 그 Java를 호출하는 얇은 껍데기(wrapper)입니다.

① 코어 — Java (java/, Maven 멀티모듈)

부품역할
Maven (멀티모듈)빌드 도구. core(파싱 엔진) + cli(명령행) 모듈. 컴파일 타깃 Java 11
veraPDF wcag-algorithms엔진의 심장. 레이아웃·접근성 알고리즘 라이브러리(아래 용어 박스)
jackson-databindJSON 직렬화(결과를 JSON으로 출력)
commons-cli명령행 옵션 파싱
okhttp하이브리드 모드에서 AI 백엔드와 HTTP 통신
용어
veraPDF / WCAG 알고리즘
veraPDF는 PDF/A·PDF/UA 표준 준수를 검증하는 산업 표준 오픈소스 검증기입니다. 그 안의 wcag-algorithms는 "이 글자 덩어리가 제목인가 본문인가, 읽는 순서는 무엇인가" 같은 레이아웃·접근성 판단 알고리즘을 담고 있죠. OpenDataLoader가 "어떻게 오픈소스 단독으로 접근성·Tagged PDF까지 해내는가"의 기술적 비밀이 바로 이 라이브러리에 기대고 있다는 점입니다.

② Python SDK — JVM을 부르는 얇은 래퍼

python/opendataloader-pdf/는 "Java CLI를 위한 파이썬 래퍼"입니다. 기본 의존성이 아예 없습니다(dependencies = []) — JAR 파일을 품고 있다가 JVM 프로세스를 띄워 일을 시키는 구조죠. 다만 선택 의존성 [hybrid]를 깔면 하이브리드 백엔드 서버가 따라옵니다.

구성내용
빌드 백엔드hatchling (커스텀 빌드로 JAR을 휠에 포함)
콘솔 명령opendataloader-pdf · opendataloader-pdf-hybrid(서버)
[hybrid] 추가분docling[easyocr] + FastAPI + uvicorn → 하이브리드 백엔드 서버
MCP 서버 패키지opendataloader-pdf-mcp — LLM이 도구로 호출

③ Node.js SDK + 배포 채널

node/opendataloader-pdf/는 TypeScript로 작성된 npm 패키지(@opendataloader/pdf)로, 역시 번들된 JAR로 JVM을 띄웁니다. 배포는 네 갈래입니다.

채널패키지
PyPIopendataloader-pdf, [hybrid], langchain-opendataloader-pdf
npm@opendataloader/pdf
Maven Centralorg.opendataloader:opendataloader-pdf-core
주목할 설계 — 옵션 단일소스화

세 SDK의 옵션이 어떻게 항상 같을까요? Java CLI가 --export-options로 옵션 명세(options.json)를 내보내면, 스크립트(generate-options.mjs)가 그걸 읽어 Python·Node용 옵션 코드를 자동 생성합니다(*_generated). "한 곳에서 정의하면 나머지는 자동"이라, 옵션이 어긋날 일이 구조적으로 없습니다. 멀티언어 프로젝트의 모범 패턴입니다.

4아키텍처 심화 분석

'안전 필터 → 구조 추출 → 읽는 순서 → (선택)하이브리드 → 출력' 파이프라인 한 줄기 따라가기

코어의 동작은 processors 패키지로 짜인 파이프라인입니다. PDF 한 장이 들어와 여러 단계를 거쳐 구조화 데이터로 나오는 길을, 위에서 아래로 따라가 봅시다.

PDF 입력 (디지털 / 스캔 / 태그된 PDF) │ ▼ OpenDataLoaderPDF (진입점) + Config ┌────────────────────────────────────────────────────┐ │ 1. 콘텐츠 안전 / 필터 │ │ HiddenTextProcessor (투명·0크기 폰트, 페이지 밖) │ │ ContentSanitizer (--sanitize) │ │ │ │ 2. 레이아웃·구조 추출 (veraPDF wcag-algorithms) │ │ TextLine → Text │ │ Table(Border / Cluster / Special / Normalizer) │ │ Heading · List · Paragraph · Caption │ │ HeaderFooter · Strikethrough · Level │ │ (TaggedDocument: 원본 태그가 있으면 그대로 사용) │ │ │ │ 3. Reading Order 정렬 │ │ XYCutPlusPlusSorter (다단 → 1차원 순서) │ │ │ │ 4. (선택) 하이브리드 라우팅 │ │ HybridDocumentProcessor → TriageProcessor │ │ 복잡한 페이지만 AI 백엔드로: │ │ Docling / Hancom AI (OCR·수식·그림 설명) │ │ (간단한 페이지는 로컬 0.02초 유지) │ └────────────────────────────────────────────────────┘ │ ▼ 출력 생성기 (시맨틱 요소 → 포맷) JsonWriter · MarkdownGenerator · HtmlGenerator TextGenerator · PDFWriter · AutoTagger(Tagged PDF)

핵심 설계 패턴 1 — 두 갈래 입력 처리(태그 vs 휴리스틱)

입력 PDF에 이미 구조 태그가 들어 있으면(작성자가 잘 만든 PDF), TaggedDocumentProcessor작성자의 의도를 그대로 추출합니다(--use-struct-tree). 태그가 없으면 휴리스틱(처리기들)이 글자 좌표·크기·간격을 보고 "이건 제목, 이건 표"를 추론합니다. 좋은 재료가 있으면 살리고, 없으면 손수 분석하는 영리한 분기입니다.

핵심 설계 패턴 2 — Triage 기반 하이브리드

모든 페이지를 AI에 보내면 느리고 비쌉니다. 그래서 TriageProcessor가 페이지별 복잡도를 판정해 "간단한 페이지=로컬 결정론(빠름·무료), 복잡한 페이지(무테두리 표·스캔·수식)=AI 백엔드"로 자동 분기합니다. 응급실에서 환자 중증도를 분류(triage)하듯, 자원을 꼭 필요한 곳에만 쓰는 전략입니다. AI 백엔드는 별도 로컬 서버(FastAPI+Docling)로 떠 있고 okhttp로 통신합니다.

용어
XY-Cut++ (읽는 순서 정렬 알고리즘)
페이지를 가로(X)·세로(Y) 방향으로 재귀적으로 잘라(cut) 블록을 나눈 뒤, 사람이 읽는 순서대로 1차원으로 줄 세우는 고전 알고리즘의 개선판입니다. 신문처럼 여러 단으로 나뉜 레이아웃이나 사이드바를 올바른 순서로 정렬하는 데 쓰입니다. 코드에서는 XYCutPlusPlusSorter가 담당합니다(--reading-order xycut).

핵심 설계 패턴 3 — 출력 생성기 분리 + 결정론

분석이 끝나면 시맨틱 요소(의미 단위)가 만들어지고, 그걸 JsonWriter·MarkdownGenerator·HtmlGenerator·AutoTagger포맷별 생성기가 각자 변환합니다. 분석과 출력을 분리했기에 --format json,markdown처럼 여러 포맷을 한 번에 뽑을 수 있죠. 로컬 모드는 같은 입력이면 항상 같은 출력(결정론)이라, 테스트·재현이 쉽습니다.

JSON 출력은 이런 모양입니다. 각 요소가 타입·페이지·좌표·내용을 모두 담습니다.

// heading(제목) 요소 하나의 JSON (README 예시)
{ "type":"heading", "id":42, "level":"Title",
  "page number":1,
  "bounding box":[72.0, 700.0, 540.0, 730.0],  // [좌,하,우,상] PDF 포인트
  "font":"Helvetica-Bold", "font size":24.0,
  "content":"Introduction" }
// 72pt = 1인치. 이 좌표 덕에 원문 위치를 정확히 짚을 수 있다
이 레포에서 '정상'이 뭔지

코어 패키지를 열면 processors/ 안에 XxxProcessor가 잔뜩 보입니다. 이걸 "파이프라인의 한 공정"으로 읽으면 됩니다 — 컨베이어 벨트 위에서 각 기계가 한 가지 일(표 찾기·제목 찾기·읽는 순서 정렬)만 합니다. 그리고 json/markdown/html/pdf/ 폴더는 "출구"이고, hybrid/는 "복잡한 건 외주 주는 창구"입니다.

5디렉토리 구조 해부

언어별로 폴더가 나뉜 모노레포 — 진짜 엔진은 java/.../core

최상위는 언어별 폴더(java/·python/·node/)로 갈리고, 빌드를 묶는 루트 package.json이 모노레포 오케스트레이션을 합니다. 진짜 로직은 java/opendataloader-pdf-core/에 있습니다.

opendataloader-pdf/ ├── java/ ★코어 (Maven 멀티모듈) │ ├── pom.xml parent POM │ ├── opendataloader-pdf-core/ 파싱 엔진 (org.opendataloader.pdf.*) │ │ └── src/main/java/.../ │ │ ├── api/ 진입점 OpenDataLoaderPDF · Config · AutoTagger │ │ ├── processors/ ★파이프라인 단계들 │ │ │ └── readingorder/ XYCutPlusPlusSorter │ │ ├── hybrid/ Docling · Hancom AI 클라이언트 · Triage │ │ ├── json/ markdown/ 출력 생성기 │ │ ├── html/ text/ pdf/ 출력 생성기 │ │ └── autotagging/ Tagged PDF / 접근성 태그 생성 │ └── opendataloader-pdf-cli/ CLIMain (명령행 진입점) │ ├── python/ │ ├── opendataloader-pdf/ PyPI 래퍼 (hatchling, [hybrid] extras) │ └── opendataloader-pdf-mcp/ MCP 서버 ├── node/opendataloader-pdf/ npm @opendataloader/pdf (TypeScript) │ ├── docs/ samples/ examples/ 문서 · 예제 PDF · 사용 예제 ├── build-scripts/ scripts/ 빌드·벤치·옵션 자동생성 스크립트 ├── options.json / schema.json CLI에서 자동 생성된 옵션 단일소스 ├── package.json 모노레포 워크스페이스 빌드 └── LICENSE / NOTICE / THIRD_PARTY Apache-2.0 (2.0 이전은 MPL-2.0)
위치역할
java/.../api/외부에서 호출하는 공개 진입점(OpenDataLoaderPDF·Config) — 여기부터 읽기
java/.../processors/표·제목·리스트·문단·숨김텍스트 등 파이프라인 단계 + 읽는 순서 정렬
java/.../hybrid/Docling·Hancom AI 클라이언트, Triage, 스키마 변환
java/.../autotagging/Tagged PDF·접근성 태그 생성(이 프로젝트의 차별 무기)
python / node 래퍼JAR을 품고 JVM을 띄우는 얇은 껍데기. 옵션 코드는 자동 생성

6학습 포인트 (기술별)

문서 파싱·접근성·멀티언어 패키징이라는 세 가지 실무 주제가 한곳에

① 문서 레이아웃 분석 + 읽는 순서 복원

"PDF는 왜 그냥 긁으면 안 되는가"를 코드로 이해할 수 있습니다. 좌표·폰트 정보로 제목/표/문단을 분류하고, XY-Cut++로 다단 레이아웃을 바로잡는 과정은, 문서 AI(Document Intelligence) 분야의 핵심 기술입니다. RAG 파이프라인을 제대로 만들려는 사람에게 특히 값집니다.

실습 아이디어

두 단으로 된 PDF를 골라, 일반 추출기(예: 단순 pdftotext)와 OpenDataLoader의 결과를 나란히 비교해 보세요. "읽는 순서가 살아 있다"는 게 RAG 품질에 얼마나 큰 차이를 만드는지 눈으로 확인하는 게 목표입니다.

② PDF 접근성과 Tagged PDF

평소 접하기 어려운 접근성(a11y) 도메인을 다뤄 봅니다. 태그 없는 PDF를 스크린리더가 읽을 수 있는 Tagged PDF로 바꾸는 autotagging/은, "보이는 것"과 "기계가 읽는 구조"가 어떻게 다른지를 가르쳐 줍니다. 법적 의무가 된 분야라 실무 가치도 높습니다.

③ AI 데이터 파이프라인의 안전 설계

숨은 텍스트·프롬프트 인젝션을 추출 단계에서 걸러내는 설계는, "AI가 먹을 데이터"를 만드는 모든 파이프라인이 고민해야 할 주제입니다. 데이터 위생(data hygiene)을 입구에서 처리하는 사고방식을 배울 수 있습니다.

④ 멀티언어 패키징 + 옵션 단일소스화

하나의 Java 엔진을 Python·Node·Java에서 똑같이 쓰게 하고, 옵션을 한 곳에서 정의해 자동 생성하는 패턴(--export-optionsgenerate-options.mjs)은, 여러 언어로 라이브러리를 배포하는 팀에게 그대로 유용한 실전 노하우입니다.

⑤ Triage로 비용·정확도 절충하기

"쉬운 건 빠른 로컬, 어려운 것만 비싼 AI"라는 하이브리드 전략은, LLM을 실제 서비스에 넣을 때 비용을 통제하는 보편적 패턴입니다. TriageProcessor가 어떤 신호로 복잡도를 판정하는지 따라가 보면, AI 시스템의 비용 설계 감각이 생깁니다.

7시스템 요구사항

Java 11+ (JVM)만 있으면 로컬은 GPU 불필요. 하이브리드만 Python 백엔드 필요

가장 큰 장점은 로컬 모드에 GPU가 필요 없다는 점입니다. JVM만 있으면 됩니다. 한 가지 주의할 성능 포인트는, convert() 호출마다 JVM 프로세스를 새로 띄우므로 파일을 하나씩이 아니라 배치로 한 번에 넘기는 게 빠릅니다.

항목요구사항
필수Java 11+ (JVM). Python SDK 사용 시 Python 3.10+
로컬 모드GPU 불필요. CPU에서 약 60+ 페이지/초(결정론적)
하이브리드 모드별도 백엔드 서버(FastAPI+Docling+EasyOCR) — OCR/수식/복잡 표용
호출 성능호출당 JVM 기동 → 여러 파일은 배치로 한 번에 전달 권장
미지원Word/Excel/PPT 처리 안 함(PDF 전용)
무료/유료 경계추출·OCR·수식·자동 태깅까지 무료. PDF/UA export·Accessibility Studio는 엔터프라이즈 유료
# 로컬(빠름, 기본) — pip 한 줄
pip install -U opendataloader-pdf
# Python에서 — 여러 파일을 배치로 한 번에
import opendataloader_pdf
opendataloader_pdf.convert(
    input_path=["a.pdf", "b.pdf", "folder/"],
    output_dir="output/",
    format="markdown,json")   # 여러 포맷 동시 출력
# 하이브리드(복잡 표·OCR·수식) — 서버 + 처리 2단계
pip install -U "opendataloader-pdf[hybrid]"
opendataloader-pdf-hybrid --port 5002          # 터미널1: 백엔드 서버
opendataloader-pdf --hybrid docling-fast a.pdf  # 터미널2: 처리
# 접근성 태깅:  opendataloader-pdf --format tagged-pdf a.pdf

주요 CLI 옵션(실제 확인): --format(json/markdown/html/text/tagged-pdf), --sanitize(안전 필터), --use-struct-tree(원본 태그 사용), --reading-order(기본 xycut/off), --pages, --image-output, --include-header-footer, --hybrid, --threads, --to-stdout, --export-options.

8직접 해볼 수 있는 실습 과제

난이도별 5개 — 변환 → 좌표 활용 → 접근성 → 비교 → RAG 연결
난이도 ★☆☆☆☆ · 입문

1. PDF를 Markdown·JSON으로 변환해 보기

pip install opendataloader-pdf 후, 손에 있는 PDF 하나를 format="markdown,json"으로 변환해 보세요. Markdown은 사람이 읽기 좋게, JSON은 좌표·타입이 다 담겨 있습니다. 두 출력을 비교하며 "구조화 데이터가 뭔지" 감을 잡습니다.

난이도 ★★☆☆☆ · 좌표 활용

2. 경계상자로 원문에 형광펜 칠하기

JSON의 bounding box 좌표를 읽어, 특정 제목/표 위에 사각형을 그린 이미지를 만들어 보세요(예: PyMuPDF로 렌더). "이 텍스트가 원문 어디서 왔는가"를 시각화하면, RAG에서 출처 인용이 왜 강력한지 체감하게 됩니다.

난이도 ★★★☆☆ · 접근성

3. 태그 없는 PDF를 Tagged PDF로 변환

--format tagged-pdf로 접근성 PDF를 만들고, 무료 스크린리더(예: NVDA)로 읽어 보세요. 변환 전/후를 비교하면 "구조 태그가 있고 없고"가 시각장애인 사용자에게 어떤 차이인지 직접 확인할 수 있습니다.

난이도 ★★★★☆ · 비교 실험

4. 다른 파서와 표 추출 정확도 비교

복잡한 표가 든 PDF를 골라 OpenDataLoader(로컬·하이브리드)와 markitdown·docling의 결과를 비교해 보세요. 벤치마크 수치(0.928 vs 0.273 등)가 실제로 체감되는지, 어떤 표에서 하이브리드가 필요한지 스스로 판단해 봅니다.

난이도 ★★★★★ · 통합

5. RAG 파이프라인에 연결하기

LangChain 통합(langchain-opendataloader-pdf)을 써서, PDF→구조화 chunk→벡터DB→질의응답까지 잇는 미니 RAG를 만들어 보세요. 답변에 경계상자 기반 출처를 함께 보여주면, "신뢰할 수 있는 문서 챗봇"의 핵심을 완성하게 됩니다.

9관련 기술 심화 학습 로드맵

4주 코스 — 문서 파싱 → 접근성 → 멀티언어 패키징 → RAG 통합
주차주제할 일
1주차문서 레이아웃 분석PDF 좌표 모델, 읽는 순서 문제, XY-Cut 알고리즘 개념. processors/ 구조 파악
2주차PDF 접근성Tagged PDF·PDF/UA·WCAG 기초, veraPDF 역할. autotagging/ + 스크린리더 실습
3주차멀티언어 패키징JVM 래핑(Python/Node), 옵션 자동 생성, Maven/PyPI/npm 배포 구조
4주차RAG 통합·하이브리드chunking·임베딩·출처 인용, Triage 비용 설계, LangChain/LlamaIndex 연동
학습 전략

코어가 Java라 진입장벽이 있어 보이지만, Python SDK로 동작을 먼저 익힌 뒤 궁금한 단계만 Java 코어를 들여다보는 순서를 권합니다. 1~2주차(파싱·접근성)는 문서 AI·접근성이라는 희소하면서 수요 큰 영역이고, 3~4주차(패키징·RAG)는 어떤 백엔드/AI 엔지니어에게도 바로 쓸모가 있습니다.

10핵심 키워드 사전

이 글에 나온 용어를 한 줄씩 다시 정리
용어의미
AI-ready dataLLM/RAG에 곧바로 넣을 수 있게 시맨틱 타입·순서가 보존된 구조화 출력
읽는 순서(Reading Order)시각적 배치(다단 등)와 무관하게 사람이 읽는 논리적 순서로 텍스트 재배열
XY-Cut++페이지를 X/Y로 재귀 분할해 다단·사이드바를 올바른 순서로 정렬하는 알고리즘
레이아웃 분석좌표·폰트에서 제목·문단·표·이미지 등 구조 요소와 경계를 식별
경계상자(Bounding box)요소의 [좌,하,우,상] 좌표. RAG의 출처 인용·하이라이트에 필수
Tagged PDF문서 구조(제목/표/순서)를 태그 트리로 담은 PDF. 스크린리더가 읽을 수 있게 함
PDF/UAPDF 접근성 준수 표준(ISO 14289). UA export는 이 프로젝트의 유료 애드온
veraPDFPDF/A·PDF/UA 검증 산업 표준 오픈소스. 그 wcag-algorithms가 엔진의 핵심 의존성
OCR스캔 이미지에서 글자 추출(광학 문자 인식). 하이브리드 모드에서 80+ 언어 지원
RAG외부 문서를 검색해 LLM 답변을 보강하는 기법. PDF 전처리 품질이 좌우
하이브리드 / Triage간단 페이지는 로컬, 복잡 페이지만 AI 백엔드로 자동 분기하는 비용·정확도 절충
프롬프트 인젝션 필터PDF에 숨긴 악성 지시(투명·0크기 폰트, 페이지 밖 텍스트)를 추출 단계에서 제거
결정론적(deterministic)같은 입력이면 항상 같은 출력. 테스트·재현이 쉬움(로컬 모드 특성)
모노레포여러 언어 패키지를 한 저장소에 담는 방식. 루트 package.json이 빌드 오케스트레이션

11참고 링크