Pular para o conteúdo

Visao Geral da Arquitetura

O Douto opera em dois modos complementares: um pipeline ETL em lote que transforma PDFs juridicos em dados pesquisaveis, e um knowledge graph baseado em markdown navegavel por humanos e agentes de IA. Nao e uma aplicacao web nem um servico em execucao — e um conjunto de ferramentas de processamento e uma base de conhecimento estruturada.

Pipeline de Processamento em Lote — Cinco scripts Python independentes executados sequencialmente. Cada um le do disco, processa os dados e grava de volta no disco. Sem banco de dados, sem fila de mensagens, sem orquestrador.

Knowledge Graph em Markdown — Uma hierarquia compativel com Obsidian usando frontmatter YAML, wikilinks e Maps of Content (MOCs). Projetada para consumo dual: navegacao humana no Obsidian e consulta programatica por agentes de IA.

flowchart TD
PDF["📄 Legal PDFs<br/>(staging/input/)"]
PB["process_books.py<br/>LlamaParse API"]
RC["rechunk_v3.py<br/>5-pass algorithm"]
EN["enrich_chunks.py<br/>MiniMax M2.5 LLM"]
EM["embed_doutrina.py<br/>Legal-BERTimbau"]
SE["search_doutrina_v2.py<br/>Hybrid: Semantic + BM25"]
JSON["📦 JSON Artifacts<br/>embeddings + corpus + BM25"]
PDF -->|"PDF files"| PB
PB -->|"markdown<br/>(chapters)"| RC
RC -->|"intelligent<br/>chunks"| EN
EN -->|"enriched chunks<br/>(13 metadata fields)"| EM
EM -->|"768-dim vectors"| JSON
JSON --> SE

Cada seta representa uma passagem via sistema de arquivos — nao existe pipeline em memoria nem streaming. Scripts podem ser re-executados independentemente com --force ou --dry-run.

A knowledge base tem tres camadas:

CamadaArquivoFinalidadeStatus
Raizknowledge/INDEX_DOUTO.mdPonto de entrada do skill graph — mapeia 8 dominios juridicosAtivo
Mapas de Dominioknowledge/mocs/MOC_*.mdLivros por dominio com metadados e status3 ativos, 1 placeholder, 4 ausentes
Notas Atomicasknowledge/nodes/*.mdUma nota por conceito juridico (instituto)Planejado (diretorio existe, sem conteudo)

A hierarquia segue convencoes do Obsidian: [[wikilinks]] para navegacao, frontmatter YAML para metadados estruturados.

O pipeline produz tres arquivos JSON por area juridica (ex.: contratos, processo_civil):

ArquivoConteudoTamanho Estimado
embeddings_{area}.jsondoc_ids[] + embeddings[][] (vetores float32 de 768 dimensoes)~500 MB para 31.500 chunks
search_corpus_{area}.jsonMetadados completos por chunk (titulo, autor, instituto, tipo, etc.)~200 MB
bm25_index_{area}.jsondoc_ids[] + documents[] (texto tokenizado para BM25)~300 MB

Esses arquivos sao carregados inteiramente em memoria pelo search_doutrina_v2.py na inicializacao.

graph TB
subgraph "Douto — Pipeline"
PB["process_books.py"]
RC["rechunk_v3.py"]
EN["enrich_chunks.py"]
EM["embed_doutrina.py"]
SE["search_doutrina_v2.py"]
end
subgraph "Douto — Knowledge Base"
IX["INDEX_DOUTO.md"]
MC["MOC_CIVIL<br/>35 books"]
MP["MOC_PROCESSUAL<br/>8 books"]
ME["MOC_EMPRESARIAL<br/>7 books"]
end
subgraph "sens.legal Ecosystem"
VA["Valter<br/>FastAPI + Neo4j + Qdrant"]
JU["Juca<br/>Next.js Frontend"]
LE["Leci<br/>Legislation"]
end
subgraph "External Services"
LP["LlamaParse API"]
MM["MiniMax M2.5 API"]
HF["HuggingFace<br/>Legal-BERTimbau"]
end
PB --> RC --> EN --> EM --> SE
SE -.->|"JSON files"| VA
VA --> JU
IX --> MC & MP & ME
PB -.-> LP
EN -.-> MM
EM -.-> HF

Atualmente, o Douto integra com o ecossistema por meio de arquivos JSON depositados em um diretorio compartilhado. Nao ha API, servidor MCP nem capacidade de consulta em tempo real. A integracao via MCP esta planejada para v0.4.

Extraidos do CLAUDE.md, em ordem de prioridade:

  1. Corretude — especialmente dados doutrinarios, citacoes e metadados juridicos
  2. Simplicidade — codigo que outro agente entende sem contexto
  3. Manutenibilidade — facil de alterar sem quebrar
  4. Reversibilidade — decisoes que podem ser desfeitas
  5. Performance — otimizar somente com evidencia de problema

Principios operacionais:

  • Idempotente — todo script e seguro para re-executar (marcadores de skip, --force para sobrescrever)
  • Dry-run primeiro — todo script suporta --dry-run
  • Logging estruturado — eventos vao para processing_log.jsonl

Estas sao restricoes arquiteturais, nao bugs. Cada uma tem referencia de rastreamento:

LimitacaoImpactoRastreamento
Sem banco de dados — arquivos JSON flatNao escala alem de ~100 livros, carga total em memoriaADR-003
Sem API ou servidor MCPSem consultas em tempo real de outros agentesF30, v0.4
Sem CI/CDSem testes ou linting automatizadosF39, v0.5
Caminhos hardcoded em 2 scriptsPipeline roda apenas na maquina do criadorF22, v0.2
0% de cobertura de testesRegressoes indetectaveis exceto por inspecao manualF26-F27, v0.3
Prompt de enriquecimento ausenteenrich_prompt.md fora do repo — enriquecimento irreproduzivelM01