Skip to content

Desenvolvimento de um RAG assistente de conhecimento das publicações do IPEA

Notifications You must be signed in to change notification settings

ipeadata-lab/IpeaPub

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

36 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

📚 Sistema de Indexação e Recuperação Semântica

Publicações do Repositório IPEA

O projeto RagPub visa o desenvolvimento de um sistema de agentes assistentes inteligentes para o repositório de conhecimento do Ipea. A proposta central é criar uma solução robusta, baseada em IA, capaz de processar e interpretar todos os documentos do repositório, permitindo aos usuários interagir com o conteúdo por meio de um agente conversacional. Os principais recursos incluem:

  • Recomendação personalizada de leituras;
  • Respostas a perguntas com base no contexto específico dos documentos (RAG);
  • Interação conversacional com fontes de dados (gráficos, imagens e tabelas) presentes nos documentos.

Para atingir esses objetivos, o projeto utilizará uma arquitetura de sistema multi-agentes, bibliotecas Python especializadas e técnicas avançadas de Recuperação Aumentada por Geração (RAG). O detalhamento do funcionamento interno será apresentado nas próximas seções.

Pipeline completo de ingestão, processamento e indexação vetorial híbrida (Dense + Sparse + ColBERT) para publicações institucionais do IPEA.



1. Contexto

O projeto RagPub visa o desenvolvimento de um sistema de agentes assistentes inteligentes para o repositório de conhecimento do Ipea. A proposta central é criar uma solução robusta, baseada em IA, capaz de processar e interpretar todos os documentos do repositório, permitindo aos usuários interagir com o conteúdo por meio de um agente conversacional. Os principais recursos incluem:

  • Recomendação personalizada de leituras;
  • Respostas a perguntas com base no contexto específico dos documentos (RAG);
  • Interação conversacional com fontes de dados (gráficos, imagens e tabelas) presentes nos documentos.

Para atingir esses objetivos, o projeto utilizará uma arquitetura de sistema multi-agentes, bibliotecas Python especializadas e técnicas avançadas de Recuperação Aumentada por Geração (RAG). O detalhamento do funcionamento interno será apresentado nas próximas seções.

2. Tecnologias

O projeto está sendo desenvolvido em Python, com código fonte disponível em IpeaPub no GitHub do Ipea. Os principais frameworks e bibliotecas utilizadas no projeto são:

  • Docling (para parsing de documentos)
  • Qdrant (para banco vetorial)
  • PyTorch/transformers (para rodar modelos de IA localmente)
  • BeautifulSoup (para o crawler do site do Ipea)
  • FastAPI (para receber e responder requisições)
  • Docker (Conteinerização do projeto)

3. Funcionamento

Existem 2 etapas para o funcionamento integral do sistema: ingestão e recuperação. Abaixo, será explicado cada uma delas. Os arquivos Python envolvidos em cada sub etapa do projeto estará explicitado entre parênteses para ajudar o entendimento.

3.1. Ingestão

Essa etapa serve para inserir as informações dos documentos do repositório na base de dados do projeto. As informações são a base para o funcionamento do sistema multiagente, por isso pode ser considerada a etapa mais importante do projeto. São utilizados bancos de dados vetoriais para realizar a busca semântica de informações.

  1. (scraper.py e banco_metadados.py) Todos os metadados de todos os documentos são adicionados em um banco de dados relacional âncora, com um estado de processamento pendente.
  2. (docling_pipeline.py e banco_vetorial.py) A pipeline busca por documentos pendentes no banco relacional e processa as informações dele para inserir nas coleções de pontos vetoriais: chunks, tabelas, imagens e recomendação, utilizando o Docling como ferramenta principal.

O arquivo utils.py possui funções auxiliares, como o crawler do site para buscar os arquivos PDFs a serem processados. Na pipeline do Docling, encontra-se também acesso a modelos de LLM e visão computacional para resumir e legendar tabelas e imagens, para que possam ser buscadas na query semântica do banco vetorial. Os arquivos de processamento se encontram na pasta ingestor, relacionado justamente com a etapa de ingestão.


🏗️ Arquitetura Geral

Scraper → SQLite (Banco 1) → Ingestão → Chunking → Embeddings
→ Qdrant (Banco Vetorial) → API de Consulta

O sistema é dividido em dois bancos:

Camada Tecnologia Finalidade
Banco 1 SQLite Controle operacional da ingestão
Banco 2 Qdrant Armazenamento vetorial híbrido

📂 Estrutura do Projeto

.
├── create_collection.py
├── create_indexes.py
├── create_ingestion.py
├── teste_ingestion.py
├── run.py
├── scraper.py
│
├── ingestao/
│   ├── db/
│   │   └── banco_metadados.py
│   └── utils/
│       ├── clean_itens.py
│       ├── semantic_chunker.py
│       └── simple_chunker.py
│
├── cache/pdfs/
├── logs/
├── img/
└── data/banco1.db

🗃️ Banco de Controle (SQLite)

Arquivo:

Tabela principal:

documentos (
    id TEXT PRIMARY KEY,
    titulo TEXT,
    autores TEXT,
    ano INTEGER,
    tipo_conteudo TEXT,
    resumo TEXT,
    palavras_chave TEXT,
    link_pdf TEXT,
    link_download TEXT,
    status_ingestao TEXT,
    data_ingestao TEXT
)

Status possíveis

  • pendente
  • em processamento
  • sem_pdf
  • processado
  • erro

A ingestão é incremental e resiliente a falhas.


🌐 Scraper do Repositório

Arquivo:

Funções:

  • Consome API do repositório IPEA
  • Extrai metadados estruturados
  • Normaliza campos
  • Persiste no SQLite
  • Remove duplicatas posteriormente

Controle de duplicidade baseado em:

titulo + ano + resumo

🧠 Pipeline de Ingestão

Arquivo:

Fluxo completo:

  1. Busca documento pendente no SQLite
  2. Download real do PDF (com retry + cache SHA256)
  3. Extração via Docling (OCR + imagens)
  4. Limpeza textual avançada
  5. Chunking semântico
  6. Geração de embeddings híbridos
  7. Upload batch para Qdrant
  8. Atualização de status

📥 Download e Cache de PDFs

Arquivo:

Características:

  • Retry automático
  • Verificação de assinatura %PDF
  • Cache por hash SHA256
  • Armazenamento em cache/pdfs/

✂️ Chunking

Semantic Chunker (Principal)

Arquivo:

Características:

  • Embeddings SentenceTransformers
  • Clusterização HDBSCAN
  • Agrupamento por similaridade semântica
  • Controle rígido de tokens (max_tokens=290)

Simple Chunker (Fallback)

Arquivo:

  • Split por sentenças
  • Controle direto de tokens
  • Sem clusterização

🔎 Indexação Vetorial (Qdrant)

Criação da coleção

Arquivo:

Configuração híbrida:

vectors_config = {
    "dense": 768 (cosine),
    "colbert": 128 (multi-vector MAX_SIM)
}

sparse_vectors_config = {
    "sparse": BM25
}

Modelos utilizados

Tipo Modelo
Dense sentence-transformers/paraphrase-multilingual-mpnet-base-v2
Sparse Qdrant/bm25
ColBERT colbert-ir/colbertv2.0

Criação de índices de payload

Arquivo:

Cria índices KEYWORD para:

  • metadata.ticker
  • metadata.form_type
  • metadata.source

Teste de ingestão

Arquivo:

Valida:

  • Conexão com Qdrant
  • Estrutura vetorial híbrida
  • Upsert de ponto sintético

📦 Estrutura do Payload

Cada chunk gera:

{
  "text": "...",
  "metadata": {
    "document_id": "...",
    "titulo": "...",
    "autores": "...",
    "ano": 2023,
    "tipo_conteudo": "...",
    "palavras_chave": "...",
    "pagina": 12,
    "imagens_pagina": [...]
  }
}

🖼️ Extração de Imagens

  • Extraídas por página via Docling
  • Salvas em img/{pdf_hash}/
  • Caminhos armazenados no payload

🔐 Robustez Operacional

  • Controle transacional de status
  • Batch upload resiliente
  • Log individual por documento em logs/
  • Retry HTTP automático
  • Proteção contra overflow de tokens no ColBERT
  • Flush final garantido de buffer

🚀 Execução

1️⃣ Configurar variáveis

.env:

QDRANT_URL=http://localhost:6333

2️⃣ Criar coleção

python create_collection.py

3️⃣ Criar índices

python create_indexes.py

4️⃣ Executar scraping

Arquivo:

python run.py

5️⃣ Executar ingestão

python create_ingestion.py

🔌 API

A camada de API já está implementada separadamente e consome:

  • Coleção publicacoes_ipea
  • Recuperação híbrida
  • Payload estruturado

A API não depende do pipeline de ingestão em tempo real, apenas da coleção indexada.

About

Desenvolvimento de um RAG assistente de conhecimento das publicações do IPEA

Resources

Stars

Watchers

Forks

Packages

No packages published

Contributors 2

  •  
  •  

Languages