Docling - Análise de Documentos para RAG
Docling é um toolkit de análise de documentos de código aberto (um projeto LF AI & Data) que converte PDF, DOCX, PPTX, XLSX, HTML, imagens e muito mais em uma representação estruturada — Markdown limpo ou JSON que preserva layout, tabelas, cabeçalhos e ordem de leitura. Inclui chunking ciente de hierarquia que enriquece chunks com metadados estruturais, e se integra diretamente com LangChain e LlamaIndex, o que o torna uma das melhores escolhas de código aberto para o estágio de ingestão de um pipeline de RAG.
Instalação
| Método | Comando |
|---|
| pip | pip install docling |
| uv | uv add docling |
| Com extras de OCR | pip install "docling[ocr]" |
| Verificar | docling --version |
Uso da CLI
| Comando | Descrição |
|---|
docling document.pdf | Converta um arquivo para Markdown (padrão) |
docling --to json document.pdf | Saída JSON estruturada |
docling --to md --output out/ report.docx | Converta para um diretório |
docling https://example.com/page.html | Converta de uma URL |
docling --ocr scanned.pdf | Force OCR para documentos digitalizados |
docling --help | Lista completa de opções |
Python: Conversão Básica
from docling.document_converter import DocumentConverter
converter = DocumentConverter()
result = converter.convert("report.pdf")
doc = result.document
print(doc.export_to_markdown()) # Markdown limpo
print(doc.export_to_dict()) # dicionário estruturado em JSON
| Método | Retorna |
|---|
export_to_markdown() | Markdown com cabeçalhos/tabelas preservadas |
export_to_dict() | Modelo de documento estruturado (JSON-compatível) |
export_to_doctags() | Representação DocTags |
result.document | O DoclingDocument parseado |
Entradas Suportadas
| Formato | Notas |
|---|
| PDF | Layout, tabelas, ordem de leitura; OCR para digitalizações |
| DOCX / PPTX / XLSX | Formatos Office |
| HTML | Páginas da web e exportações |
| Imagens | PNG/JPG/TIFF via OCR |
| Markdown / AsciiDoc | Reestruturado no modelo de documento |
Chunking Ciente de Hierarquia
Os chunkers do Docling dividem um documento parseado para embedding enquanto mantêm contexto estrutural (cabeçalhos de seção, limites de tabelas) nos metadados de cada chunk.
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) # cabeçalhos, página, proveniência
| Chunker | Comportamento |
|---|
HierarchicalChunker | Divida em estrutura de documento (seções, itens) |
HybridChunker | Ciente de estrutura + dimensionamento ciente de tokenizer/mesclagem |
chunk.meta | Carrega cabeçalhos/proveniência para expansão de contexto |
| Framework | Como |
|---|
| LangChain | DoclingLoader retorna documentos/chunks |
| LlamaIndex | Leitor Docling/analisador de nó |
| Personalizado | Use export_to_markdown() ou saída de chunker diretamente |
# Exemplo LangChain
from langchain_docling import DoclingLoader
docs = DoclingLoader(file_path="report.pdf").load()
Desempenho e Opções
| Opção | Propósito |
|---|
| Engine de OCR | Escolha/desabilite OCR (EasyOCR, Tesseract, etc.) |
| Modo de tabela | Recuperação de estrutura de tabela precisa vs rápida |
| Device | Execute modelos em CPU ou GPU |
| Intervalo de página | Limite conversão para páginas específicas |
| Opções de pipeline | Ajuste o pipeline de conversão por formato |
Fluxos de Trabalho Comuns
# Converta uma pasta de PDFs para Markdown para ingestão
for f in docs/*.pdf; do docling --to md --output corpus/ "$f"; done
# Parse → chunk → embed, o núcleo de ingestão de RAG
from docling.document_converter import DocumentConverter
from docling.chunking import HybridChunker
doc = DocumentConverter().convert("manual.pdf").document
chunks = list(HybridChunker().chunk(doc))
# embed cada chunk.text com seu modelo, armazene chunk.meta ao lado
Docling vs Outros Analisadores
| Aspecto | Docling | Unstructured | Marker |
|---|
| Saída | Markdown + modelo estruturado | Elementos tipados | Markdown |
| Chunking | Construído, ciente de hierarquia | Baseado em elemento | Externo |
| Velocidade | Bom (CPU) | Bom | Mais rápido com GPU |
| Melhor para | Ingestão de RAG auto-hospedado | Pipelines de elementos tipados | Markdown em massa com GPU |
Recursos