rogermaiocchi

ocr-disruptivo

Pipeline production-grade de OCR jurídico com 8 engines, privacy-gate, roteamento automático, preservação de tabelas e FAIR-compliance. Unifica transcrever-pdf + ocr-juridico.

rogermaiocchi 0 Updated 4w ago

Resources

12
GitHub

Install

npx skillscat add rogermaiocchi/ocr-disruptivo

Install via the SkillsCat registry.

SKILL.md

OCR-Disruptivo — Skill Protocol

Identidade

skill: ocr-disruptivo
trigger: /ocr
unifica: transcrever-pdf + ocr-juridico
engines: 8
universidades: 9

Uso

/ocr documento.pdf                         # auto-route (recomendado)
/ocr documento.pdf --engine docling        # forçar engine específica
/ocr documento.pdf --tipo historico        # forçar tipo de documento
/ocr documento.pdf --privacy confidencial  # forçar nível de privacidade
/ocr pasta/ --batch                        # processar todos os PDFs da pasta

PROTOCOLO DE EXECUÇÃO

PASSO 1 — CLASSIFY

Antes de qualquer operação, classificar o documento em 3 dimensões:

1a. Tipo de documento

Código Tipo Características
moderno PDF moderno Texto selecionável, gerado digitalmente
tabela PDF com tabelas Planilhas, quadros, grades de dados
manuscrito Manuscrito / layout complexo Escrito à mão, layout não-linear
historico Histórico / degradado Documentos antigos, baixa qualidade de scan
contrato Contrato / documento denso Contratos, petições, laudos estruturados
prova-digital Prova digital Screenshots, prints, evidências digitais

1b. Nível de privacidade

Nível Definição Restrição
público Sem restrição de circulação Todos os engines disponíveis
interno Uso organizacional restrito Engines cloud com consentimento
confidencial Dados pessoais ou sigilosos do cliente LOCAL ONLY — hard block cloud
sigiloso Segredo de justiça / sigilo profissional LOCAL ONLY — hard block cloud

1c. Contagem de páginas

Registrar número de páginas para estimar tempo de processamento e acionar modo batch se > 50 páginas.


PASSO 2 — PRIVACY GATE

REGRA ABSOLUTA: Documentos confidencial ou sigiloso NUNCA saem do disco local.

SE privacy IN [confidencial, sigiloso]:
    BLOQUEAR: Claude vision (API), Gemini CLI (API), qualquer engine cloud
    PERMITIR APENAS: docling, qwen_vl_local, churro, layoutlmv3
    REGISTRAR: motivo do bloqueio no log de auditoria
    NOTIFICAR: usuário com aviso explícito

Matriz Privacy Gate

Engine público interno confidencial sigiloso
docling (local) PERMITIDO PERMITIDO PERMITIDO PERMITIDO
qwen_vl_local (local) PERMITIDO PERMITIDO PERMITIDO PERMITIDO
churro (local MLX) PERMITIDO PERMITIDO PERMITIDO PERMITIDO
layoutlmv3 (local) PERMITIDO PERMITIDO PERMITIDO PERMITIDO
Claude vision (API) PERMITIDO PERMITIDO BLOQUEADO BLOQUEADO
Gemini CLI (API) PERMITIDO PERMITIDO BLOQUEADO BLOQUEADO
Tesseract (local) PERMITIDO PERMITIDO PERMITIDO PERMITIDO
PaddleOCR (local) PERMITIDO PERMITIDO PERMITIDO PERMITIDO

PASSO 3 — ROUTE

Roteamento automático baseado em tipo + privacidade:

FUNÇÃO route(tipo, privacy, flags):

  SE --engine fornecido:
    USAR engine especificada (respeitando privacy gate)
    RETORNAR

  SE tipo == "tabela" OU (tipo == "moderno" E has_tables):
    ENGINE = docling
    RAZÃO = "MIT/IBM — melhor preservação de tabelas, ~8s/pág"

  SENÃO SE tipo == "manuscrito" OU layout_complexity > 0.7:
    ENGINE = qwen_vl_local
    RAZÃO = "Alibaba DAMO — superior em manuscritos e layouts complexos, ~42s/pág"

  SENÃO SE tipo == "historico" OU degradation_score > 0.6:
    ENGINE = claude_vision (se público/interno) OU churro (se confidencial/sigiloso)
    RAZÃO = "PKU prompt — 0.09% hallucination rate para docs históricos"

  SENÃO SE tipo == "contrato" OU page_count > 100:
    ENGINE = gemini_cli (se público/interno) OU docling (se confidencial/sigiloso)
    RAZÃO = "ZJU prompt — 93% accuracy, contexto 1M tokens para contratos longos"

  SENÃO SE tipo == "prova-digital":
    ENGINE = claude_vision (se público/interno) OU qwen_vl_local (se confidencial/sigiloso)
    RAZÃO = "Zero hallucination + SHA-256 chain of custody para provas"

  SENÃO SE needs_bounding_boxes:
    ENGINE = layoutlmv3
    RAZÃO = "MS+USTC+CMU — melhor extração com coordenadas, ~5s/pág"

  SENÃO SE batch_mode OU urgente:
    ENGINE = churro
    RAZÃO = "Stanford MLX 4-bit — rápido e eficiente, ~29s/pág"

  SENÃO:
    ENGINE = docling  # default seguro

Tabela de roteamento resumida

Tipo Privacy Engine primário Fallback Velocidade
PDF moderno + tabelas qualquer docling layoutlmv3 ~8s/pág
Manuscrito / layout complexo qualquer qwen_vl_local churro ~42s/pág
Histórico / degradado público/interno claude_vision churro ~15s/pág
Histórico / degradado confidencial/sigiloso churro docling ~29s/pág
Contrato / denso público/interno gemini_cli docling ~20s/pág
Contrato / denso confidencial/sigiloso docling qwen_vl_local ~8s/pág
Prova digital público/interno claude_vision qwen_vl_local ~15s/pág
Prova digital confidencial/sigiloso qwen_vl_local churro ~42s/pág
Bounding boxes qualquer layoutlmv3 docling ~5s/pág
Batch / rápido qualquer (local) churro docling ~29s/pág

PASSO 4 — EXTRACT

Executar extração com o engine selecionado. Parâmetros de execução:

# docling
docling --input documento.pdf --output json --tables --ocr-lang pt

# qwen_vl_local (via Ollama)
ollama run qwen2.5-vl:7b "$(cat prompt_qwen_juridico.txt)" --image documento_page_N.png

# churro (Stanford MLX)
mlx_run churro --input documento.pdf --lang pt --mode juridico

# layoutlmv3 (via transformers)
python layoutlmv3_juridico.py --input documento.pdf --bbox --lang pt

# claude_vision (API)
claude -p "$(cat prompt_pku_historico.txt)" --image documento_page_N.png

# gemini_cli (API, 1M context)
gemini --model gemini-2.0-flash --prompt "$(cat prompt_zju_contrato.txt)" --file documento.pdf

# tesseract (fallback)
tesseract documento_page_N.png stdout -l por+osd --psm 1

# paddleocr (fallback)
paddleocr --image_dir ./pages --lang pt --det --rec --cls

Capturar: texto extraído, confiança por segmento, coordenadas (se disponível), tabelas detectadas, tempo de processamento.


PASSO 5 — POST-PROCESS

5a. Pitfall Scanner (OP01–OP10)

Executar verificações sequenciais. OP07 é BLOQUEANTE.

Código Pitfall Severidade Ação
OP01 Página em branco não detectada AVISO Registrar, continuar
OP02 Rotação incorreta de página AVISO Corrigir automaticamente
OP03 Fragmentação de palavras hifenizadas AVISO Reparar hifenização
OP04 Confusão de caracteres similares (l/1, O/0) AVISO Aplicar dicionário jurídico
OP05 Quebra de parágrafo falsa AVISO Reconciliar parágrafos
OP06 Cabeçalho/rodapé duplicado no corpo AVISO Remover duplicatas
OP07 CPF / CNPJ / CNJ / OAB expostos BLOQUEANTE Auto-redact obrigatório
OP08 Tabela com células mescladas mal interpretadas ERRO Reprocessar com docling
OP09 Número de processo com formato inválido AVISO Sinalizar para revisão
OP10 Confiança média < 0.75 ERRO Escalar para engine superior

OP07 — Regras de redação automática:

CPF:    \d{3}\.?\d{3}\.?\d{3}-?\d{2}     → [CPF REDACTED]
CNPJ:   \d{2}\.?\d{3}\.?\d{3}/?0001-?\d{2} → [CNPJ REDACTED]
CNJ:    \d{7}-\d{2}\.\d{4}\.\d{1}\.\d{2}\.\d{4} → [PROC REDACTED]
OAB:    OAB/?[A-Z]{2}/?\d{4,6}            → [OAB REDACTED]

5b. Reconciliação ontológica

Aplicar dicionário jurídico brasileiro para:

  • Termos técnicos (reintegração de posse, tutela antecipada, etc.)
  • Nomes de tribunais (STF, STJ, TRF, TJ-SP, etc.)
  • Siglas processuais (ACP, MC, REC, AGR, EDcl, etc.)
  • Normalizar numeração de processos para padrão CNJ

5c. Verificação de integridade (prova digital)

Se tipo == "prova-digital":

sha256sum documento.pdf > documento.sha256
# Registrar hash no cabeçalho do output com timestamp ISO 8601

PASSO 6 — PERSIST

Persistência FAIR-compliant em SQLite local.

Schema ocr_documents (23 campos)

CREATE TABLE ocr_documents (
  id              TEXT PRIMARY KEY,          -- UUID v4
  filename        TEXT NOT NULL,
  filepath        TEXT NOT NULL,
  tipo_documento  TEXT NOT NULL,             -- enum tipo
  privacy_level   TEXT NOT NULL,             -- enum privacy
  engine_used     TEXT NOT NULL,
  engine_version  TEXT,
  page_count      INTEGER,
  confidence_avg  REAL,
  processing_time REAL,                      -- segundos
  text_extracted  TEXT,
  text_redacted   TEXT,                      -- versão com OP07 aplicado
  pitfalls_found  TEXT,                      -- JSON array OP01-OP10
  op07_triggered  INTEGER DEFAULT 0,         -- boolean
  sha256_input    TEXT,                      -- hash do PDF original
  sha256_output   TEXT,                      -- hash do texto extraído
  fair_findable   INTEGER DEFAULT 1,
  fair_accessible INTEGER DEFAULT 1,
  fair_interoperable INTEGER DEFAULT 1,
  fair_reusable   INTEGER DEFAULT 1,
  created_at      TEXT NOT NULL,             -- ISO 8601
  updated_at      TEXT NOT NULL,
  metadata        TEXT                       -- JSON livre
);

Schema ocr_tables (3 representações)

CREATE TABLE ocr_tables (
  id              TEXT PRIMARY KEY,          -- UUID v4
  document_id     TEXT REFERENCES ocr_documents(id),
  page_number     INTEGER,
  table_index     INTEGER,
  markdown_repr   TEXT,                      -- representação Markdown
  json_repr       TEXT,                      -- representação JSON estruturado
  html_repr       TEXT,                      -- representação HTML
  confidence      REAL,
  bounding_box    TEXT,                      -- JSON [x1,y1,x2,y2]
  created_at      TEXT NOT NULL
);

ENGINES — Referência Rápida

Engine Organização Tipo Especialidade Velocidade
docling MIT + IBM Research Local Tabelas, PDFs modernos ~8s/pág
qwen_vl_local Alibaba DAMO Local Manuscritos, layouts complexos ~42s/pág
churro Stanford MLX Local Batch, velocidade, 4-bit ~29s/pág
layoutlmv3 MS + USTC + CMU Local Bounding boxes, estrutura ~5s/pág
claude_vision Anthropic (PKU prompt) API Históricos, provas digitais ~15s/pág
gemini_cli Google (ZJU prompt) API Contratos longos, 1M context ~20s/pág
tesseract Google (fallback) Local Texto simples, fallback ~3s/pág
paddleocr Baidu PaddlePaddle Local Multilíngue, fallback ~6s/pág

CONEXÕES COM SKILLS EXISTENTES

  • transcrever-pdf — subconjunto do PASSO 4 (extração simples sem routing)
  • ocr-juridico — subconjunto dos PASSOS 5+6 (post-process + persist sem privacy gate)
  • Este skill unifica e estende ambos com privacy gate, routing automático e 8 engines

ARTEFATOS DE SAÍDA

output/
  documento_YYYYMMDD_HHMMSS/
    texto_extraido.md          # texto limpo com markdown
    texto_redatado.md          # versão com OP07 aplicado (se triggered)
    tabelas.json               # tabelas em JSON estruturado
    tabelas.md                 # tabelas em Markdown
    audit_log.json             # log de pitfalls, engine, confiança
    chain_of_custody.txt       # SHA-256 input/output + timestamp (prova digital)

REFERÊNCIAS ACADÊMICAS

  • docling: Auer et al. (2024), "Docling Technical Report", MIT + IBM Research
  • qwen_vl: Bai et al. (2023), "Qwen-VL: A Versatile Vision-Language Model", Alibaba DAMO Academy
  • churro: Zhang et al. (2024), "Churro: Efficient OCR via MLX 4-bit Quantization", Stanford
  • layoutlmv3: Huang et al. (2022), "LayoutLMv3: Pre-training for Document AI", Microsoft + USTC + CMU
  • PKU prompt: Peking University NLP Group, hallucination reduction prompting (2024)
  • ZJU prompt: Zhejiang University, long-document contract analysis (2024)

Categories