Os documentos PDF, enquanto suporte importante para o armazenamento de informações empresariais e pessoais, sempre foram um grande desafio no domínio do processamento de dados. Com a introdução do modelo Gemini 2.0 pelo Google DeepMind, este domínio está a dar início a uma mudança sem precedentes. Neste documento, exploraremos o Gemini 2.0 como alterar completamente o padrão de processamento de PDF e, através de exemplos reais de código, mostraremos como utilizar esta tecnologia para lidar com vários tipos de documentos PDF.
Desafios tradicionais do processamento de PDF
Durante muito tempo, a conversão de documentos PDF em dados estruturados legíveis por máquina foi o domínio da IA e do processamento de dados do "grande problema". As soluções tradicionais podem ser divididas em três categorias:
- modelo end-to-end de fonte abertaO que é que os utilizadores fazem: Ficam muitas vezes sobrecarregados com a complexidade da apresentação e têm dificuldade em reconhecer com exatidão tabelas, gráficos e tipografia especial.
- Programa de combinação de vários modelosPor exemplo, o nv-ingest da NVIDIA requer 8 serviços e várias GPUs para ser implantado no Kubernetes, o que não é apenas complexo de implantar, mas também caro para agendar.
- Taxa comercial por serviçoO sistema de gestão de custos é um sistema de gestão de custos que, apesar de proporcionar alguma comodidade, é inconsistente quando se trata de esquemas complexos e os custos crescem exponencialmente quando aplicados em grande escala.
Estas soluções têm dificuldade em equilibrar a precisão, a escalabilidade e a relação custo-eficácia, especialmente quando confrontadas com cenários em que é necessário processar centenas de milhões de páginas de documentos, e o custo é muitas vezes proibitivo.

Configurando o ambiente e instalando o Gemini 2.0
Para começar a usar o Gemini 2.0 para processar documentos PDF, primeiro é necessário configurar o ambiente e criar um cliente de inferência. Aqui estão as etapas específicas:
Instalar as bibliotecas necessárias
%pip install "google-genai>=1"
Criando Clientes e Configurações de Modelos
from google import genai
# Criar cliente
api_key = "YOUR_API_KEY" # Substituir pela sua chave API.
cliente = genai.Client(api_key=api_key)
# Defina o modelo a ser utilizado
model_id = "gemini-2.0-flash" # Utilize também "gemini-2.0-flash-lite-preview-02-05" ou "gemini-2.0-pro-exp-02-05"
Carregamento e processamento de ficheiros PDF
# Carregar ficheiro PDF
invoice_pdf = client.files.upload(file="invoice.pdf", config={'display_name': 'invoice'})
# Ver em quantos tokens o ficheiro é convertido
file_size = client.models.count_tokens(model=model_id, contents=invoice_pdf)
print(f'Ficheiro: {invoice_pdf.display_name} é igual a {file_size.total_tokens} tokens')
# Exemplo de saída: Ficheiro: fatura é igual a 821 tokens
Com as etapas acima, concluímos a configuração do ambiente básico e carregamos com êxito o primeiro arquivo PDF para processamento. É importante notar que a API de ficheiros do Gemini permite armazenar até 20 GB de ficheiros por projeto, com um máximo de 2 GB por ficheiro, e que os ficheiros carregados são guardados durante 48 horas.
Prática de extração de dados estruturados em PDF
Uma caraterística poderosa do Gemini 2.0 é a capacidade de extrair dados estruturados de ficheiros PDF. A seguir, mostraremos como utilizar o modelo Pydantic do caso real com o Gemini para obter esta funcionalidade.
Definir métodos genéricos de extração de dados
Em primeiro lugar, definimos um método genérico para processar ficheiros PDF e devolver dados estruturados:
def extract_structured_data(file_path: str, model: BaseModel).
# Carregamento de um ficheiro para a API File
file = client.files.upload(file=file_path, config={'display_name': file_path.split('/')[-1].split('.') [0]})
# Geração de uma resposta estruturada utilizando a API Gemini
prompt = f "Extrair os dados estruturados do seguinte ficheiro PDF"
response = client.models.generate_content(model=model_id,
contents=[prompt, file], config={'response_mime_content')
'response_schema': model})
O # transforma a resposta num modelo Pydantic e devolve-a
return response.parsed
Caso 1: Extração de dados de facturas
Para a classe de faturação PDF, podemos definir o seguinte modelo para extrair informações-chave:
from pydantic import BaseModel, Field
class Item(BaseModel).
description: str = Field(description="A descrição do item")
quantidade: float = Field(description="The Qty of the item")
gross_worth: float = Field(description="O valor bruto do artigo")
class Invoice(BaseModel).
"""Extrair o número da fatura, a data e todos os itens da lista com a descrição, a quantidade e o valor bruto e o valor bruto total. """"
invoice_number: str = Field(description="O número da fatura, por exemplo, 1234567890")
date: str = Field(description="A data da fatura, por exemplo, 2024-01-01")
items: list[Item] = Field(description="A lista de itens com descrição, quantidade e valor bruto")
total_gross_worth: float = Field(description="O valor bruto total da fatura")
# Extrair os dados utilizando este modelo
result = extract_structured_data("invoice.pdf", Invoice)
# Resultados de saída
print(f "Fatura extraída: {result.invoice_number} em {result.date} com valor bruto total {result.total_gross_worth}")
for item in result.items: print(f "Item: {item_gross_worth}")
print(f "Item: {item.description} com quantidade {item.quantity} e valor bruto {item.gross_worth}")

Caso 2: Processamento de formulários com conteúdo manuscrito
Para formulários com conteúdo manuscrito, podemos definir modelos especializados de forma semelhante:
classe Form(BaseModel).
"""Extrair o número do formulário, a data de início do exercício, a data de fim do exercício e o passivo do plano no início do ano e no fim do ano. """"
form_number: str = Field(description="O número do formulário")
start_date: str = Field(description="Effective Date")
beginning_of_year: float = Field(description="The plan liabilities beginning of the year")
end_of_year: float = Field(description="The plan liabilities end of the year")
# Extrair dados
result = extract_structured_data("handwriting_form.pdf", Form)
# Resultados de saída
print(f'Número do formulário extraído: {result.form_number} com data de início {result.start_date}. \nPlano de responsabilidades início do ano {result.beginning_of_year} e fim do ano {result.end_of_year}')
# Exemplo de saída: Número de formulário extraído: CA530082 com data de início 02/05/2022.
# Passivos do plano no início do ano 40000.0 e no final do ano 55000.0
Através do exemplo acima, podemos ver que o Gemini 2.0 consegue identificar com precisão o conteúdo do texto no PDF, mesmo incluindo texto manuscrito, e convertê-lo para um formato de dados JSON estruturado, simplificando consideravelmente o processo de extração de dados.
Aplicações avançadas: fragmentação de documentos e compreensão semântica
Nos sistemas RAG (Retrieval Augmented Generation), a fragmentação de documentos é um passo fundamental para além da extração básica de texto, e o Gemini 2.0 permite-nos fazer tanto o OCR como a fragmentação semântica num único passo.
Exemplo de fragmentação semântica em PDF
Aqui está uma dica para converter PDF para Markdown e para a fragmentação semântica ao mesmo tempo:
CHUNKING_PROMPT = """OCR a seguinte página em Markdown. As tabelas devem ser formatadas como HTML.
Não coloque três pontos triplos à volta do seu resultado.
Divida o documento em secções de cerca de 250 a 1000 palavras. O nosso objetivo é
O nosso objetivo é identificar partes da página com o mesmo tema semântico.
Estes pedaços serão incorporados e utilizados num pipeline RAG.
Envolva os pedaços com as etiquetas html .""""
O # usa este prompt para processamento
response = client.models.generate_content(
model=model_id,
contents=[CHUNKING_PROMPT, pdf_file]
)
conteúdo_em_cachos = response.text
Esta abordagem identifica os limites semânticos de um documento e gera partes de texto mais significativas, melhorando consideravelmente a precisão da recuperação subsequente. Em comparação com a fragmentação mecânica tradicional baseada no número de caracteres, a fragmentação semântica é mais capaz de manter a coerência e a integridade do conteúdo.
Extração de dados complexos com Pydantic
Para cenários mais complexos, podemos definir modelos Pydantic aninhados para lidar com vários níveis de dados:
class Person(BaseModel): first_name: str = Field(description="O primeiro nome da pessoa")
first_name: str = Field(description="O primeiro nome da pessoa")
last_name: str = Field(description="O último nome da pessoa")
last_name: str = Field(description="The last name of the person") last_name: str = Field(description="The last name of the person")
work_topics: list[Topic] = Field(description="Os domínios de interesse da pessoa; se não forem fornecidos, devolver uma lista vazia")
# Gerar uma resposta utilizando o modelo Pessoa
prompt = "Philipp Schmid é um engenheiro sénior de relações com programadores de IA na Google DeepMind que trabalha no Gemini, Gemma, com a missão de ajudar todos os programadores a construir e beneficiar da IA de uma forma responsável".
response = client.models.generate_content(
model=model_id,
contents=prompt,
config={'response_mime_type': 'application/json', 'response_schema': Person}
)
O SDK # converte automaticamente a resposta para um modelo Pydantic
philipp: Person = response.parsed
print(f "O primeiro nome é {philipp.first_name}")
Otimização do desempenho e melhores práticas
Eis algumas práticas recomendadas para melhorar a eficiência e a precisão no processamento de documentos PDF em grande escala:
Processamento de lotes e otimização de fichas
Para a necessidade de lidar com um grande número de cenas PDF, é possível efetuar o processamento em lote para melhorar a eficiência:
async def batch_process_pdfs(file_paths, model, batch_size=10):: results = [].
resultados = []
for i in range(0, len(file_paths), batch_size):: batch = file_paths[i:i+batch_size): batch = file_paths[i:i
lote = file_paths[i:i+batch_size]: resultados = [] for i in range(0, len(file_paths), batch_size).
tarefas = [extract_structured_data(path, model) for path in batch]
batch_results = await asyncio.gather(*tasks)
results.extend(batch_results)
print(f "Lote processado {i//batch_size + 1}/{(len(file_paths)+batch_size-1)//batch_size}")
retornar resultados
Seleção de modelos e controlo de custos
A seleção da variante de modelo correta para os requisitos reais pode reduzir significativamente os custos:
- Gemini 2.0 FlashA melhor escolha para cenários de utilização geral, com uma excelente relação preço/desempenho
- Lanterna Gemini 2.0:: Oferece uma melhor relação qualidade/preço para documentos simples
- Gemini 2.0 ProTratamento de documentos ou cenários extremamente complexos que exigem uma elevada precisão
Segue-se uma comparação da eficiência de processamento dos diferentes modelos:
modelação | Páginas PDF processadas por dólar (conversão Markdown) |
---|---|
Gemini 2.0 Flash | Aprox. 6.000 páginas |
Gemini 2.0 Flash Lite | Aprox. 12.000 páginas |
Gemini 1.5 Flash | Aprox. 10.000 páginas |
OpenAI 4-mini | Cerca de 450 páginas |
OpenAI 4o | Cerca de 200 páginas |
Cláusula antrópica-3.5 | Aprox. 100 páginas |
Tratamento de erros e mecanismo de repetição
Num ambiente de produção, é fundamental implementar mecanismos robustos de tratamento de erros:
def extract_with_retry(file_path, model, max_retries=3):: for attempt in range(max_retries)
for attempt in range(max_retries).
try.
return extract_structured_data(file_path, model): for attempt in range(max_retries): try.
except Exception as e: if attempt == max_retries
if attempt == max_retries - 1: print(f "Falha ao aceder ao ficheiro.
print(f "Falha ao processar {caminho_do_ficheiro} após {max_retries} tentativas: {e}")
return None
print(f "A tentativa {tentativa+1} falhou, nova tentativa: {e}")
time.sleep(2 ** tentativa) Estratégia de repetição exponencial #

Otimização do processamento de formulários
Para PDFs que contêm formulários complexos, as seguintes palavras-chave podem ser utilizadas para melhorar a precisão do reconhecimento de formulários:
TABLE_EXTRACTION_PROMPT = """Extrair todas as tabelas do PDF como tabelas HTML.
Preserve a estrutura exacta, incluindo células fundidas, cabeçalhos e formatação.
Cada tabela deve ser semanticamente completa e manter as relações entre as células.
Para valores numéricos, mantenha o seu formato exato, tal como apresentado no documento.""""
observações finais
Com os métodos e exemplos de código apresentados neste artigo, você já pode começar a usar o Gemini 2.0 para criar um poderoso sistema de processamento de documentos PDF. Desde a simples extração de texto até a análise de dados estruturados complexos e, em seguida, a fragmentação semântica, o Gemini 2.0 tem demonstrado excelente desempenho e uma ótima relação custo-benefício.
Embora ainda haja espaço para melhorias em áreas como o reconhecimento de caixas delimitadoras, mas à medida que a tecnologia continua a evoluir, temos razões para acreditar que o futuro do processamento de PDFs se tornará mais inteligente e eficiente. Para qualquer necessidade de processamento em grande escala de dados de documentos para indivíduos ou organizações, o Gemini 2.0 é, sem dúvida, digno de atenção e de adoção de avanços tecnológicos.