fos-blog/study
01 / 홈02 / 카테고리03 / 시리즈
01 / 홈02 / 카테고리03 / 시리즈

카테고리

  • AI 페이지로 이동
    • RAG 페이지로 이동
    • langgraph 페이지로 이동
    • agents.md
    • BMAD Method — AI 에이전트로 애자일 개발하는 방법론
    • Claude Code의 Skill 시스템 - 개발자를 위한 AI 자동화의 새로운 차원
    • Claude Code를 5주 더 쓴 결과 — 스킬·CLAUDE.md를 키워가는 방식
    • Claude Code를 11일 동안 쓴 결과 — 데이터로 본 나의 사용 패턴
    • Claude Code 멀티 에이전트 — Teams
    • AI 에이전트와 디자인의 새 컨벤션 — DESIGN.md, Google Stitch, Claude Design
    • Docling — IBM Research 의 문서 파싱 toolkit 상세 정리
    • 하네스 엔지니어링 실전 — 4인 에이전트 팀으로 코딩 파이프라인 구축하기
    • 하네스 엔지니어링 — 오래 실행되는 AI 에이전트를 위한 설계
    • 멀티모달 LLM (Multimodal Large Language Model)
    • AI 에이전트와 함께 MVP 만들기 — dooray-cli 사례
  • ai 페이지로 이동
    • agent 페이지로 이동
  • algorithm 페이지로 이동
    • live-coding 페이지로 이동
    • 분산 계산을 위한 알고리즘
  • apartment 페이지로 이동
    • 구리 럭키아파트 24평 인테리어 레퍼런스 모음
  • architecture 페이지로 이동
    • [초안] 시니어 백엔드를 위한 API 설계 실전 스터디 팩 — REST · 멱등성 · 페이지네이션 · 버전 전략
    • [초안] API Versioning과 Backward Compatibility: 시니어 백엔드 관점 정리
    • 캐시 설계 전략 총정리
    • [초안] CJ푸드빌 디지털 채널 면접: 슬롯 도메인 경험을 커머스 도메인 설계 능력으로 번역하기
    • [초안] 커머스 Spring 서비스에 Clean/Hexagonal Architecture를 실용적으로 적용하기
    • [초안] 커머스 도메인 모델링: 주문·재고·노출의 세 축을 분리해서 설계하기
    • 커머스 주문 상태와 데이터 정합성 기본기 — CJ푸드빌 면접 대비
    • [초안] 쿠폰/프로모션 동시성과 정합성 기본기 — 선착순·중복 사용 방지·발급/사용/복구
    • [초안] DDD와 도메인 모델링: 시니어 백엔드 관점의 전술/전략 패턴 실전 가이드
    • [초안] Decorator & Chain of Responsibility — 행동을 체인으로 조립하는 두 가지 방식
    • 디자인 패턴
    • [초안] 분산 아키텍처 완전 정복: Java 백엔드 시니어 인터뷰 대비 실전 가이드
    • [초안] 분산 트랜잭션과 Outbox 패턴 — 왜 2PC를 피하고 어떻게 대신할 것인가
    • 분산 트랜잭션
    • [초안] e-Commerce 주문·결제 도메인 모델링: 상태머신, 멱등성, Outbox/Saga 실전 정리
    • [초안] F&B 쿠폰·프로모션·멤버십·포인트 설계
    • [초안] F&B · e-Commerce 디지털 채널 도메인 한 장 정리 — CJ푸드빌 디지털 채널 백엔드 면접 대비
    • [초안] F&B 주문/매장/픽업 상태머신 설계 — CJ푸드빌 디지털 채널 백엔드 관점
    • [초안] F&B 이커머스 결제·환불·정산 운영 가이드
    • [초안] Hexagonal / Clean Architecture를 Spring 백엔드에 적용하기
    • [초안] 대규모 커머스 트래픽 처리 패턴 — 1,600만 고객과 올영세일을 버티는 설계
    • [초안] 레거시 JSP/jQuery 화면과 신규 API가 공존하는 백엔드 운영 전략
    • [초안] MSA 서비스 간 통신: Redis [Cache-Aside](../database/redis/cache-aside.md) × Kafka 이벤트 하이브리드 설계
    • [초안] Observability 입문: 시니어 백엔드가 장애를 탐지하고 대응하는 방식
    • [초안] Outbox / Inbox Pattern 심화 — 분산 메시징의 정합성 문제를 DB 트랜잭션으로 풀어내기
    • [초안] 결제 도메인 멱등성과 트랜잭션 재시도 기본기
    • [초안] 시니어 백엔드를 위한 Resilience 패턴 실전 가이드 — Timeout, Retry, Circuit Breaker, Bulkhead, Backpressure
    • [초안] REST API 버저닝과 모바일 앱 하위 호환성 — CJ푸드빌 디지털 채널 백엔드 관점
    • [초안] Spring Batch vs Event-Driven — 같은 비동기처럼 보이지만 전혀 다른 두 패러다임
    • [초안] Strategy Pattern — 분기문을 없애는 설계, 시니어 백엔드 인터뷰 핵심 패턴
    • [초안] 시니어 백엔드를 위한 시스템 설계 입문 스터디 팩
    • [초안] 템플릿 메서드 패턴 - 백엔드 처리 골격을 강제하는 가장 오래되고 가장 위험한 패턴
    • [초안] 대규모 트래픽 중 무중단 마이그레이션 — Feature Flag + Shadow Mode 실전
  • database 페이지로 이동
    • mysql 페이지로 이동
    • opensearch 페이지로 이동
    • redis 페이지로 이동
    • 김영한의-실전-데이터베이스-설계 페이지로 이동
    • [초안] DB Connection Pool Saturation과 Thread Pool 격리
    • 커넥션 풀 크기는 얼마나 조정해야 할까?
    • 인덱스 - DB 성능 최적화의 핵심
    • [초안] JPA N+1과 커머스 조회 모델: 주문/메뉴/쿠폰 도메인에서 살아남기
    • [초안] MyBatis 기본기 — XML Mapper, resultMap, 동적 SQL, 운영 패턴 정리
    • [초안] MyBatis와 JPA/Hibernate 트레이드오프 — 레거시 백엔드를 다루는 시니어 관점
    • 역정규화 (Denormalization)
    • 데이터 베이스 정규화
  • devops 페이지로 이동
    • docker 페이지로 이동
    • k8s 페이지로 이동
    • k8s-in-action 페이지로 이동
    • observability 페이지로 이동
    • [초안] 커머스/F&B 채널 장애 첫 5분과 관측성 기본기
    • Envoy Proxy
    • [초안] F&B / e-Commerce 운영 장애 대응과 모니터링 — 백엔드 관점 정리
    • Graceful Shutdown
    • [초안] 시니어 백엔드를 위한 SLO와 Error Budget 기반 장애 대응
  • finance 페이지로 이동
    • industry-cycle 페이지로 이동
    • investing 페이지로 이동
  • http 페이지로 이동
    • HTTP Connection Pool
  • interview 페이지로 이동
    • [초안] AI 서비스 팀 경험 기반 시니어 백엔드 면접 질문 뱅크 — Spring Batch RAG / gRPC graceful shutdown / 전략 패턴 / 12일 AI 웹툰 MVP
    • [초안] 커머스/F&B 면접 답변집 — 슬롯 도메인 경험을 주문·결제·쿠폰·매장 설계로 매핑하기
    • [초안] F&B / e-Commerce 운영 모니터링과 장애 대응 인터뷰 정리
    • Observability — 면접 답변 프레임
    • [초안] 시니어 Java 백엔드 면접 마스터 플레이북 — 김병태
    • [초안] NSC 슬롯팀 경험 기반 질문 은행 — 도메인 모델링·동시성·성능·AI 협업
  • java 페이지로 이동
    • concurrency 페이지로 이동
    • jdbc 페이지로 이동
    • opentelemetry 페이지로 이동
    • spring 페이지로 이동
    • spring-batch 페이지로 이동
    • 더_자바_코드를_조작하는_다양한_방법 페이지로 이동
    • [초안] Java 동시성 락 정리 — 커머스 메뉴/프로모션 정책 캐시 갱신 관점
    • [초안] JVM 튜닝 실전: 메모리 구조부터 Virtual Threads, GC 튜닝, 프로파일링까지
    • Java의 로깅 환경
    • MDC (Mapped Diagnostic Context)
    • Java StampedLock — 읽기 폭주에도 쓰기가 밀리지 않는 락
    • Virtual Thread와 Project Loom
  • javascript 페이지로 이동
    • typescript 페이지로 이동
    • AbortController
    • Async Iterator와 제너레이터
    • CommonJS와 ECMAScript Modules
    • 제너레이터(Generator)
    • Http Client
    • Node 백엔드 운영 패턴 — Streams 백프레셔, pipe/pipeline, 멱등성 vs 분산 락
    • Node.js
    • npm vs pnpm — 어떤 기준으로 선택했나
    • `setImmediate()`
  • kafka 페이지로 이동
    • [초안] Kafka 기본 개념 — 토픽, 파티션, 오프셋, 복제
    • Kafka를 사용하여 **데이터 정합성**은 어떻게 유지해야 할까?
    • [초안] Kafka 실전 설계: 파티션 전략, 컨슈머 그룹, 전달 보장, 재시도, 순서 보장 트레이드오프
    • 메시지 전송 신뢰성
  • linux 페이지로 이동
    • fsync — 리눅스 파일 동기화 시스템 콜
    • tmux — Terminal Multiplexer
  • network 페이지로 이동
    • L2(스위치)와 L3(라우터)의 역할 차이
    • L4와 VIP(Virtual IP Address)
    • IP Subnet
  • python 페이지로 이동
    • Python async/await — CompletableFuture·Reactor 와 다른 점, 그리고 blocking I/O 함정
    • Python 의존성 관리 — Java Maven/Gradle 사용자가 만나는 첫 충격
    • FastAPI 기초 — Spring Boot 사용자가 빠르게 익히는 법
    • GPU·CUDA·MPS 기초 — 자바 백엔드 개발자가 처음 만나는 그림
    • Multi-process GPU 워크로드 — 자바 ThreadPool 사용자가 만나는 모델 차이
    • Java 개발자를 위한 Python 심화 — OOP·데코레이터·컨텍스트 매니저
    • PyTorch 기초 — 텐서, 디바이스, 그리고 모델 로딩이 무거운 이유
    • Java 개발자를 위한 Python 문법 핵심
    • ML 서비스 성능 분석 워크플로 — 자바 백엔드 트러블슈팅과 다른 점
    • OCR 동작 원리 — Layout · Text · Post-process 3단계
    • Python 서버의 RSS 가 안 줄어드는 이유 — gc.collect 의 한계와 malloc_trim
  • rabbitmq 페이지로 이동
    • [초안] RabbitMQ Basics — 실전 백엔드 관점에서 정리하는 메시지 브로커 기본기
    • [초안] RabbitMQ vs Kafka — 백엔드 메시징 선택 기준과 실전 운영 관점
  • security 페이지로 이동
    • [초안] 시니어 백엔드를 위한 보안 / 인증 스터디 팩 — Spring Security, JWT, OAuth2, OWASP Top 10
    • [초안] Spring Security 6.x OAuth2 + JWT 상용 인증 설계 — Grant 선택, Resource Server, Refresh Rotation, 로그아웃
  • task 페이지로 이동
    • ai-service-team 페이지로 이동
    • nsc-slot 페이지로 이동
    • sb-dev-team 페이지로 이동
    • the-future-company 페이지로 이동
  • testing 페이지로 이동
    • [초안] 시니어 Java 백엔드를 위한 테스트 전략 완전 정리 — 피라미드부터 TestContainers, 마이크로벤치, Contract까지
  • travel 페이지로 이동
    • 오사카 3박 4일 일정표: 우메다 쇼핑, USJ, 난바·도톤보리, 오사카성
  • web 페이지로 이동
    • [초안] HTTP / Cookie / Session / Token 인증 기본기 — 레거시 JSP와 모바일 API가 공존하는 백엔드 관점
FOS-BLOG · FOOTERall systems normal·v0.1 · 2026.04.27·seoul, kr
Ffos-blog/study

개발 학습 기록을 정리하는 블로그입니다. 공부하면서 기록하고, 기록하면서 다시 배웁니다.

visitors
01site
  • Home↗
  • Posts↗
  • Categories↗
  • About↗
02policy
  • 소개/about
  • 개인정보처리방침/privacy
  • 연락처/contact
03categories
  • AI↗
  • Algorithm↗
  • DB↗
  • DevOps↗
  • Java/Spring↗
  • JS/TS↗
  • React↗
  • Next.js↗
  • System↗
04connect
  • GitHub@jon890↗
  • Source repositoryjon890/fos-study↗
  • RSS feed/rss.xml↗
  • Newsletter매주 1 회 · 한 편의 글→
© 2026 FOS Study. All posts MIT-licensed.
built with·Next.js·Tailwind v4·Geist·Pretendard·oklch
fos-blog/AI/Docling — IBM Research 의…
ai

Docling — IBM Research 의 문서 파싱 toolkit 상세 정리

문서를 RAG·LLM 컨텍스트로 넣으려면 PDF·PPTX·HTML 같은 입력을 깨끗한 텍스트 (또는 markdown / JSON) 으로 변환해야 한다. 이걸 "쉽게" 해주는 라이브러리는 의외로 많지 않다. 표가 있는 PDF, 스캔본, 다단 레이아웃, 페이지 안의 그림과 캡션 같은 변형이 많기 때문. Docling 은 IBM Research (Zurich)...

2026.05.19·9 min read·29 views

문서를 RAG·LLM 컨텍스트로 넣으려면 PDF·PPTX·HTML 같은 입력을 깨끗한 텍스트 (또는 markdown / JSON) 으로 변환해야 한다. 이걸 "쉽게" 해주는 라이브러리는 의외로 많지 않다. 표가 있는 PDF, 스캔본, 다단 레이아웃, 페이지 안의 그림과 캡션 같은 변형이 많기 때문.

Docling 은 IBM Research (Zurich) 가 2024 년에 오픈소스로 공개한 문서 파싱 toolkit 이다. Apache 2.0 라이선스. LangChain·LlamaIndex 와도 곧바로 연결된다.

내가 분석한 한 ML 문서 파싱 서비스가 Docling 위에 자체 OCR 플러그인을 얹어 운영하고 있어서 코드를 좀 깊게 봤다. 이 글은 Docling 의 구조·옵션·플러그인 시스템을 정리한 내용이다. 공식 문서 + 코드 + 실제 운영에서 본 함정을 합쳤다.

한 줄 정의와 위치

Docling 은 다양한 문서 포맷 (PDF·DOCX·PPTX·HTML·이미지) 을 DoclingDocument 라는 단일 중간 표현으로 변환한 뒤 markdown / JSON / HTML / DocTags 로 export 하는 Python 라이브러리다.

비슷한 위치의 다른 도구들과 비교하면 이렇다.

도구특화출력
Docling다양한 포맷 + 표·레이아웃 인식markdown, JSON, HTML, DocTags
unstructured.io폭넓은 포맷, 엔터프라이즈 SaaS 옵션element list
pypdf / pdfplumberPDF 전용, 텍스트 레이어 위주text
markerPDF → markdown, 학술 문서 강점markdown
LlamaParseLlamaIndex 의 클라우드 서비스markdown, JSON

OSS + 로컬 실행 + 다포맷 + 구조 인식의 조합이 Docling 의 자리. RAG 파이프라인에서 "전처리 단계의 표준" 자리를 노린다.

두 가지 아키텍처 패러다임

Docling 은 흥미롭게도 같은 프로젝트 안에 두 가지 다른 접근을 가지고 있다.

1) 전통적 multi-stage 파이프라인

PDF → Layout 감지 → OCR → 표 인식 → reading order → markdown.

각 단계가 별도 모델 또는 라이브러리로 구현된다.

  • Layout — RT-DETR 아키텍처 + DocLayNet 데이터셋. 페이지에서 텍스트·표·그림·헤더 영역을 box 로 잡아낸다. 2025년 12월 도입된 Heron layout model 이 속도 개선판.
  • OCR — 텍스트 박스의 픽셀을 글자로. EasyOCR (기본), Tesseract, RapidOCR, OcrMac (macOS Vision framework), 또는 사용자 정의 플러그인.
  • Table structure — 표 영역을 셀 grid 로 복원. TableFormer 모델 사용.
  • Cell matching — Layout 의 표 좌표와 텍스트 박스를 매칭해 셀 컨텐츠 채우기.
  • Reading order + markdown — bbox 좌표 + 카테고리로 자연스러운 순서 결정, markdown export.

장점은 각 단계가 교체 가능하다는 점. OCR 만 클라우드 API 로 바꾸거나 layout 모델만 더 좋은 걸로 갈아끼울 수 있다.

단점은 cascading error. 앞 단계의 작은 실수가 뒤 단계로 누적된다. Layout 이 표 영역을 잘못 잡으면 cell matching 이 통째로 망가지는 식.

2) Granite-Docling VLM (2026년 1월 공개)

이 한계를 해결하려고 IBM 이 만든 단일 추론 모델. 258M parameter 의 Vision Language Model 로, 페이지 이미지를 받아 한 번에 구조화된 마크업을 토큰으로 생성한다.

  • Layout · OCR · 표 · 순서를 모두 하나의 forward pass 에서 처리
  • 출력은 DocTags 라는 마크업 (JSON 으로 변환 가능)
  • Apache 2.0 + HuggingFace 에서 가중치 공개

장점은 cascading error 가 사라지고, 단일 모델이라 배포가 단순. 단점은 VLM 추론이 무겁고 (GPU 필요) 커스터마이징 여지가 적다는 점. 표·표 안의 표·각주 같은 복잡한 케이스에서 멀티-스테이지가 더 잘 잡는 경우도 여전히 있다.

내가 분석한 서비스는 다국어 OCR 분기 필요성·외부 OCR API 연동 같은 이유로 multi-stage 를 쓰고 있었다. RAG 용도로 정확도가 우선이고 GPU 충분하다면 Granite-Docling 단일 모델 쪽도 고려할 만한 옵션.

DoclingDocument — 단일 중간 표현

Docling 의 핵심 추상화. 모든 변환 경로가 결과적으로 DoclingDocument 를 만들고, 거기서 다양한 포맷으로 export 한다.

python
from docling.document_converter import DocumentConverter
 
converter = DocumentConverter()
result = converter.convert("document.pdf")
doc = result.document          # DoclingDocument
 
# Export
md = doc.export_to_markdown()
data = doc.export_to_dict()    # JSON-serializable
html = doc.export_to_html()
tags = doc.export_to_doctags() # 학습용 마크업

DoclingDocument 안에는 다음이 들어 있다.

  • Pages — 페이지별 메타데이터 (크기, 회전, 텍스트 레이어 여부)
  • Body — 트리 구조의 콘텐츠 (제목·문단·리스트·표·그림)
  • Tables — 별도 컬렉션으로 표 객체 (행·열·셀)
  • Pictures — 그림 객체 (좌표·메타데이터·선택적 base64 PNG)
  • Provenance — 각 요소가 어느 페이지 어느 좌표에서 왔는지 추적

자바로 비유하면 IR (Intermediate Representation) 또는 AST. 입력 포맷이 무엇이든 같은 트리로 정규화되고, export 단계가 포맷별 visitor 패턴.

Pipeline 옵션 — 실전에서 만지는 부분

DocumentConverter 에 PdfFormatOption(pipeline_options=...) 으로 옵션을 주입한다. 자주 만지는 항목:

python
from docling.datamodel.pipeline_options import PdfPipelineOptions
from docling.document_converter import DocumentConverter, PdfFormatOption
from docling.datamodel.base_models import InputFormat
 
pipeline_opts = PdfPipelineOptions(
    do_ocr=True,
    do_table_structure=True,
    table_structure_options={"do_cell_matching": True},
    images_scale=2.0,
    generate_picture_images=False,
    accelerator_options={"num_threads": 4, "device": "auto"},
)
 
converter = DocumentConverter(
    format_options={
        InputFormat.PDF: PdfFormatOption(pipeline_options=pipeline_opts),
    }
)

주요 옵션과 성능 영향:

옵션의미성능 영향
do_ocrOCR 활성화OCR 이 대체로 가장 비싼 단계
do_table_structure표 구조 복원표 많은 PDF 에서 중요
do_cell_matching표 영역과 텍스트 매칭항상 활성 시 페이지당 추가 비용
images_scale페이지 렌더링 해상도 배율 (기본 1.0)픽셀 제곱으로 비용 증가. 3.0 이면 9배
generate_picture_images그림 PNG 렌더링 & base64 임베딩출력에 픽셀이 필요 없으면 False 권장
accelerator_options.num_threadsCPU 스레드 수워커 수 × num_threads 가 CPU 코어 초과하면 컨텍스트 스위치 손해
accelerator_options.devicecpu/cuda/mps/autoGPU 가용 시 자동 선택

내가 분석한 운영 서비스는 images_scale=3.0 (기본 1.0 대비 9배 픽셀) + generate_picture_images=True (실제 markdown 에서는 안 씀) 조합으로 페이지당 렌더링·인코딩 비용이 컸다. 이런 옵션은 한 번 잘못 박히면 운영 내내 누적 손해라 초기 튜닝이 중요하다.

ThreadedPdfPipelineOptions — 단계 간 파이프라이닝

PDF 처리는 페이지 단위로 layout → OCR → table → assemble 같은 단계가 직렬로 흐른다. 페이지 N개를 순차 처리하면 한 페이지가 모두 끝나야 다음 페이지가 시작.

ThreadedPdfPipelineOptions 는 단계들을 별도 thread 로 분리해 다른 페이지가 다른 단계에 있어도 동시에 처리되게 한다. CPU/GPU 단계가 섞여 있을 때 GPU 가 idle 한 시간이 줄어든다.

python
from docling.datamodel.pipeline_options import ThreadedPdfPipelineOptions
 
opts = ThreadedPdfPipelineOptions(
    ocr_batch_size=8,
    layout_batch_size=4,
    batch_concurrency_settings={...},
)

자바로 비유하면 Spring Batch 의 chunk + 별도 TaskExecutor 조합. ETL 파이프라인에서 단계별 스레드 풀을 다르게 잡는 패턴과 같다.

다만 OCR 단계가 외부 API 호출이라면 이 파이프라이닝의 효과가 거의 사라진다. 내부 처리 단계만 빨라지고 외부 호출 지연이 그대로 노출되기 때문. 외부 OCR 을 쓰면 단계 안에서 영역 단위 병렬 호출 (ThreadPoolExecutor) 이 별도로 필요하다.

OCR 엔진 플러그인 시스템

Docling 은 OCR 엔진을 plugin 인터페이스로 추상화한다. 기본 엔진들 (EasyOcrOptions, TesseractOcrOptions, RapidOcrOptions, OcrMacOptions) 외에 사용자 정의 엔진을 패키지로 등록할 수 있다.

플러그인 구조:

python
# my_ocr_plugin/options.py
from docling.datamodel.pipeline_options import OcrOptions
from pydantic import BaseModel
 
class MyOcrOptions(OcrOptions):
    kind: ClassVar[str] = "my_ocr"
    api_endpoint: str = "https://ocr.example.com/v1"
    api_key: str = ""
    confidence_threshold: float = 0.5
 
# my_ocr_plugin/model.py
from docling.models.base_ocr_model import BaseOcrModel
 
class MyOcrModel(BaseOcrModel):
    def __init__(self, options: MyOcrOptions, ...):
        super().__init__(...)
        self.options = options
 
    def __call__(self, page_image, ocr_rects):
        # 각 박스에 대해 OCR 수행, 결과 cells 반환
        ...
 
# my_ocr_plugin/plugin.py
def ocr_engines():
    return {
        "ocr_engines": [
            {"kind": "my_ocr", "options_cls": MyOcrOptions, "model_cls": MyOcrModel},
        ]
    }
 
# pyproject.toml
[project.entry-points."docling"]
ocr_engines = "my_ocr_plugin.plugin:ocr_engines"

pip install 만 하면 Docling 이 entry-point 로 발견해 사용 가능하다. 자바 SPI (Service Provider Interface) 와 같은 패턴.

내가 분석한 서비스도 자체 클라우드 OCR API 를 Docling 플러그인으로 감싸 사용하고 있었다. 한국어/일본어 분기, 신뢰도 임계값, 영역 병렬 호출 같은 커스터마이징을 이 플러그인 단에서 처리. Docling 본체는 그대로 두고 OCR 만 교체하는 깔끔한 구조.

PDF Backend

PDF 자체를 파싱해 페이지 이미지·텍스트 레이어를 뽑는 단계. Docling 은 backend 도 교체 가능하다.

  • PyPdfiumDocumentBackend — pypdfium2 기반 (Chromium 의 PDFium). 기본값에 가까움.
  • DoclingParseDocumentBackend — IBM 자체 파서, 더 정확하지만 느릴 수 있음.
  • PdfPlumberBackend — pdfplumber 기반.

대부분 케이스에 pypdfium2 가 적당. 텍스트 레이어가 깨진 PDF·복잡한 폼은 다른 backend 를 시도해볼 가치가 있다.

LangChain / LlamaIndex 통합

Docling 은 RAG 파이프라인의 전처리 자리를 노리고 있어서 LangChain·LlamaIndex 와 곧바로 연결된다.

python
# LangChain
from langchain_docling import DoclingLoader
 
loader = DoclingLoader(file_path="doc.pdf")
docs = loader.load()                    # LangChain Document list
 
# LlamaIndex
from llama_index.readers.docling import DoclingReader
 
reader = DoclingReader()
documents = reader.load_data(file_path="doc.pdf")

DoclingDocument → LangChain Document 자동 변환. markdown 출력을 그대로 청크 분할기로 넘기는 흐름.

한계와 함정

운영하면서 몇 가지 함정을 봤다.

모델 다운로드 비용

처음 사용 시 HuggingFace 에서 layout/table/OCR 모델을 자동 다운로드한다. 합쳐서 수백 MB. Docker 빌드 시점에 미리 받아두지 않으면 첫 컨테이너 시작이 매우 느려진다.

bash
# 빌드 시점에 미리 다운로드
docling-tools models download

자바 진영의 Maven 의존성 사전 다운로드 (mvn dependency:go-offline) 같은 패턴.

Warmup 의 필요성

PyTorch / cuDNN 의 JIT 비용 때문에 첫 변환이 매우 느리다 (수십 초). 서비스 부팅 시 sample PDF 를 한 번 변환해 캐시를 채우는 게 거의 필수. Docling 자체가 warmup 헬퍼를 제공하지는 않으므로 직접 짜야 한다.

청크 처리

매우 큰 PDF (수백 페이지) 는 메모리 부담이 크다. 페이지를 N개씩 잘라 별도로 변환하고 합치는 chunking 패턴이 일반적. Docling 의 page_range 옵션을 활용해 페이지 범위로 잘라 처리할 수 있다.

다만 청크 경계에서 표·각주가 잘리면 후처리가 까다롭다. 표 영역이 페이지 경계를 넘는 케이스가 특히 어려움.

멀티 페이지 표

여러 페이지에 걸친 표는 Docling 이 페이지마다 독립 표로 인식한다. RAG 용도로 쓸 때 헤더가 두 번째 페이지에서 사라지는 등의 이슈가 생기므로 후처리에서 결합하는 로직이 필요할 수 있다.

옵션 조합의 explosion

do_ocr, do_table, do_picture_classification, OCR engine, layout model, table model 같은 옵션이 곱셈으로 늘어난다. 각 조합마다 converter 객체를 따로 만들면 메모리 압박. 옵션 조합 캐시 (_converter_cache) 가 필요하지만 캐시 키 누락 같은 버그가 생기기 쉽다. 분석한 코드에서도 이 함정이 잡혔다.

정리

Docling 은 PDF·DOCX·PPTX 같은 다양한 입력을 DoclingDocument 라는 단일 중간 표현으로 정규화한 뒤 markdown / JSON 으로 export 하는 IBM 의 OSS 토킷. multi-stage 파이프라인 + Granite-Docling 단일 VLM 두 패러다임을 동시에 지원한다.

운영에서 만지는 핵심 다이얼은 do_ocr, do_table_structure, images_scale, accelerator_options. OCR 엔진은 entry-point 플러그인으로 교체 가능해서 클라우드 OCR API 도 자연스럽게 끼울 수 있다.

LangChain·LlamaIndex 와 곧바로 연결되어 RAG 파이프라인의 전처리 표준 자리를 노리는 라이브러리다. 한국 기업의 OCR/문서 처리 사용 사례에서도 이미 운영 환경에 들어가 있는 케이스가 늘고 있다.

참고

  • GitHub — docling-project/docling
  • Docling 공식 문서 — Pipeline options
  • Docling Technical Report (arXiv)
  • IBM Research — Docling announcement
  • IBM — Granite-Docling end-to-end document conversion
  • Behind the scenes of Docling PDF Parsing (Medium)
  • Docling — Force full page OCR example
  • Docling — Custom conversion example
on this page
  • 01한 줄 정의와 위치
  • 02두 가지 아키텍처 패러다임
  • 1) 전통적 multi-stage 파이프라인
  • 2) Granite-Docling VLM (2026년 1월 공개)
  • 03DoclingDocument — 단일 중간 표현
  • 04Pipeline 옵션 — 실전에서 만지는 부분
  • 05ThreadedPdfPipelineOptions — 단계 간 파이프라이닝
  • 06OCR 엔진 플러그인 시스템
  • 07PDF Backend
  • 08LangChain / LlamaIndex 통합
  • 09한계와 함정
  • 모델 다운로드 비용
  • Warmup 의 필요성
  • 청크 처리
  • 멀티 페이지 표
  • 옵션 조합의 explosion
  • 10정리
  • 11참고

이런 글도

  • AI 에이전트와 디자인의 새 컨벤션 — DESIGN.md, Google Stitch, Claude Design
    1년 안에 디자인-개발 경계에서 셋이 동시에 등장했다. 2025년 5월 구글 I/O에서 Stitch가 발표됐고, 2026년 3월 그 안에서 DESIGN.md 포맷이 따로 오픈소스로 떨어졌고, 같은 해 4월에 Anthropic Labs가 Claude Design을 띄웠다. 같은 달에 VoltAgent의 awesome-design-md 같은 71개 브랜드 DE...
    🤖 ai
    ai
    2026.05.08
  • RAG 기반 '사내 지식 챗봇' 이렇게 구축했습니다
    - https://yozm.wishket.com/magazine/detail/3302/ - 많은 기업이 "문서는 많지만 원하는 답을 찾기 어렵다"는 문제를 겪는다 - 이를 해결하기 위해 한 팀은 RAG(Retrieval-Augmented Generation) 시스템을 쿠버네티스 기반으로 구축했다. - Kubeflow 파이프라인으로 문서를 자동 임베딩하고,...
    🤖 ai
    ai
    2026.05.07
  • Claude Code를 5주 더 쓴 결과 — 스킬·CLAUDE.md를 키워가는 방식
    1탄을 쓴 게 4월 1일이니 5주 정도 지났다. 그때 글의 마지막 인사이트가 "반복 작업은 스킬로 만들 것" 한 줄이었다. 그 한 줄이 이후 5주 동안 어떻게 굴러갔는지 정리해두려고 한다. 11일 회고는 결과 분석에 가까웠다. 549 메시지·42 세션·108 커밋 같은 수치가 중심이었고, 잘됐던 것·안됐던 것·인사이트가 각각 한 칸씩 차지했다. 이번 글은...
    🤖 ai
    ai
    2026.05.07
  • agents.md
    - agents.md는 AI coding agent(예: Github Coplit)의 동작 지침서 역할을 하는 문서 - 프로젝트에서 AI 에이전트가 어떤 역할을 수행해야 하는지, 어떤 정보가 필요한지, 무엇을 건드리면 안 되는지 명확히 알려주는 표준 형식 문서 다르게 보면, 사람 개발자가 프로젝트 README/CONTRIBUTING을 통해 협업 지침을 제공...
    🤖 ai
    ai
    2026.05.07

댓글 (0)