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.
- 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.
- Langchain: Para integração com o modelo de linguagem e gerenciamento de prompts.
langchainlangchain-corelangchain-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.
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.
.
├── .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
-
Clone o repositório:
git clone https://github.com/luis-otavio-dias/data-extraction-agent.git cd data-extraction-agent -
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 .
-
-
-
Configure as variáveis de ambiente: Crie um arquivo
.envcopiando o.env-examplee adicione sua chave de API:cp .env-example .env
Em seguida, edite o arquivo
.env:AI_MODEL_API_KEY="sua_chave_de_api_aqui"
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.pyO script executará o grafo de forma assíncrona. Ele irá:
- Ler os prompts de
src/prompts.py. - Chamar a ferramenta
extract_exam_pdf_textpara ler os PDFs. - Chamar a ferramenta
pdf_extract_jpegspara salvar as imagens emmedia_images/. - Chamar a ferramenta
structure_questionspara converter o texto em JSON. - Salvar o JSON estruturado no arquivo
src/final_output.json.
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"
},
...
]