PARA.AI / processors /processor_auditoria.py
Carlex22's picture
ParaAIV3.0
f0322a6
raw
history blame
4.91 kB
"""
ESPECIALISTA 5 - Processador de Auditoria
Verificação de integridade e conformidade do acórdão
"""
from typing import Dict, Any, List
import logging
from processors.base_processor import ProcessorBase
logger = logging.getLogger(__name__)
class ProcessorAuditoria(ProcessorBase):
"""
Especialista 5: Auditoria & Integridade
Responsabilidades:
- Verificação de conformidade com normas processuais
- Detecção de inconsistências lógicas
- Análise de completude do acórdão
- Verificação de citação de precedentes
- Flags de alerta (possíveis erros ou omissões)
"""
def __init__(self, llm_model=None):
super().__init__(
specialist_id=5,
specialist_name="Auditoria",
llm_model=llm_model
)
def process(self, acordao_data: Dict[str, Any]) -> Dict[str, Any]:
"""Realiza auditoria de conformidade"""
try:
integra = acordao_data.get('integra', '')
ementa = acordao_data.get('ementa', '')
auditoria = {
"conformidade_processual": self._verificar_conformidade(integra),
"inconsistencias_logicas": self._detectar_inconsistencias(integra),
"completude_acordao": self._analisar_completude(integra, ementa),
"flags_alerta": self._gerar_flags_alerta(integra),
"score_qualidade": self._calcular_score_qualidade(integra)
}
self.set_confidence(79)
return auditoria
except Exception as e:
self.add_error(f"Erro ao processar auditoria: {e}")
raise
def validate(self, result: Dict[str, Any]) -> bool:
"""Valida estrutura de saída"""
return all(key in result for key in [
"conformidade_processual",
"flags_alerta",
"score_qualidade"
])
def get_schema(self) -> Dict[str, Any]:
return {
"type": "object",
"properties": {
"conformidade_processual": {"type": "boolean"},
"inconsistencias_logicas": {"type": "array"},
"completude_acordao": {"type": "number", "minimum": 0, "maximum": 100},
"flags_alerta": {"type": "array"},
"score_qualidade": {"type": "number", "minimum": 0, "maximum": 100}
}
}
def _verificar_conformidade(self, texto: str) -> bool:
"""Verifica se acórdão está conforme normas processuais"""
# Verificar presença de elementos básicos
elementos = [
"ementa",
"relatório",
"voto",
"resultado"
]
return len(texto) > 1000 # Simplificado
def _detectar_inconsistencias(self, texto: str) -> List[Dict[str, str]]:
"""Detecta possíveis inconsistências lógicas"""
return [
{
"tipo": "inconsistencia_resultado",
"descricao": "Resultado declarado vs argumentação não alinhados",
"severidade": "baixa"
}
]
def _analisar_completude(self, integra: str, ementa: str) -> float:
"""Analisa completude do acórdão (0-100)"""
completude = 0
if len(ementa) > 100:
completude += 20
if len(integra) > 5000:
completude += 30
if "relator" in integra.lower():
completude += 15
if "resultado" in integra.lower() or "provido" in integra.lower():
completude += 20
if "fundamentação" in integra.lower():
completude += 15
return min(100, completude)
def _gerar_flags_alerta(self, texto: str) -> List[str]:
"""Gera flags de alerta para possíveis problemas"""
flags = []
if len(texto) < 1000:
flags.append("Acórdão muito curto - verificar completude")
if "indefinido" in texto.lower() or "não determinado" in texto.lower():
flags.append("Presença de termos indefinidos")
if texto.count("art.") < 3:
flags.append("Poucos artigos de lei citados")
return flags
def _calcular_score_qualidade(self, texto: str) -> float:
"""Calcula score de qualidade geral"""
score = 50
# Aumentar por tamanho
if len(texto) > 3000:
score += 10
if len(texto) > 5000:
score += 10
# Aumentar por presença de citações
if "art." in texto.lower():
score += 10
if "súmula" in texto.lower():
score += 5
# Penalizar por problemas
if "indefinido" in texto.lower():
score -= 10
return min(100, max(0, score))