Como extrair e estruturar Dados de PDFs utilizando IA — Parte 2

Rafael Melhem
TaqtileBR
Published in
6 min readJul 4, 2024

Na primeira parte desta série sobre “Como extrair e estruturar Dados de PDFs utilizando IA”, discutimos a importância da extração de informações de documentos PDF e os desafios enfrentados pela startup Zeca. Exploramos algumas ferramentas de OCR disponíveis, discutimos os critérios que mais importam e mostramos nossos primeiros resultados.

Agora, na Parte 2, vamos nos aprofundar em detalhes técnicos sobre esta jornada e explicar como decidimos pela biblioteca Azure Document Intelligence para produção.

Uma lupa procurando por caracteres
Uma lupa procurando por caracteres (Stability.AI)

Metodologia

Para avaliar as duas métricas mais importantes — acurácia e tempo total de extração e formatação dos dados em JSON — usamos amostras reais da produção.

Acurácia
Há várias métricas de acurácia utilizadas em OCR, como Character Recognition Rate, Word Recognition Rate, Character Error Rate, Precision e Recall. No entanto, queríamos algo mais direto e tangível ao problema. Precisamos de um JSON válido com boa ordenação e acurácia.

Para tanto, criamos duas métricas para medir a acurácia após a extração:

  1. proporção de JSONs válidos, que foram extraídos pelos modelos que requerem LLM na saída
  2. porcentagem de similaridade entre o que foi extraído do PDF e o seu respectivo padrão (a resposta que consideramos como ideal)

Em relação ao segundo item, utilizamos a biblioteca fuzzywuzzy no python, para medir o quanto duas strings são similares entre si, usando a distância de Levenshtein.

A distância de Levenshtein é uma medida de quão diferentes duas sequências de texto são entre si. Basicamente, ela conta o número mínimo de mudanças (inserções, deleções ou substituições de caracteres) necessárias para transformar uma sequência na outra. Por exemplo, transformar “gato” em “mato” requer apenas uma substituição (trocar ‘g’ por ‘m’), então a distância de Levenshtein entre essas palavras é 1.

Com essa definição, podemos medir a similaridade entre as palavras “gato” e “mato” — o indicador que estamos usando como “acurácia” em nossos experimentos. A similaridade é dada pela seguinte fórmula:

Fórmula da distância de Levenshtein "normalizada"

, onde max(palavra1, palavra2) será igual ao valor do número de caracteres da maior palavra. No caso do nosso exemplo, como as duas têm valores iguais, ficaria conforme a equação a seguir:

Abaixo, vemos como é simples calcular isso no python usando a biblioteca fuzzywuzzy:

Exemplo de código no python, usando a distância de Levenshtein

No nosso caso, comparamos o que foi extraído pela ferramenta de OCR, no experimento, com um padrão feito previamente. Este padrão foi feito dentro do Google DocumentAI, onde temos a possibilidade de manualmente “ensinar” o algoritmo a extrair as partes que desejamos de um documento, bem como a estruturar essas partes no formato de um JSON (que será utilizado posteriormente para medirmos a acurácia).

Exemplo de como é feito o label/padrão de extração de um arquivo PDF no Google DocumentAI (Fonte: https://cloud.google.com/static/document-ai/docs/images/manage/label-process-1.png)

Observando a imagem acima, vemos como os dados mapeados ao lado direito foram estruturados em colunas, ao lado esquerdo.

Tendo posse desses padrões, teríamos agora condições de fazer as comparações e medir a acurácia.

Tempo total

O tempo total de extração e estruturação foi outro critério fundamental na nossa análise. Avaliamos o tempo total necessário para extrair e formatar os dados de um PDF em um JSON válido. Essa métrica incluía o tempo de processamento de OCR e, nos casos em que era necessário, o tempo adicional de inferência do modelo de LLM.

Resultados e insights

Acurácia

Observando o gráfico abaixo, vemos que o Azure Document Intelligence tem a maior assertividade média, chegando próximo de 100%.

Gráfico 1 — Acurácia média vs Biblioteca

Isso indica que este método teve o melhor desempenho em termos de precisão na extração de dados quando comparado com o padrão. Uma vantagem do OCR da Azure é que ele não necessita de um LLM na saída para estruturar em JSON. Em segundo lugar vem o Google DocumentAI, com aproximadamente 96.37%, seguido por EasyOCR com 88.64% e em último o PaddleOCR com 77.82%.

Todas as configurações testadas retornaram 100% de JSONs válidos.

Tempo total

Os métodos EasyOCR, PaddleOCR e Google DocumentAI precisaram de um LLM para estruturar a saída em JSON. Então, na medição do tempo dessas bibliotecas, foi considerado o tempo total de extração dos OCRs somando o tempo total de estruturação do LLM.

Gráfico 2 — Tempo total médio (s) vs Biblioteca

Nesta análise, vemos que o EasyOCR foi o mais rápido, em seguida vem o PaddleOCR. O Google DocumentAI teve um tempo enorme comparado com todos os outros métodos, levando mais que o dobro que todos eles. Isso mostra que o maior problema do Google DocumentAI realmente é o tempo de extração. O Azure Document Intelligence performou muito bem, pois além de ter maior acurácia, tem também um tempo de execução médio parecido com o EasyOCR e PaddleOCR, com a diferença que não precisa de um LLM para estruturar a saída em JSON.

Os resultados das análises estão compilados na tabela abaixo:

Tabela 1 — Comparação entre bibliotecas em relação a assertividade média e tempo total médio de extração de informações e estruturação em JSON.

Conclusão

O Zeca tinha o desafio de melhorar a acurácia e o tempo de extração e estruturação de PDFs enviados pelos clientes para montar cotações de produtos, sendo o custo também um fator importante.

Com uma acurácia de 99.70% e um tempo médio de extração e estruturação em JSON de 20.52 segundos, o Document Intelligence da Azure foi escolhido para entrar em produção. As duas principais variáveis — acurácia e tempo — melhoraram significativamente em comparação com a solução antiga, mantendo um custo semelhante. Com isso, trocamos o método em produção e continuamos monitorando as métricas de interesse.

No gráfico abaixo, vemos dados reais de produção, mostrando o Google DocumentAI em conjunto com o LLM da OpenAI, representados pelas cores salmão/rosa claro e verde claro, respectivamente (extract_file_content_response + structure_message_response_time).

Com a migração para o Azure Document Intelligence, passamos a contar apenas com o “structure_file_response_time”, agora representado pela cor verde escuro. A mudança é evidente: a partir dos últimos dias de maio de 2024, o tempo total de processamento reduziu significativamente, de mais de 1 minuto (Google DocumentAI + OpenAI) em alguns casos, para aproximadamente 12, 10 ou 13 segundos com o Azure Document Intelligence.

Para garantir a eficiência e eficácia da nova solução, a avaliação das métricas de acurácia e tempo foi crucial. A nova configuração trouxe melhorias notáveis. Conforme ilustrado no diagrama abaixo, a etapa de estruturação com LLM foi eliminada, reduzindo custos e simplificando o fluxo de dados.

Diagrama 1 — Novo fluxo de dados com o Azure Document Intelligence em produção

A adoção do Azure Document Intelligence proporcionou ao Zeca uma solução mais precisa e rápida para a extração e estruturação de dados de PDFs. Com isso, a empresa pode oferecer cotações de produtos de maneira mais eficiente e confiável, mantendo os custos sob controle.

Continue acompanhando nossos posts para mais atualizações e insights sobre as melhorias contínuas em nosso processo de extração e estruturação de dados!

Agradeço ao Zeca pela colaboração e coautoria do estudo.

--

--

Rafael Melhem
TaqtileBR

Data Analyst, AI/Machine Learning enthusiast, materials engineer, professional dj & music producer