Regex vs LLM para Extração de Campos em Notas Fiscais
Resultados do Benchmark Primeira Parte (2026)
Última revisão: 2026-08-14 · Nível de execução: oficial · Benchmark primeira parte · 8 modelos × 2 conjuntos de dados de notas fiscais
O que esta página NÃO aborda: Métricas completas de qualidade do texto OCR (CER/WER) como destaque — elas aparecem aqui apenas como contexto causal para por que a extração LLM de um motor fica para trás. Também não são abordados: motores OCR em nuvem/API, modelos de IA de documentos ajustados, latência ou custo do motor OCR (veja Acurácia OCR de Notas Fiscais e Acurácia OCR por Tipo de Documento), ou alegações de desempenho de fornecedores.
Todos os números abaixo vêm do results/field_method_comparison.csv do benchmark (métricas de campo regex vs LLM) e results/summary_metrics.csv (contexto CER/WER), espelhados no repositório público do GitHub e citados linha por linha. Os valores F1 são armazenados como decimais de 0–1 no CSV e mostrados como porcentagens aqui. As duas definições de F1 por campo — a abordagem baseada em regex e a abordagem baseada em LLM — são rotuladas em cada figura e nunca misturadas.
Quando a tarefa é extrair campos estruturados do texto OCR, a escolha do pós-processador importa mais do que a escolha do motor OCR. Substituir regras regex por um LLM (deepseek-v4-flash) eleva o F1 de campos de 0,08–0,34 para 0,37–0,62 em notas fiscais em inglês — e de 0,00–0,34 para 0,16–0,55 em notas fiscais em indonésio — em todos os 8 motores, cada motor, em cada linha do benchmark.
A inversão para lembrar: docTR teve o pior F1 de campos com regex de todos os 8 motores (0,077 no SROIE) e o melhor F1 de campos com LLM (0,617). Seu texto OCR estava bom — os padrões regex simplesmente não conseguiram sobreviver à variância de formato (datas, moedas, endereços multilinha) de notas fiscais reais. O mesmo texto que o regex transformou em 7,7% dos campos rendeu 61,7% sob um LLM. O OCR upstream só precisa ser "bom o suficiente"; o pós-processador decide quanto daquele texto se torna campos utilizáveis.
Resultados SROIE: Recibos em Inglês (361 Amostras)
Em recibos em inglês, o LLM supera o regex em todos os 8 motores — o menor ganho é de 1,76× (PaddleOCR-VL 0,337 → 0,592), o maior de 8,1×. E o LLM quase elimina a lacuna entre os modelos: 6 dos 7 motores não-Tesseract ficam dentro de uma faixa de 0,05 pontos (0,569–0,617), onde seus resultados de regex estavam espalhados por 0,26 pontos (0,077–0,338).
SROIE (Scanned Receipt OCR and Information Extraction, ICDAR 2019) é o benchmark padrão para recibos em inglês: 361 recibos de teste com quatro campos-alvo — empresa, data, endereço e total (Huang et al., 2019). Cada motor primeiro gerou texto OCR em uma configuração compartilhada de RTX 4090; esse texto foi então alimentado a dois pós-processadores paralelos: um conjunto fixo de padrões regex (a abordagem tradicional de OCR + KIE baseada em regras) e o LLM deepseek-v4-flash com um prompt de extração estruturada. Ambos foram avaliados contra os mesmos campos de verdade fundamental. O gráfico mostra o F1 por campo do regex (azul) vs. o F1 por campo do LLM (verde) para cada motor.
Fonte: field_method_comparison.csv — linhas para dataset=sroie_2019, colunas regex_field_value_f1 / llm_field_value_f1 (armazenadas como decimais 0–1, exibidas como %). Pós-processador LLM: deepseek-v4-flash (coluna llm_model). 361 amostras por motor (llm_ok_count).
| Motor OCR | Tipo | F1 regex | F1 LLM | Acurácia regex | Acurácia LLM |
|---|---|---|---|---|---|
| Tesseract | Tradicional (CPU) | 23,3% | 43,9% | 21,4% | 43,4% |
| PaddleOCR | Tradicional | 32,5% | 58,1% | 29,5% | 58,1% |
| EasyOCR | Tradicional | 14,8% | 37,2% | 12,7% | 37,1% |
| docTR | Tradicional | 7,7% | 61,7% | 6,2% | 61,7% |
| Docling | Parser de pipeline | 22,4% | 56,9% | 20,4% | 56,6% |
| Surya2 | VLM de documento | 31,8% | 61,4% | 30,0% | 61,4% |
| Unlimited-OCR | VLM de documento | 33,8% | 60,5% | 30,9% | 60,5% |
| PaddleOCR-VL | VLM de documento | 33,7% | 59,2% | 31,0% | 58,5% |
Fonte: field_method_comparison.csv — linhas sroie_2019: regex_field_value_f1 / llm_field_value_f1 / regex_field_value_accuracy / llm_field_value_accuracy (decimais 0–1 exibidos como %). F1 docTR 0,0766 → 0,6171; Surya2 0,3183 → 0,6139; PaddleOCR 0,3254 → 0,5810.
Resultados CORD: Receitas Indonésias (100 Amostras, Teste de Estresse)
O CORD amplia a lacuna, não porque o LLM melhora — ele não melhora — mas porque o regex colapsa: seis dos oito motores pontuam o F1 de campos regex em ou abaixo de 10,8%, e dois (docTR 0,0%, EasyOCR 0,7%) recuperam quase nada. O LLM ainda eleva todos os motores não-Tesseract para 33,8% ou mais, provando que sua extração se generaliza em idiomas e layouts onde padrões manuais não conseguem.
O CORD v2 é um conjunto de dados de receitas em idioma indonésio com campos aninhados (menu, sub_total, total) (Park et al., 2019), executado como um teste de estresse entre idiomas: nenhum dos 8 motores foi treinado principalmente em receitas indonésias. Duas ressalvas se aplicam à leitura desta tabela. Primeiro, o texto de referência do CORD inclui diferenças na estrutura de anotação e na normalização de saída do VLM, que inflam sistematicamente o CER bruto para cada motor — portanto, as métricas de campo abaixo, não o CER, são a comparação justa entre modelos. Segundo, os padrões regex foram escritos para o esquema SROIE em inglês e plano; o esquema aninhado do CORD e a formatação indonésia (moeda Rp, convenções de data) os derrotam — o que é em si a descoberta: regras ajustadas para um mercado não funcionam em outro.
Fonte: field_method_comparison.csv — linhas para dataset=cord_v2, colunas regex_field_value_f1 / llm_field_value_f1 (decimais 0–1 mostrados como %). 100 amostras por motor (llm_ok_count).
| Motor OCR | Tipo | F1 regex | F1 LLM | Acurácia regex | Acurácia LLM |
|---|---|---|---|---|---|
| Tesseract | Tradicional (CPU) | 7,5% | 16,3% | 5,6% | 14,3% |
| PaddleOCR | Tradicional | 1,5% | 55,3% | 1,1% | 50,7% |
| EasyOCR | Tradicional | 0,7% | 33,8% | 0,4% | 30,5% |
| docTR | Tradicional | 0,0% | 55,0% | 0,0% | 51,8% |
| Docling | Parser de pipeline | 6,1% | 46,9% | 4,6% | 44,3% |
| Surya2 | VLM de documento | 24,6% | 52,0% | 18,9% | 49,0% |
| Unlimited-OCR | VLM de documento | 10,8% | 46,8% | 8,4% | 45,0% |
| PaddleOCR-VL | VLM de documento | 34,1% | 52,0% | 28,7% | 49,3% |
Fonte: field_method_comparison.csv — linhas cord_v2 (F1 e acurácia de campos regex/llm, decimais 0–1 mostrados como %). PaddleOCR LLM F1 0,0154 → 0,5527; docTR 0,0 → 0,5500; tesseract 0,0752 → 0,1627.
Por que o LLM Reduz a Lacuna — e Onde Está seu Teto
Três padrões nos números explicam o que está acontecendo sob a superfície. Cada um é uma afirmação testável com suas células CSV exatas abaixo.
(a) O LLM transforma uma lacuna de modelo de 0,26 pontos em uma faixa de 0,05 pontos
Com regex, qual motor você escolhia importava enormemente: o F1 do campo SROIE variava de 0,077 (docTR) a 0,338 (Unlimited-OCR) — uma variação de 0,26 pontos. Com o LLM, seis dos sete motores não-Tesseract ficam entre 0,569 (Docling) e 0,617 (docTR) — uma faixa de 0,05 pontos (field_method_comparison.csv, linhas sroie_2019, regex_field_value_f1 vs llm_field_value_f1). O OCR upstream só precisa produzir texto legível; o LLM extrai campos dele com qualidade aproximadamente independente do motor. Dois motores ficam abaixo dessa faixa: EasyOCR com 0,372 (o menor F1 de LLM em recibos em inglês) e Tesseract com 0,439. No CORD, o Tesseract se torna o atrasado claro — seu 0,163 é o pior resultado de LLM em toda a tabela.
(b) O teto do Tesseract é definido por seu OCR, não por seu pós-processador
"Lixo entra, lixo sai" se aplica até ao pós-processamento por LLM. O texto bruto do OCR do Tesseract em recibos indonésios tem uma taxa de erro de caracteres de 0,9523 (summary_metrics.csv, tesseract/cord_v2, cer) — aproximadamente 95 caracteres em 100 estão errados ou fora de ordem. Seu F1 de campo LLM no CORD é consequentemente 0,1627 (field_method_comparison.csv, tesseract/cord_v2, llm_field_value_f1): um LLM não pode extrair um nome de empresa ou total de texto que não consegue ler. O teto de qualquer pós-processador é definido pela qualidade base do OCR abaixo dele — uma restrição que nenhuma engenharia de prompt remove.
(c) docTR é o maior beneficiário: de piso regex a topo LLM
A história do docTR é a demonstração mais clara de que o problema era o pós-processador, não o OCR. Seu F1 de campo regex no SROIE foi o mais baixo dos 8 motores em 0,0766 — seu texto limpo e preciso (CER do SROIE 0,1971, o melhor do benchmark, linha do summary_metrics.csv para doctr/sroie_2019) simplesmente não correspondia aos padrões regex para totais com separadores de milhar ou endereços multilinha. Com o LLM, o mesmo texto rende o maior resultado do SROIE do benchmark, 0,6171 — um Quando Regex É Suficiente vs Quando Usar um LLM O tradeoff honesto não é "regex está quebrado" mas "regex é frágil onde os recibos são variáveis." O pós-processamento com regex é determinístico, gratuito e instantâneo; um pós-processador LLM adiciona tokens e 1,8–2,4 s de latência mediana por documento (field_method_comparison.csv, llm_median_latency_ms em todas as 16 linhas). Em troca, o LLM recuperou 1,76–8,1× mais campos no SROIE — e no CORD, onde o regex colapsou para quase zero na maioria dos motores, o LLM recuperou 33,8–55,3% dos campos que a extração baseada em regras simplesmente não conseguia alcançar. Quando regex é suficiente: se seus documentos vêm de um conjunto pequeno e estável de layouts e os campos que você precisa aparecem em formatos quase constantes — um padrão fixo de número de fatura, uma única convenção de data, uma moeda — regex é a ferramenta certa: custa nada, roda em microssegundos e suas falhas são previsíveis. Os casos de base do benchmark mostram isso: motores com regex alinhado a recibos ainda atingiram 0,34 de F1 de campos no SROIE (Unlimited-OCR 0,3376, PaddleOCR-VL 0,3368). Quando usar um LLM: assim que a variância de formato entra — múltiplas moedas, formatos de data regionais, endereços multilinha, nomes de fornecedores em estilos variados ou um segundo idioma. Cada um desses quebra um padrão; o LLM absorve todos em um único prompt. Os resultados do CORD no benchmark quantificam o custo de "mais um idioma" para um pipeline baseado em regras: o F1 de campos do regex caiu de 0,08–0,34 (inglês SROIE) para 0,00–0,34 (indonésio CORD), enquanto o LLM manteve 0,16–0,55 — uma penalidade que a abordagem regex pagou 100% e o LLM pagou apenas parcialmente. A arquitetura correta para a maioria dos fluxos de produção é híbrida: extração por LLM para campos variáveis, validação por regex ou baseada em regras para campos com formatos esperados estritos, com o custo por documento do LLM de 1,8–2,4 s amortizado em processamento assíncrono em lote em vez de esperas síncronas do usuário. Sim, neste benchmark, em cada linha: o pós-processamento por LLM (deepseek-v4-flash) superou o pós-processamento por regex para todos os 8 motores de OCR em ambos os conjuntos de dados (field_method_comparison.csv, todas as 16 linhas). Em recibos em inglês do SROIE, o F1 dos campos por LLM foi de 0,37–0,62 contra 0,08–0,34 por regex; em recibos em indonésio do CORD, 0,16–0,55 contra 0,00–0,34. docTR no SROIE, com F1 de campos de 0,6171 — mas as diferenças entre os motores praticamente desaparecem quando um LLM está no loop: seis dos sete motores não-Tesseract ficam entre 0,569 e 0,617 (field_method_comparison.csv, linhas sroie_2019, llm_field_value_f1). No CORD, o PaddleOCR lidera com 0,5527, seguido de perto pelo docTR com 0,5500. Porque seu texto de OCR é muito degradado para qualquer pós-processador recuperar os campos. Em recibos indonésios, sua taxa de erro de caracteres é de 0,9523 (summary_metrics.csv, tesseract/cord_v2), o que limita seu F1 de campos por LLM a 0,1627 — o pior resultado por LLM no benchmark (field_method_comparison.csv, tesseract/cord_v2, llm_field_value_f1). Entre 1,76× e 8,1× em recibos em inglês, dependendo do motor, com o maior ganho no docTR (0,077 → 0,617 F1 de campos, field_method_comparison.csv linhas sroie_2019). Em recibos indonésios, o ganho é muito maior — 36× para o PaddleOCR e praticamente ilimitado para o docTR (0,0 → 0,55), pois o regex quase não recuperou nada. Não — e os leitores não devem esperar isso. O melhor F1 de campo do LLM no benchmark é 0.617 (docTR, SROIE), o que significa que cerca de 38% dos campos ainda foram perdidos ou estavam errados, e a melhor taxa de correspondência exata de documento inteiro é 15,5% (Surya2, SROIE, llm_document_fields_exact) — ou seja, no máximo ~1 em cada 6 documentos teve todos os quatro campos exatamente corretos. A extração por LLM é uma grande melhoria em relação a regex, não uma bala de prata; a pontuação de confiança por campo e a revisão humana continuam necessárias para produção. Neste benchmark, a chamada ao LLM adicionou 1,8–2,4 s de latência mediana por documento (field_method_comparison.csv, llm_median_latency_ms, todas as 16 linhas), e a execução completa de 16 grupos consumiu aproximadamente 1,33M de tokens de prompt + 0,28M de tokens de conclusão (soma de llm_prompt_tokens / llm_completion_tokens). Esta não é uma latência de extração de campo em tempo real — é adequada para processamento assíncrono em lote, não para consultas interativas. Melhor que regex, mas com um teto menor. Em recibos indonesianos do CORD, o LLM manteve o F1 de campo entre 0,16–0,55, enquanto o regex caiu para 0,00–0,34 (field_method_comparison.csv, linhas cord_v2) — mas o melhor resultado do CORD (0,5527) ainda fica atrás do melhor resultado em inglês (0,6171), refletindo tanto a escrita mais difícil quanto a degradação da base de OCR. Regras escritas para recibos em inglês basicamente pararam de funcionar; o LLM degradou-se de forma mais graciosa. Esta página relata a comparação de extração de campos do benchmark OCR de código aberto do ImageToTable.ai — uma execução experimental independente e reproduzível (nível oficial), não uma pesquisa de alegações de terceiros. O pipeline para cada par (modelo × conjunto de dados): o motor OCR produz texto a partir de imagens de recibos; esse texto é então extraído duas vezes — uma vez por um conjunto fixo de padrões regex e outra vez pelo pós-processador LLM — e ambas as saídas são pontuadas em relação aos mesmos campos de verdade fundamental. O pós-processador LLM é deepseek-v4-flash (a coluna llm_model no CSV de comparação), executado com temperatura 0 para saída determinística. Todas as 361 amostras SROIE e 100 CORD foram concluídas com sucesso (llm_ok_count = 361 / 100). O texto OCR upstream consumido por ambos os pós-processadores veio dessas versões de motores: As impressões digitais de reprodutibilidade completas por execução estão nos manifests de execução redatados do benchmark em Referências relacionadas: Precisão por Campo vs. Precisão por Caractere · Precisão do OCR de Recibos · Precisão do OCR por Tipo de Documento Leitura relacionada: Como Ler Afirmações de Precisão de OCRPerguntas Frequentes
A extração de campos por LLM é mais precisa que a extração por regex?
Qual modelo de OCR extrai os campos de recibos melhor com pós-processamento por LLM?
Por que o Tesseract fica para trás mesmo com um LLM?
Quanto um LLM melhora a extração de campos em relação ao regex?
O pós-processamento por LLM acerta todos os campos?
Quão lento ou custoso é o pós-processamento por LLM?
O pós-processamento por LLM funciona em recibos não ingleses?
Metodologia & Fontes
Protocolo
Ambiente de Execução
Motor OCR Versão Backend Tesseract 5.3.4 CPU (sem GPU) PaddleOCR 3.7.0 PaddlePaddle-GPU 3.3.1 EasyOCR 1.7.2 PyTorch docTR 1.0.1 PyTorch Docling 2.119.0 PyTorch Surya2 0.22.1 vLLM Unlimited-OCR baidu/Unlimited-OCR vLLM PaddleOCR-VL 1.6 vLLM results/manifests/ no repositório público (um manifest.json por execução publicada, 16 no total). Cada um divulga: id da execução, modelo + versão, hash do script executor (SHA-256), modelo/driver/VRAM da GPU, versões torch/CUDA/torchvision/torchaudio, versão do Python, hash do pip-freeze, metadados de custo (GPU $/hora e carimbo de data/hora do preço), modo de medição e hashes dos artefatos (lista de amostras, previsões, métricas, desempenho).Definições das Métricas
Acesso aos Artefatos
manifest.json editado por execução publicada (16 execuções), com a impressão digital do ambiente por execução e os hashes dos artefatos listados acima.Limitações