Plataforma de auditoria pública que combina busca semântica, filtros estruturados e módulos analíticos (sobrepreço, fracionamento, variabilidade semântica) para apoiar a investigação de despesas públicas. Projeto em parceria entre TCE-RJ e CEFET/RJ.
- Features
- Architecture
- Installation
- Configuration
- Usage
- API Reference
- Audit Workflows
- Modules
- Examples
- Project Structure
- Security & Permissions
- Deployment
- Troubleshooting
- Contributing
- License
- Busca semântica de empenhos com embeddings e PostgreSQL + pgvector
- Filtros estruturados por município, jurisdicionado, elemento de despesa e credor
- Módulos analíticos: sobrepreço, fracionamento e variabilidade semântica
- Consistência Semântica para identificar desvios no histórico e descrições
- Rerank opcional com LLM para priorização dos resultados
- Autenticação e autorização por papéis e permissões
- API REST com FastAPI
- CORS configurável por ambiente
- Logs com rotação de arquivo
- Dockerfiles para frontend e backend
- Reverse proxy com Caddy servindo
/nemesis
┌─────────────┐
│ Browser │
└──────┬──────┘
│ HTTP
│
┌──────▼─────────────────────────────────────┐
│ Caddy (proxy) │
│ /nemesis → frontend (estático) │
│ /nemesis/api → backend (FastAPI) │
└───────────────┬────────────────────────────┘
│
┌───────────────▼────────────────────────────┐
│ FastAPI Backend │
│ • consulta_vs • sobrepreco • fracionamentos│
│ • variabilidade_semantica • auth/admin │
└───────────────┬────────────────────────────┘
│
┌───────────────▼────────────────────────────┐
│ PostgreSQL + pgvector │
│ • embeddings • empenhos • análises │
└────────────────────────────────────────────┘
Consulta do Auditor
│
▼
Filtros estruturados + histórico
│
▼
Busca semântica (pgvector)
│
▼
Rerank (opcional, LLM)
│
▼
Resultados ordenados
- Python 3.11+
- Node.js 20+
- PostgreSQL 15+ com extensão pgvector
- Docker (opcional, recomendado para stack completa)
git clone <url-do-repo>
cd nemesisconda create -n nemesis python=3.11.13
conda activate nemesis
pip install -r backend/requirements.txt
cd backend
python -m uvicorn main:app --reloadcd frontend/react
npm install
npm startAcesse: http://localhost:3000 (modo dev)
Deploy padrão: http://localhost:8080/nemesis
Crie um .env (ex.: deploy/.env) com:
# Banco
POSTGRES_HOST=host.docker.internal
POSTGRES_PORT=5432
POSTGRES_USER=nemesis
POSTGRES_PASSWORD=nemesis
POSTGRES_DB=empenhos
# API base (frontend via Caddy)
REACT_APP_API_BASE_URL=http://localhost:8080/nemesis
# LLM (opcional)
CONSULTA_LLM_RERANK=1
CONSULTA_RERANK_ALPHA=0.9
OPENAI_API_KEY=sk-***
OPENAI_FILTER_MODEL=gpt-4o-mini
# Auth
JWT_SECRET=change-me
# CORS
CORS_ORIGINS=http://localhost:8080,http://localhost:3000Arquivo backend/config.yaml:
embedding_model: sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2
parquet_path: data/tce.parquetdocker compose -f deploy/docker-compose.yml up -d --build- Frontend:
http://localhost:8080/nemesis - API:
http://localhost:8080/nemesis/api - Backend direto (dev):
http://localhost:8000
http://localhost:8000/docshttp://localhost:8000/redoc
POST /auth/login— loginGET /auth/me— usuário atual
POST /api/consulta_vs— consulta semântica de empenhosPOST /api/auto-filling— preenchimento automático de filtrosPOST /api/fracionamentos— análise de fracionamentoGET /api/sobrepreco— análise de sobrepreçoGET /api/variabilidade-semantica— análise de variabilidadeGET /api/variabilidade-semantica/empenhos— detalhes por empenhoGET /api/empenhos/{idempenho}— detalhe do empenho
GET /admin/users/POST /admin/users/PUT /admin/users/{user_id}GET /admin/rolesGET /admin/permissions
- Combine filtros estruturados + histórico
- Rerank opcional com LLM
- Resultados ordenados por similaridade
- Filtra um conjunto de empenhos similares
- Compara com estatísticas do grupo de referência
- Aplica filtro inteligente (LLM) quando habilitado
- Agrega ocorrências por município/jurisdicionado/ano
- Destaca suspeitas por padrões de repetição
- Compara variações semânticas entre descrições e padrões esperados
- Ajuda a identificar desvios na linguagem do histórico
- Consulta Semântica (
/query) - Sobrepreço (
/sobrepreco) - Fracionamento (
/fracionamento) - Consistência Semântica (
/variabilidade-semantica) - Admin (
/admin)
curl -X POST "http://localhost:8000/api/consulta_vs" \
-H "Content-Type: application/json" \
-d '{
"ente": "NITEROI",
"unidade": "PGM",
"elementoDespesa": "",
"credor": "",
"historico": "água mineral"
}'curl "http://localhost:8000/api/sobrepreco?ano=2019&descricao=água%20mineral"nemesis/
├── backend/ # FastAPI + rotas de análise
├── frontend/react/ # UI em React + Tailwind
├── deploy/ # Dockerfiles + Caddyfile
├── docs/ # Documentação complementar
├── sql/ # Scripts e dumps SQL
└── README.md # Este arquivo
- JWT para autenticação
- Permissões por módulo (consulta, sobrepreço, fracionamento, admin)
- CORS configurável via
CORS_ORIGINS
docker compose -f deploy/docker-compose.yml up -d --builddocker build -f deploy/Dockerfile.backend -t nemesis-backend .
docker build -f deploy/Dockerfile.frontend -t nemesis-frontend \
--build-arg REACT_APP_API_BASE_URL=http://localhost:8000 .1. Erro de conexão com o banco
- Confirme
POSTGRES_HOST/PORTe se opgvectorestá habilitado.
2. Frontend não encontra API
- Verifique
REACT_APP_API_BASE_URLe o proxy do Caddy.
3. LLM filter não funciona
- Cheque
OPENAI_API_KEYeCONSULTA_LLM_RERANK=1.
- Fork do repositório
- Crie uma branch (
git checkout -b feature/minha-melhoria) - Commit (
git commit -m 'Minha melhoria') - Push (
git push origin feature/minha-melhoria) - Abra um Pull Request
MIT License — ver LICENSE.
Projeto desenvolvido por CEFET/RJ em parceria com o Tribunal de Contas do Estado do Rio de Janeiro (TCE-RJ).