O problema: digitalizar documentos com fotos e nomes
Imagine uma página de anuário escolar escaneada: 176 nomes impressos, 4 fotografias de retrato e zero estrutura legível por máquina que conecte um ao outro. Para digitalizar essa página de forma confiável, você precisa detectar as fotos com coordenadas precisas, extrair os nomes visíveis e, o mais difícil, descobrir qual nome pertence a qual rosto com base no layout da página.
A AWS publicou um estudo técnico detalhado mostrando como resolver esse problema de forma eficiente usando dois modelos em sequência no Amazon Bedrock: o Amazon Nova 2 Lite e o Claude Sonnet 4.6 da Anthropic.
A arquitetura: pipeline de dois estágios
A solução divide o trabalho em dois estágios bem definidos, cada um usando o modelo mais adequado para sua tarefa específica.

Estágio 1 — Amazon Nova 2 Lite: recebe a imagem da página escaneada e, em uma única chamada à API Converse, realiza três tarefas simultaneamente: detecta as fotos com bounding boxes (caixas delimitadoras) e classificações, extrai os nomes visíveis na página com suas posições aproximadas, e retorna metadados da página como títulos e categorias.
Estágio 2 — Claude Sonnet 4.6: recebe o resultado do Nova (nomes com posições e bounding boxes das fotos) e aplica raciocínio espacial para determinar qual nome corresponde a qual rosto, levando em conta a variabilidade de layouts de página.
Uma decisão de projeto importante: o Nova 2 Lite é configurado para retornar apenas os nomes visíveis, não todo o texto da página. Isso mantém o custo do primeiro estágio baixo — cerca de 1.000 tokens de saída por página, em vez dos aproximados 4.500 tokens que uma passagem completa de OCR (Reconhecimento Óptico de Caracteres) produziria.
Precificação fixa por imagem no Nova 2 Lite
Um ponto técnico relevante destacado no estudo é a mudança na forma como o Amazon Nova 2 Lite cobra entradas de imagem: agora utiliza uma taxa fixa por imagem, independentemente da resolução ou tamanho do arquivo. Isso torna o custo por página previsível em escala.
A quebra de custo por página no primeiro estágio fica assim:
- Tokens de imagem (fixos): 230 tokens a $0,30/M → $0,000069/página
- Tokens de prompt (estimado): 500 tokens a $0,30/M → $0,000150/página
- Tokens de saída (estimado): 1.000 tokens a $2,50/M → $0,0025/página
- Total do estágio 1: ~$0,0027/página
Para consultar as taxas atuais, a AWS disponibiliza a página de preços do Amazon Bedrock.
Raciocínio adaptativo do Claude para correspondência espacial
O Claude Sonnet 4.6 no Amazon Bedrock suporta o que a Anthropic chama de adaptive thinking (raciocínio adaptativo): o modelo decide internamente quanto raciocínio aplicar com base na complexidade da entrada. Para ativá-lo, basta configurar type como adaptive no campo thinking da chamada à API Converse:
response = bedrock_runtime.converse(
modelId='us.anthropic.claude-sonnet-4-6',
messages=[{
'role': 'user',
'content': [
{'image': {'format': 'jpeg', 'source': {'bytes': image_bytes}}},
{'text': spatial_reasoning_prompt}
]
}],
additionalModelRequestFields={
'thinking': {
'type': 'adaptive'
}
}
)
Na prática, uma grade de retratos com oito nomes organizados acima de oito rostos recebe uma resposta direta com raciocínio mínimo. Já uma página com três fotos de grupo compartilhando um bloco de legenda e nomes em uma coluna lateral dispara uma análise espacial passo a passo. No teste com 336 páginas, o Claude usou raciocínio estendido em todas as páginas, com traços de raciocínio variando de 544 a 1.658 caracteres.
Atenção ao custo do raciocínio adaptativo: tokens de raciocínio são cobrados como tokens de saída à taxa padrão ($15,00/M tokens de saída para o Claude Sonnet 4.6 via inferência entre regiões). Os traços de raciocínio aparecem na resposta da API em um bloco separado (thinking), mas não são exibidos aos usuários finais. É recomendável monitorar inputTokens e outputTokens nos metadados da resposta.
Implementação passo a passo
O código-fonte completo, imagens de exemplo e notebook Jupyter estão disponíveis no repositório AWS Samples no GitHub.
Pré-requisitos
- Conta AWS com acesso ao Amazon Bedrock em uma região onde o Nova 2 Lite e o Claude Sonnet 4.6 estejam disponíveis
- Acesso aos modelos
us.amazon.nova-2-lite-v1:0eus.anthropic.claude-sonnet-4-6habilitado no console do Amazon Bedrock - Perfil do Gerenciamento de Identidade e Acesso (IAM) com permissão para
bedrock:InvokeModelebedrock:Conversenos dois modelos - Python 3.10 ou superior com o SDK boto3 instalado
- Bibliotecas
rapidfuzz(para correspondência fuzzy de nomes) ePillow(para visualização) - Imagens escaneadas em formato JPEG ou PNG
Estágio 1: detecção de fotos e extração de nomes com o Nova 2 Lite
A chamada ao Nova 2 Lite usa a API Converse com raciocínio configurado no nível LOW (baixo), que se mostrou tão preciso quanto os níveis MEDIUM e HIGH para essa tarefa de extração estruturada, e é a opção mais barata:
def extract_photos_and_names(image_bytes):
"""Detect photos and extract visible names with Amazon Nova 2 Lite."""
# Using the Converse API consistently for all Bedrock calls
response = bedrock_runtime.converse(
modelId='us.amazon.nova-2-lite-v1:0',
# Note: cross-region inference profile (us.amazon.nova-2-lite-v1:0)
messages=[{
'role': 'user',
'content': [
{
'image': {
'format': 'jpeg',
'source': {'bytes': image_bytes}
}
},
{'text': PHOTO_AND_NAME_EXTRACTION_PROMPT}
]
}],
inferenceConfig={
'maxTokens': 8000,
'temperature': 0
},
additionalModelRequestFields={
'reasoning_config': {
'type': 'enabled',
'level': 'LOW'
}
}
)
raw = response['output']['message']['content'][0]['text']
return json.loads(raw)
O modelo retorna um objeto JSON com fotos e nomes, todos usando a escala de coordenadas 0–1000:
{
"page_title": "Junior Class Officers",
"photos": [
{
"bbox": [245, 180, 410, 520],
"type": "portrait",
"category": "class_officers",
"summary": "Individual portrait photo"
}
],
"names": [
{
"text": "Cecilia Phillips",
"bbox": [260, 540, 395, 570]
},
{
"text": "John Kolander",
"bbox": [420, 540, 555, 570]
}
]
}
Os campos page_title e category também servem para indexação e filtragem — com uma única chamada à API, o Nova 2 Lite entrega detecção de fotos, nomes com posições e metadados estruturados.
Estágio 2: correspondência nome-rosto com o Claude
O Claude recebe o resultado do Nova (nomes e bounding boxes de fotos, ambos no mesmo espaço de coordenadas 0–1000) junto com a imagem original e realiza o raciocínio espacial:
spatial_prompt = f"""Given these names with page coordinates:
{json.dumps(ocr_tokens)}
And these detected photos with bounding boxes:
{json.dumps(photo_detections)}
Match each person's name to their photo based on spatial position.
Return JSON:
{{"associations": [{{"name": str, "face_idx": int, "confidence": float, "reasoning": str}}]}}}"""
response = bedrock_runtime.converse(
modelId='us.anthropic.claude-sonnet-4-6',
messages=[{
'role': 'user',
'content': [
{'image': {'format': 'jpeg', 'source': {'bytes': image_bytes}}},
{'text': spatial_prompt}
]
}],
additionalModelRequestFields={
'thinking': {'type': 'adaptive'}
}
)
Cada associação retornada inclui um campo reasoning que explica a lógica espacial usada — útil para depurar páginas onde a correspondência falha.
Estágio 3: validação e montagem dos resultados
O estágio final aplica limiares de confiança e correspondência fuzzy de nomes (usando rapidfuzz) para filtrar associações de baixa qualidade. O pipeline gera dois arquivos por página: um JSON com os dados de associação e uma imagem de visualização com linhas conectando nomes aos rostos correspondentes.
Resultados do teste com 336 páginas
O pipeline foi executado contra 336 páginas escaneadas de anuários escolares e produziu:
- 3.122 associações nome-rosto no total
- 93,3% das associações com confiança igual ou superior a 0,95
- 6,5% com confiança entre 0,90 e 0,94
- Apenas 0,3% abaixo do limiar de 0,90
Páginas com grade de retratos (282 de 336) tiveram em média 10,9 associações por página e foram tratadas de forma confiável. Páginas somente com texto foram corretamente ignoradas. Páginas com layouts mistos (retratos e fotos de grupo) produziram associações parciais.
Comparação de custos: dois modelos vs. modelo único
A divisão em dois modelos custa aproximadamente dois terços a menos por página do que enviar tudo para o Claude em uma única chamada:
- Pipeline de dois modelos: ~$0,033/página (~$3.300 por 100 mil páginas)
- Claude único (OCR + detecção + raciocínio): ~$0,10/página (~$9.800 por 100 mil páginas)
No teste real com 336 páginas, o custo total ficou em aproximadamente $10,99 ($0,91 para o Nova 2 Lite + $10,08 para o Claude).
Otimizações adicionais de custo
- Inferência em lote do Amazon Bedrock: desconto de 50% para workloads que podem ser processados de forma assíncrona. O custo do estágio Nova 2 Lite cai de ~$0,0027 para ~$0,0014 por página.
- Cache de prompt: para pipelines que usam o mesmo prompt de detecção em milhares de páginas, o cache pode reduzir o custo dos tokens de prompt em até 90%.
- Controle de orçamento de raciocínio: é possível definir um limite de
budgetTokensno campothinkingdo Claude para controlar o custo de raciocínio em páginas mais simples.
Latência por página
Cada página passa por duas chamadas de API sequenciais. No teste realizado, o estágio do Claude (raciocínio espacial com imagem) levou entre 20 e 30 segundos por página. O Nova 2 Lite completou em 2 a 5 segundos. Para processamento em lote, as páginas podem ser paralelizadas, pois cada uma é independente.
Além dos anuários: aplicação do padrão
O padrão descrito pela AWS vai além da digitalização de anuários escolares. Qualquer documento que combine fotos e texto associado — arquivos históricos, diretórios de pessoal, anúncios imobiliários, catálogos de produtos — precisa das mesmas capacidades: detectar elementos visuais, extrair o texto relevante e conectar os dois por meio de raciocínio espacial.
Para saber mais sobre os serviços utilizados, a AWS disponibiliza a documentação do Amazon Nova no Amazon Bedrock e do raciocínio adaptativo com Claude no Amazon Bedrock. O notebook completo com exemplos está disponível no repositório AWS Samples no GitHub.
Fonte
Pair Nova 2 Lite with Claude for cost-optimized document processing (https://aws.amazon.com/blogs/machine-learning/pair-nova-2-lite-with-claude-for-cost-optimized-document-processing/)
Leave a Reply