Skip to content

guirque/receipt-processing

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

1 Commit
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

đź§ľ Processamento de Notas Fiscais com AWS Textract, NLP e LLM

Uma API REST em Python para processamento de notas fiscais utilizando AWS S3, Textract, NLP e LLM.

🎯 Objetivo

Desenvolver uma API que recebe imagens de notas fiscais, extrai dados estruturados via AWS Textract, aplica técnicas de NLP (Spacy/NLTK) e refina a saída com uma LLM. Os resultados são armazenados em bucket S3, organizados por tipo de pagamento, e monitorados via CloudWatch.

📍 Rotas

POST /api/v1/invoice

  • Processamento:

    • Extração de texto e informações com AWS Textract;
    • Identificação de campos (CNPJ, valor total, forma de pagamento, etc.);
    • Refinamento dos dados com LLM (Nova Micro);
    • Armazenamento de imagem em bucket S3: notas com pagamento em dinheiro/pix → pasta /dinheiro, demais → /outros.
  • Entrada: NĂŁo há conteĂşdo em body. Envie o prĂłprio arquivo na requisição ou o faça por meio de um formulário.

  • SaĂ­da:

    {
       "nome_emissor": "nome do emissor",
       "CNPJ_emissor": "CNPJ do emissor",
       "endereco_emissor": "endereço do emissor",
       "CNPJ_CPF_consumidor": "CNPJ ou CPF do consumidor",
       "data_emissao": "DD/MM/YYYY",
       "numero_nota_fiscal": "nĂşmero de nota fiscal",
       "serie_nota_fiscal": "série de nota fiscal",
       "valor_total": "valor total",
       "forma_pgto": "dinheiropix | outro"
    }

    Obs.: Métricas e logs referentes às execuções podem ser encontrados no CloudWatch ou com Grafana.

    Obs.2: Valores desconhecidos serĂŁo preenchidos com "None".

  • Ferramentas Utilizadas:

    • S3, Textract, CloudWatch, Lambda, API Gateway, Step Functions;
    • NLTK e LLM

GET /

  • Descrição:

    • Página web para uso da API.
  • Entrada: NĂŁo há.

  • SaĂ­da: Arquivo HTML (text/html).

⚙️ Como Executar?

Pré-requisitos

  • Conta AWS com permissões para os recursos gerados/utilizados;
  • Python 3.12 e venv ;
  • Credenciais AWS configuradas (via AWS CLI ou por variáveis de ambiente);
  • AWS CLI e SAM CLI.

Passo-a-Passo

  1. Clone o repositĂłrio:

    git clone git@github.com:guirque/receipt-processing.git
    cd receipt-processing
  2. Configure o ambiente virtual:

    # Crie o ambiente (nomeado 'python')
    python -m venv python
    
    # Entre no ambiente
    source python/bin/activate  # Linux
    python/Scripts/activate # Windows
  3. Instale as dependĂŞncias:

    pip install -r requirements.txt
  4. Configure as credenciais AWS.

  5. Faça o deploy da aplicação:

    sam build
    sam deploy --guided
    • Responda Ă s perguntas de sam deploy --guided para fazer o deploy para a AWS.

🚀 Como Utilizar?

Há duas formas principais de utilizar esta API:

Pela página web (em /)

Basta digitar a URL no navegador para acessá-la.

Com isso, pode-se utilizar o botĂŁo "choose files" para escolha da imagem da nota fiscal a processar. Depois, Ă© sĂł clicar em "Enviar Imagem" e aguardar uma resposta! Os resultados serĂŁo dispostos em uma tabela.

Obs.: há um limite de tamanho de imagem suportado.

Por acesso direto Ă  API (/api/v1/invoice)

Requisições com a imagem podem ser feitas pela ferramenta desejada, com a URL.

Uma forma Ă© por meio de curl:

curl --location --request POST 'https://jazu39no26.execute-api.us-east-1.amazonaws.com/prod/api/v1/invoice' \
--form 'file=@"/caminho/para/nota_fiscal.png"'

Outra Ă© por meio de Postman:

  • Com form-data: captura de tela de requisição por Postman, com 'form-data'

  • Enviando o arquivo diretamente: captura de tela de requisição por Postman, com 'binary'

📝 Como testar (para desenvolvimento)?

Para testes locais, certifique-se de ter as seguintes variáveis de ambiente criadas e condizentes com o que for criado: BUCKET_NAME e STATE_MACHINE_ARN. Esses valores devem ser coerentes com o que for gerado pelo sam deploy.

Testando uma função lambda

Execute-a com:

   sam local invoke "<NomeFuncao>"

Caso haja um payload a que se queira enviar à função em sua invocação, faça:

   sam local invoke "<NomeFuncao>" -e <caminhoArquivoJSON>

Testando a API

Execute localmente com:

   sam local start-api

Isso disponibilizará caminhos (urls) para realização de requisições. Caso faça mudanças em uma lambda e deseje que essas alterações sejam refletidas na API, faça sam build em terminal à parte, antes de realizar uma nova requisição.

Obs.: alguns recursos não são executados localmente (aqueles ativados por boto3), mesmo após execução dos comandos citados.
Dessa forma, certifique-se que as variáveis de ambiente (BUCKET_NAME e STATE_MACHINE_ARN) estão de acordo com o desejado.
É recomendado que funções sejam testadas separadamente, com sam local invoke, passando payloads (JSON) pré-prontos, a fim de evitar execuções desnecessárias e possíveis custos adicionais.

Atualizando conteĂşdo na AWS

Para isso, use o comando:

   sam sync

Ele vai atualizar os recursos na AWS conforme o desenvolvimento local.

🛠️ Infraestrutura AWS

Serviços

  • AWS SAM:
    • Infrastructure as Code. Por meio do SAM, recursos podem ser testados localmente e o desenvolvimento pode ser facilmente sincronizado com a nuvem. O deploy Ă© fácil de se fazer, permitindo que uma stack seja criada na nuvem, a partir dos recursos e configurações apontadas em template.yaml. Stacks podem ser facilmente apagadas e criadas. Com isso, o desenvolvimento em equipe tambĂ©m Ă© facilitado, podendo cada integrante ter a aplicação rodando em conta prĂłpria.
  • API Gateway:
    • responsável pela comunicação do cliente (usuário) com as funções lambda correspondentes a cada rota.
  • Bucket S3:
    • armazena arquivos enviados por usuários em pastas correspondentes Ă  forma de pagamento (dinheiro/, outros/). TambĂ©m utiliza de uma pasta com arquivos temporários (temp/) para guardar momentaneamente imagens ainda nĂŁo classificadas.
  • CloudWatch:
    • utilizado para monitoramento de atividades, como execuções de funções lambda e da state machine.
  • State Machine (Step Functions):
    • realiza a orquestração das funções lambda, para a formulação da rota api/v1/invoice.
  • Grafana:
    • disponibiliza um dashboard para fácil monitoramento de recursos.

Funções Lambda

  • MainPage

    • Fornece a página web (arquivo HTML).
  • InvoiceProxy

    • Recebe a requisição de POST /api/v1/invoice, realizando sua decodificação, armazenando o arquivo enviado em /temp/ no bucket S3 e chamando a PostInvoiceStateMachine (state machine que engloba ExtractInfo, RefineData e ResultHandler). ApĂłs ter sua resposta, retorna-a Ă  API Gateway.
  • ExtractInfo

    • Utiliza do Textract para extração de informações da nota fiscal armazenada em /temp/, no Bucket S3. Organiza os dados extraĂ­dos e os encaminha a RefineData.
  • RefineData

    • Utiliza de NLTK para tokenização do texto, o qual Ă© encaminhado a uma LLM (Nova Micro) para buscar informações no texto extraĂ­do e gerar o JSON desejado. Os resultados da LLM sĂŁo misturados com resultados do Textract para formar o JSON que será encaminhado ao usuário.
  • ResultHandler

    • Com o caminho da imagem em /temp/, encaminha o arquivo Ă  pasta correspondente, de acordo com a forma de pagamento identificada. TambĂ©m retorna o resultado de RefineData, a ser enviado ao usuário.

đź“‚ Estrutura do Projeto

sprints-4-5-6-pb-aws-janeiro/
├── assets/
│   └── ...
├── dataset/
│   └── NFs.zip
├── Docs/
│   └── Diagram.excalidraw
├── events/
│   └── ...
├── functions/
│   ├── ExtractInfo/
│   │   ├── __init__.py
│   │   ├── ExtractInfo.py
│   │   └── requirements.txt
│   ├── InvoiceProxy/
│   │   ├── __init__.py
│   │   ├── InvoiceProxy.py
│   │   ├── StoreInBucket.py
│   │   └── requirements.txt
│   ├── MainPage/
│   │   ├── __init__.py
│   │   ├── MainPage.py
│   │   ├── Index.html
│   │   ├── requirements.txt
│   ├── RefineData/
│   │   ├── __init__.py
│   │   ├── RefineData.py
│   │   └── requirements.txt
│   ├── ResultHandler/
│   │   ├── __init__.py
│   │   ├── ResultHandler.py
│   │   └── requirements.txt
├── layers/
│   └── nltk-dependencies.zip
├── PostInvoiceStateMachine/
│   └── PostInvoiceStateMachine.asl.json
├── .gitignore
├── README.md
├── requirements.txt
├── run-local-api.sh
├── samconfig.toml
└── template.yaml

✍️ Organização da Equipe

As tarefas foram organizadas em cards, por meio da ferramenta Trello.

Diariamente, reuniões foram realizadas com o objetivo de alinhar objetivos, trocar ideias e solucionar problemas.

🚧 Desafios e Soluções

Abaixo, uma tabela com alguns desafios e soluções encontradas.

Contexto Desafio Solução Exemplos de Referências Usadas
Queria-se montar uma estrutura com conexão direta entre APi Gateway e Step Functions CRealizar essa conexão Habilitar conexão com serviço de Step Functions e usar Mapping Templates para passar ARN de State Machine em requisição. Stack Overflow
Foi montada uma estrutura com conexão direta entre APi Gateway e Step Functions Dificuldade de lidar com Mapping Templates para lidar com conteúdo binário. Uso de InvoiceProxy como intermédio entre API Gateway e Step Functions Reunião com instrutor
InvoiceProxy: necessitava-se de processamento de Multipart, para pegar arquivos de formulários e interpretá-los corretamente. Como realizar essa decodificação. Uso do pacote requests-toolbelt PyPi requests-toolbelt, Stack Overflow. Jie Jenn - AWS Tutotiral Z How To Add External Python Libraries to An AWS...
Importação de requests-toolbelt. Para tal, buscou-se criar uma layer. A importação falhava. A versão de python utilizada com pip era diferente do ambiente de execução da lambda. Stack Overflow, Docs - AWS, Reunião com Instrutor
Realização da integração com Step Functions. Como realizar essa integração. Uso de Boto3 e StartSyncExecution. Docs - Boto3, Docs - Boto3 (StartSyncExecution)
Desenvolvimento de lambdas. Dificuldade de testar as funções e falta de um ambiente separado para desenvolvimento. Uso do AWS SAM. Reddit (Testing Lambdas Locally), Docs - AWS (SAM), Reddit (Developing Locally)
Realização de requisições à API. Velocidade de requisição/resposta excessivamente longa. A depender da imagem enviada, havia ocorrência de Timeout. Alteração do modelo de IA utilizado. Experimentos com o catálogo de modelos de Bedrock

👥 Autores

Nome GitHub LinkedIn
Dawson Oliveira @dwsoliv73 Perfil
Eduardo Augusto @EduAugustoM Perfil
Guilherme Rodrigues @guirque Perfil
Moisés Ximenes @moises-creator Perfil

đź”— Algumas Outras ReferĂŞncias

About

Uma API REST em Python para processamento de notas fiscais utilizando AWS S3, Textract, NLP e LLM.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published