Automatize imagens de faturas com OCI Vision e OCI Generative AI
Introdução
Muitas vezes, as empresas recebem milhares de faturas em formatos não estruturados como imagens digitalizadas ou PDFs provenientes de fornecedores e prestadores de serviços. A extração manual de dados dessas faturas, como número da fatura, nome do cliente, itens comprados e valor total, é um processo demorado e propenso a erros.
Esses atrasos no processamento não afetam apenas os ciclos de contas a pagar e a visibilidade do fluxo de caixa, mas também introduzem gargalos na conformidade, na auditoria e nos relatórios.
Este tutorial demonstra como implementar um pipeline automatizado que monitora um bucket na Oracle Cloud Infrastructure (OCI) para imagens de NFFs recebidas, extrai conteúdo textual usando o OCI Vision e, em seguida, aplica o OCI Generative AI (LLM) para extrair dados fiscais estruturados, como número da NFF, cliente e lista de itens.
Os serviços do OCI usados neste tutorial são:
| Serviço | Objetivo |
|---|---|
| OCI Vision | Executa OCR em imagens de NFF carregadas. |
| IA Generativa do OCI | Extrai dados JSON estruturados de texto OCR bruto usando prompts de poucas capturas. |
| OCI Object Storage | Armazena imagens de NFF de entrada e resultados JSON de saída. |
Objetivos
-
Automatize a ingestão de faturas do OCI Object Storage.
-
Extrair dados estruturados de documentos digitalizados semiestruturados.
-
Integre o OCR (Optical Character Recognition) e o LLM em pipelines em tempo real usando OCI AI Services.
Pré-requisitos
-
Uma conta do OCI com acesso a:
-
OCI Vision
-
IA Generativa do OCI
-
OCI Object Storage
-
-
Uma versão do Python
3.10ou posterior. -
Um bucket para imagens de entrada (por exemplo,
input-bucket) e outro para arquivos de saída (por exemplo,output-bucket). -
Faça download dos seguintes arquivos:
Tarefa 1: Configurar Pacotes Python
-
Execute o arquivo
requirements.txtusando o comando a seguir.pip install -r requirements.txt -
Execute o script Python (
main.py). -
Faça upload de imagens de NFF (por exemplo,
.png,.jpg) para seu bucket de entrada. -
Aguarde o processamento da imagem e o JSON extraído salvo no bucket de saída.
Tarefa 2: Compreender o Código
-
Configuração da Carga:
with open("./config", "r") as f: config_data = json.load(f)Este código carrega todos os valores de configuração necessários, como namespace, nomes de bucket, ID do compartimento e ponto final do LLM.
Informe os parâmetros de configuração no arquivo
config.{ "oci_profile": "DEFAULT", "namespace": "your_namespace", "input_bucket": "input-bucket", "output_bucket": "output-bucket", "compartment_id": "ocid1.compartment.oc1..xxxx", "llm_endpoint": "https://inference.generativeai.us-chicago-1.oci.oraclecloud.com" } -
Inicializar Clientes do OCI:
oci_config = oci.config.from_file("~/.oci/config", PROFILE) object_storage = oci.object_storage.ObjectStorageClient(oci_config) ai_vision_client = oci.ai_vision.AIServiceVisionClient(oci_config)Este código configura os clientes do OCI SDK para acessar os serviços OCI Object Storage e OCI Vision. Consulte OCI Vision para obter mais informações.
-
Inicializar LLM:
llm = ChatOCIGenAI( model_id="meta.llama-3.1-405b-instruct", service_endpoint=LLM_ENDPOINT, compartment_id=COMPARTMENT_ID, auth_profile=PROFILE, model_kwargs={"temperature": 0.7, "top_p": 0.75, "max_tokens": 2000}, )Esse código inicializa o modelo da OCI Generative AI para compreensão de linguagem natural e conversão de texto em estrutura.
-
Prompt de poucas capturas:
few_shot_examples = [ ... ] instruction = """ You are a fiscal data extractor. ... """Esse código usa o aprendizado instantâneo fornecendo um exemplo de saída esperada para que o modelo aprenda a extrair campos estruturados como
number of invoice,customer,locationeitems. -
OCR com OCI Vision:
def perform_ocr(file_name): print(f"📄 Performing OCR on: {file_name}") response = ai_vision_client.analyze_document( analyze_document_details=oci.ai_vision.models.AnalyzeDocumentDetails( features=[ oci.ai_vision.models.DocumentTableDetectionFeature( feature_type="TEXT_DETECTION")], document=oci.ai_vision.models.ObjectStorageDocumentDetails( source="OBJECT_STORAGE", namespace_name=NAMESPACE, bucket_name=INPUT_BUCKET, object_name=file_name), compartment_id=COMPARTMENT_ID, language="POR", document_type="INVOICE") ) print(response.data) return response.dataEsta função:
- Envia a imagem para o OCI Vision.
- Solicita detecção de texto.
- Retorna o texto bruto extraído.
-
Extração de Dados com LLM:
def extract_data_with_llm(ocr_result, file_name): # 🔍 Extrai texto OCR (usando a estrutura da resposta do OCI Vision) extracted_lines = [] for page in getattr(ocr_result, 'pages', []): for line in getattr(page, 'lines', []): extracted_lines.append(line.text.strip()) plain_text = "\n".join(extracted_lines) # 🧠 Monta o prompt com instrução, few-shot e texto OCR limpo prompt = instruction + "\n" + "\n".join(few_shot_examples) + f"\nInvoice text:\n{plain_text}\nExtracted fields (JSON format):" # 🔗 Chamada ao LLM response = llm([HumanMessage(content=prompt)]) # 🧪 Tenta extrair JSON puro da resposta try: content = response.content.strip() first_brace = content.find("{") last_brace = content.rfind("}") json_string = content[first_brace:last_brace + 1] parsed_json = json.loads(json_string) except Exception as e: print(f"⚠️ Erro ao extrair JSON da resposta do LLM: {e}") parsed_json = {"raw_response": response.content} return { "file": file_name, "result": parsed_json, "timestamp": datetime.utcnow().isoformat() }Esta função:
- Combina instruções, exemplo de poucas capturas e texto OCR.
- Prepara os dados do OCR retornados pelo OCI Vision.
- Envia para a OCI Generative AI.
- Recebe campos JSON estruturados (como string).
- O OCI Vision suporta o OCR Português (o
language="POR"pode ser usado em vez de"ENG").
-
Salvar Saída no OCI Object Storage:
def save_output(result, file_name): ...Esse código faz upload do resultado estruturado para o bucket de saída usando o nome de arquivo original com a extensão
.json. -
Loop Principal - Monitor e Processo:
def monitor_bucket(): ...Rotina principal que:
- Monitora o bucket de entrada a cada 30 segundos.
- Detecta novos arquivos
.png,.jpg,.jpeg. - Executa OCR, LLM e upload em sequência.
- Mantém o controle de arquivos já processados na memória.
-
Ponto de entrada:
if __name__ == "__main__": monitor_bucket()Este código inicia o observador de bucket e começa a processar faturas automaticamente.
Tarefa 3: Executar o Código
Execute o código usando o comando a seguir.
python main.py
Tarefa 4: Sugestões de Teste
-
Use NFFs reais ou fictícias com linhas de produtos legíveis e nome do cliente.
-
Faça upload de várias imagens no bloco de entrada em sequência para ver o processamento automatizado.
-
Faça log-in na Console do OCI e navegue até o serviço Object Storage para verificar os resultados em ambos os buckets.
Observação: neste tutorial, a amostra usada é uma NFF brasileira para ilustrar a complexidade dos atributos e da disposição e como o prompt foi criado para resolver esse caso.

Tarefa 5: Exibir Saída Esperada
Para cada imagem de fatura carregada, verifique o arquivo de bucket de saída processado. Um arquivo .json correspondente é gerado com conteúdo estruturado, conforme mostrado na imagem a seguir.

Observação:
- O OCI Vision suporta o OCR Português (o
language="POR"pode ser usado em vez de"ENG").- O prompt do LLM pode ser ajustado para extrair outros campos como
CNPJ,quantidade,data de emissãoe assim por diante.- Considere persistir o
processed_filescom um banco de dados ou arquivo para tornar o processo tolerante a falhas.- Esse processo pode ser usado com o caso de uso: Criar um Agente de IA com Servidor de Protocolo de Comunicação Multiagente para Resolução de NFF como uma imagem de NFF pré-processada. A fatura é uma fatura de devolução do cliente da empresa. Os campos cliente e local são capturados do criador da fatura.
Links Relacionados
Confirmações
- Autor - Cristiano Hoshikawa (Oracle LAD A - Engenheiro de Soluções de Equipe)
Mais Recursos de Aprendizado
Explore outros laboratórios em docs.oracle.com/learn ou acesse mais conteúdo de aprendizado gratuito no canal do Oracle Learning YouTube. Além disso, acesse education.oracle.com/learning-explorer para se tornar um Oracle Learning Explorer.
Para obter a documentação do produto, visite o Oracle Help Center.
Automate Invoice Images with OCI Vision and OCI Generative AI
G39786-01
Copyright ©2025, Oracle and/or its affiliates.