Docling - RAG용 문서 파싱 치트시트
Docling은 PDF, DOCX, PPTX, XLSX, HTML, 이미지 등을 구조화된 표현으로 변환하는 오픈소스 문서 파싱 도구킷(LF AI & Data 프로젝트)입니다. 레이아웃, 테이블, 제목, 읽기 순서를 보존하는 깔끔한 Markdown 또는 JSON을 생성합니다. 계층 인식 청킹을 포함하며 구조 메타데이터로 청크를 강화하고, LangChain 및 LlamaIndex와 직접 통합되므로 RAG 파이프라인 수집 단계에서 가장 강력한 오픈소스 선택 중 하나입니다.
설치
| 방법 | 명령어 |
|---|
| pip | pip install docling |
| uv | uv add docling |
| OCR extras 포함 | pip install "docling[ocr]" |
| 확인 | docling --version |
CLI 사용법
| 명령어 | 설명 |
|---|
docling document.pdf | 파일을 Markdown으로 변환 (기본값) |
docling --to json document.pdf | 구조화된 JSON 출력 |
docling --to md --output out/ report.docx | 디렉터리로 변환 |
docling https://example.com/page.html | URL에서 변환 |
docling --ocr scanned.pdf | 스캔된 문서에 OCR 강제 |
docling --help | 전체 옵션 목록 |
Python: 기본 변환
from docling.document_converter import DocumentConverter
converter = DocumentConverter()
result = converter.convert("report.pdf")
doc = result.document
print(doc.export_to_markdown()) # 깔끔한 Markdown
print(doc.export_to_dict()) # 구조화된 JSON 호환 dict
| 메서드 | 반환 |
|---|
export_to_markdown() | 제목/테이블 보존된 Markdown |
export_to_dict() | 구조화된 문서 모델 (JSON 호환) |
export_to_doctags() | DocTags 표현 |
result.document | 파싱된 DoclingDocument |
지원되는 입력
| 형식 | 참고 |
|---|
| PDF | 레이아웃, 테이블, 읽기 순서; 스캔용 OCR |
| DOCX / PPTX / XLSX | Office 형식 |
| HTML | 웹 페이지 및 내보내기 |
| Images | PNG/JPG/TIFF via OCR |
| Markdown / AsciiDoc | 문서 모델로 재구조화 |
계층 인식 청킹
Docling의 chunkers는 구조적 맥락(섹션 제목, 테이블 경계)을 각 청크의 메타데이터에 유지하면서 파싱된 문서를 임베딩용으로 분할합니다.
from docling.document_converter import DocumentConverter
from docling.chunking import HybridChunker
doc = DocumentConverter().convert("report.pdf").document
chunker = HybridChunker(tokenizer="sentence-transformers/all-MiniLM-L6-v2")
for chunk in chunker.chunk(doc):
print(chunk.text)
print(chunk.meta) # 제목, 페이지, provenance
| Chunker | 동작 |
|---|
HierarchicalChunker | 문서 구조(섹션, 항목)로 분할 |
HybridChunker | 구조 인식 + 토크나이저 인식 크기 조정/병합 |
chunk.meta | 맥락 확장을 위해 제목/provenance 운반 |
RAG 프레임워크 통합
| 프레임워크 | 방법 |
|---|
| LangChain | DoclingLoader 문서/청크 반환 |
| LlamaIndex | Docling reader/node parser |
| Custom | export_to_markdown() 또는 chunker 출력 직접 사용 |
# LangChain 예제
from langchain_docling import DoclingLoader
docs = DoclingLoader(file_path="report.pdf").load()
성능 & 옵션
| 옵션 | 목적 |
|---|
| OCR engine | OCR 선택/비활성화 (EasyOCR, Tesseract 등) |
| Table mode | 정확 vs 빠른 테이블 구조 복구 |
| Device | CPU 또는 GPU에서 모델 실행 |
| Page range | 변환을 특정 페이지로 제한 |
| Pipeline options | 형식별 변환 파이프라인 튜닝 |
일반적인 워크플로우
# PDF 폴더를 수집용 Markdown으로 변환
for f in docs/*.pdf; do docling --to md --output corpus/ "$f"; done
# Parse → chunk → embed, RAG 수집의 핵심
from docling.document_converter import DocumentConverter
from docling.chunking import HybridChunker
doc = DocumentConverter().convert("manual.pdf").document
chunks = list(HybridChunker().chunk(doc))
# chunk.text를 모델로 임베드하고, chunk.meta를 옆에 저장
Docling vs 다른 파서
| 측면 | Docling | Unstructured | Marker |
|---|
| 출력 | Markdown + 구조화된 모델 | 타입 요소 | Markdown |
| 청킹 | 기본 제공, 계층 인식 | 요소 기반 | 외부 |
| 속도 | 좋음 (CPU) | 좋음 | GPU with 가장 빠름 |
| 최적 | 자체 호스팅 RAG 수집 | 타입 요소 파이프라인 | GPU 대량 Markdown |
리소스