Skip to content

luis-otavio-dias/data-extraction-agent

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

39 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Agente de Extração de Dados de PDFs

Este projeto é um agente baseado em LangGraph projetado para extrair e estruturar dados de documentos PDF. O foco principal é extrair eficientemente questões de múltipla escolha de cadernos de prova (como o ENEM e vestibulares) e seus respectivos gabaritos, salvando o resultado em um formato JSON estruturado.
Na raiz do projeto, você encontrará o arquivo expected_output.json, que demonstra o formato esperado do JSON resultante após a extração e estruturação dos dados.

Funcionalidades

  • Extração de Texto de PDFs: Processa tanto o PDF da prova quanto o PDF do gabarito para extrair o conteúdo textual completo.
  • Extração de Imagens: Capaz de extrair e salvar imagens no formato JPEG contidas no PDF da prova.
  • Estruturação de Dados: Utiliza um modelo de linguagem (langchain-google-genai) para analisar o texto extraído e estruturar as questões de múltipla escolha em um formato JSON limpo.
  • Orquestração com LangGraph: Emprega um grafo para gerenciar o fluxo de trabalho, desde a entrada do usuário até a chamada das ferramentas e a resposta final.

Diagrama do Fluxo de Trabalho

Diagrama do Fluxo de Trabalho

Tecnologias Utilizadas

  • Langchain: Para integração com o modelo de linguagem e gerenciamento de prompts.
    • langchain
    • langchain-core
    • langchain-google-genai
  • LangGraph: Para orquestrar o fluxo de execução do agente.
  • pypdf: Para extração eficiente de imagens JPEG de PDFs.
  • fitz (PyMuPDF): Para extração de texto de PDFs e manipulação de imagens.

Por que duas bibliotecas de manipulação de PDF?

O projeto utiliza duas bibliotecas complementares:

  • PyMuPDF (fitz): Escolhida para extração de texto e imagens com maior controle e performance. Permite filtrar imagens por características (tamanho, proporção, cores), extraindo apenas conteúdo potencialmente relevante. Oferece velocidade superior na extração de texto e manipulação geral de imagens.

  • pypdf: Otimizada especificamente para extração em massa de imagens JPEG. Embora o fitz seja mais versátil, pypdf demonstrou melhor performance no cenário específico de extrair todas as imagens JPEG de um documento.

Estrutura do Projeto

.
├── .env-example
├── .gitignore
├── .python-version
├── README.md
├── data/                   # Pasta para armazar pdfs de entrada
│   └── exemplo.pdf
├── pyproject.toml          # Definições do projeto e dependências
├── src/
│   ├── graph.py            # Definição do StateGraph
│   ├── main.py             # Ponto de entrada principal da aplicação
│   ├── prompts.py          # Prompts do sistema e do usuário
│   ├── state.py            # Definição do estado do grafo
│   ├── tools.py            # Ferramentas de extração (texto, imagens, JSON)
│   └── utils.py            # Utilitários (ex: carregar modelo)
└── uv.lock                 # Lockfile do gerenciador de pacotes uv

Instalação

  1. Clone o repositório:

    git clone https://github.com/luis-otavio-dias/data-extraction-agent.git
    cd data-extraction-agent
  2. Dependências:

    • Com UV
      O projeto usa uv para gerenciar dependências. Se você utiliza uv, execute no diretório do projeto:

      uv sync
    • Alternativa sem UV

      • Crie e ative um ambiente virtual:

        python -m venv .venv
        source .venv/bin/activate
        # No Windows: .venv\Scripts\activate
      • Instale as dependências:

        pip install -e .
  3. Configure as variáveis de ambiente: Crie um arquivo .env copiando o .env-example e adicione sua chave de API:

    cp .env-example .env

    Em seguida, edite o arquivo .env:

    AI_MODEL_API_KEY="sua_chave_de_api_aqui"

Como Usar

O agente precisa receber os caminhos dos arquivos PDF para iniciar o processo de extração e estruturação dos dados, também é necessário indicar onde salvar as imagens extraídas.
Essas informações estão definidas nos HUMAN_PROMPTS localizados em src/prompts.py e devem ser ajustadas conforme necessário.

Para executar o agente usando uv, basta rodar o main.py indicando seu arquivo .env:

  uv run --env-file=".env" src/main.py

O script executará o grafo de forma assíncrona. Ele irá:

  1. Ler os prompts de src/prompts.py.
  2. Chamar a ferramenta extract_exam_pdf_text para ler os PDFs.
  3. Chamar a ferramenta pdf_extract_jpegs para salvar as imagens em media_images/.
  4. Chamar a ferramenta structure_questions para converter o texto em JSON.
  5. Salvar o JSON estruturado no arquivo src/final_output.json.

Exemplo de Saída

Abaixo está um trecho do JSON gerado pelo agente, estruturando a questão, alternativas e se existem imagens associadas:

[
  {
    "question": "Qual é a capital da França?",
    "image": false,
    "passage_text": "A França é um país localizado na Europa Ocidental...",
    "sources": [
      "https://pt.wikipedia.org/wiki/Fran%C3%A7a"
    ],
    "statement": "Identifique a capital política e cultural mencionada no texto.",
    "options": {
      "A": "Londres",
      "B": "Berlim",
      "C": "Paris",
      "D": "Madri",
      "E": "Roma"
    },
    "correct_option": "C"
  },
  ...
]

About

No description, website, or topics provided.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages