Por que não usar um LLM em todo PDF?
Vamos lá, dev! A primeira tentação quando a gente vê um monte de PDF bagunçado é jogar o modelo mais parrudo da OpenAI em cima e pronto. Mas um caso real de um engenheiro de dados sênior mostra que a decisão mais inteligente foi não usar IA na maioria dos casos.
Com 4.700 desenhos de engenharia em formatos mistos (PDFs com texto, PDFs escaneados como imagem), o time desenhou um sistema híbrido de dois estágios. O primeiro, usando Python puro com PyMuPDF, resolveu 70-80% dos documentos a custo zero. Só o que sobrou — PDFs de imagem ou layouts confusos — foi parar no GPT-4 Vision.
Resultado? O tempo de processamento caiu de 4 semanas estimadas para 45 minutos, os custos de API ficaram abaixo de $70, e a precisão chegou a 96%. Isso não é história de modelo mágico — é uma aula de pensamento sistêmico.
Princípio chave: Comece com o método mais barato que funciona. O LLM é um bisturi, não uma marreta.
Fonte: Artigo original no Towards Data Science

A Arquitetura Híbrida em Detalhes
Estágio 1: PyMuPDF (Determinístico, Custo Zero)
A sacada é restringir o espaço de busca. Desenhos de engenharia têm layout previsível — o bloco de título fica quase sempre no quadrante inferior direito. A lógica usa filtragem espacial e pontuação baseada em âncoras:
def extract_native_pymupdf(pdf_path: Path) -> Optional[RevResult]:
"""Tenta extração nativa de texto com PyMuPDF e filtragem espacial."""
try:
best = process_pdf_native(
pdf_path,
brx=DEFAULT_BR_X, # limite X do canto inferior direito
bry=DEFAULT_BR_Y, # limite Y do canto inferior direito
blocklist=DEFAULT_REV_2L_BLOCKLIST,
edge_margin=DEFAULT_EDGE_MARGIN
)
if best and best.value:
value = _normalize_output_value(best.value)
return RevResult(
file=pdf_path.name,
value=value,
engine=f"pymupdf_{best.engine}",
confidence="high" if best.score > 100 else "medium",
notes=best.context_snippet
)
return None
except Exception:
return None
A blocklist filtra falsos positivos comuns: marcadores de seção (SECTION C-C), letras de grade (A, B, C nas bordas) e tabelas de histórico de revisão. Essa heurística simples reduz os erros a quase zero.
Estágio 2: GPT-4 Vision (Para os Casos Difíceis)
Quando o Estágio 1 não retorna nada — seja porque o PDF é baseado em imagem ou o layout é ambíguo — o sistema renderiza a primeira página como PNG e manda para o GPT-4 Vision via Azure OpenAI:
def pdf_to_base64_image(self, pdf_path: Path, page_idx: int = 0,
dpi: int = 150) -> Tuple[str, int, bool]:
"""Converte página PDF para PNG base64 com tratamento inteligente de rotação."""
rotation, should_correct = detect_and_validate_rotation(pdf_path)
with fitz.open(pdf_path) as doc:
page = doc[page_idx]
pix = page.get_pixmap(matrix=fitz.Matrix(dpi/72, dpi/72), alpha=False)
if rotation != 0 and should_correct:
img_bytes = correct_rotation(pix, rotation)
return base64.b64encode(img_bytes).decode(), rotation, True
else:
return base64.b64encode(pix.tobytes("png")).decode(), rotation, False
Decisões de engenharia importantes:
- 150 DPI foi o ponto ideal — resoluções maiores inchavam o payload sem melhorar a precisão.
- Correção de rotação usa uma heurística: se o PyMuPDF extrair mais de dez blocos de texto da página sem correção, a orientação está boa.
- Engenharia de prompt inclui exemplos negativos explícitos para evitar alucinações (por exemplo, evitar valores da tabela de histórico de revisão).
Resultados em Produção
| Métrica | Híbrido (PyMuPDF + GPT-4) | Só GPT-4 |
|---|---|---|
| Precisão (n=400) | 96% | 98% |
| Tempo de processamento (n=4.730) | ~45 minutos | ~100 minutos |
| Custo de API | ~$10-15 | ~$47 (todos os arquivos) |
| Taxa de revisão humana | ~5% | ~1% |
A diferença de 2% na precisão foi uma troca intencional por uma redução de 55 minutos no runtime e custos controlados. Para uma migração de dados onde engenheiros verificariam uma amostra de qualquer forma, 96% foi perfeitamente aceitável.
Lição: A precisão 'certa' equilibra custo, latência e os requisitos do fluxo de trabalho downstream.

Limitações e Armadilhas que Você Precisa Conhecer
Nenhum sistema é perfeito. Aqui estão os dois tipos de problema que só apareceram em escala:
-
Ambiguidade de rotação: Desenhos de engenharia costumam estar em orientação paisagem, mas os metadados PDF variam loucamente. Alguns arquivos definem
/Rotatecorretamente; outros rotacionam o conteúdo fisicamente mas deixam os metadados em zero. A solução heurística (verificar blocos de texto extraídos) funciona, mas não é 100% confiável. -
Alucinação de prompt: O modelo às vezes se agarrava a valores dos próprios exemplos. Se todo exemplo mostrava REV
2-0, o modelo desenvolvia um viés para produzir2-0mesmo quando o desenho mostrava claramenteAou3-0. A correção exigiu exemplos diversos e avisos explícitos anti-memorização.
O que isso significa para seus projetos:
- Sempre valide em escala, não em amostras selecionadas. Os casos extremos (rotação, tabelas de histórico, referências de grade) só apareceram no corpus completo de 4.700 documentos.
- Trate engenharia de prompt como engenharia de software. Versionar seus prompts, teste-os sistematicamente e inclua casos negativos explícitos.
- Modelos mais novos (GPT-5+) não ofereceram ganho significativo para esta tarefa. Quando a tarefa é reconhecimento de padrões espacialmente restrito, o teto é o prompt e o pré-processamento, não a capacidade de raciocínio do modelo.
![]()
Do Script ao Sistema de Produção
O que começou como uma ferramenta de linha de comando evoluiu para uma aplicação web interna leve com interface de upload de arquivos, adotada por equipes de engenharia em vários locais. A lógica central de extração — 600 linhas de Python — permaneceu idêntica.
Três aprendizados para seu próximo projeto de IA:
-
Comece com o método mais barato que funciona. A extração determinística resolveu 70-80% do corpus a custo zero. O LLM só agregou valor porque foi focado nos casos onde as regras falharam.
-
Meça o que importa para o stakeholder. Os engenheiros não ligavam se o pipeline usava PyMuPDF, GPT-4 ou pombos-correio. Eles ligavam que 4.700 desenhos foram processados em 45 minutos em vez de quatro semanas, com $50-70 em chamadas de API em vez de £8.000+ em tempo de engenharia.
-
Saiba onde o modelo se encaixa no sistema. Às vezes, o trabalho de IA de maior impacto não é usar o modelo mais poderoso. É projetar o sistema que mantém o modelo no seu lugar.
Próximos Passos para seu Aprendizado
Se você está construindo sistemas similares, explore:
- Azure AI Document Intelligence para extração de formulários pronta para uso
- LayoutLMv3 para compreensão de documentos consciente do layout
- Versionamento de prompts com LangChain para gerenciamento sistemático de prompts
Para mais sobre sistemas de IA em produção, confira nossa análise sobre React Conf 2025 Key Takeaways on the Compiler, React 19.2, and the Future of Native e Beyond Prototypes How Vercels New v0 Brings AI Coding to Production.