Pular para o conteúdo

Verificacao e Enriquecimento

O Valter oferece duas funcionalidades complementares para garantir a precisao do conteudo juridico. A verificacao identifica referencias juridicas alucinadas antes que cheguem ao usuario. O enriquecimento adiciona analise juridica estruturada (IRAC) e contexto do knowledge graph as decisoes.

Endpoint: POST /v1/verify

LLMs frequentemente alucinam citacoes juridicas — inventando numeros de sumula, errando nomes de ministros ou fabricando numeros de processo. O LegalVerifier (core/verifier.py) valida referencias encontradas no texto contra datasets conhecidos e calcula um score de risco de alucinacao.

O verificador checa quatro categorias de referencias juridicas, cada uma ativavel/desativavel via parametros da requisicao:

Valida numeros de sumula contra dados de referencia locais do STJ e STF usando SumulaValidator. A validacao confirma:

  • O numero da sumula existe
  • O tribunal correto esta atribuido (STJ vs STF)
  • Status atual (vigente ou nao)
  • A area juridica associada

Valida nomes de ministros contra uma lista conhecida usando MinistroValidator. Retorna:

  • valid: se o nome corresponde a um ministro conhecido
  • confidence: exact, partial ou none
  • is_aposentado: se o ministro esta aposentado
  • suggestion: nome corrigido quando um match parcial e encontrado

Valida o formato do numero de processo CNJ usando um padrao regex:

NNNNNNN-NN.NNNN.N.NN.NNNN
# From core/verifier.py
PROCESSO_REGEX = re.compile(r"\b(\d{7}-\d{2}\.\d{4}\.\d\.\d{2}\.\d{4})\b")

Isso valida apenas o formato — nao confirma se o processo existe em sistemas externos.

Extrai e classifica mencoes a legislacao usando padroes regex. Reconhece tanto referencias explicitas (ex.: “Lei 8.078/1990”) quanto aliases comuns:

AliasResolve Para
CDCLei 8.078/1990
CCLei 10.406/2002
CPCLei 13.105/2015
CLTDecreto-Lei 5.452/1943
CPDecreto-Lei 2.848/1940
CTNLei 5.172/1966
CFConstituicao Federal 1988
ECALei 8.069/1990

Referencias a artigos (ex.: “Art. 186”) tambem sao extraidas e vinculadas a lei de origem.

O verificador calcula um objeto HallucinationMetrics geral:

# From core/verifier.py
@dataclass
class HallucinationMetrics:
risk_level: str # "low", "medium", "high"
risk_score: float # 0-100
total_citations: int
valid_count: int
invalid_count: int
unverified_count: int
details: dict

O score de risco agrega os resultados de validacao: um texto com muitas referencias invalidas produz um score mais alto, sinalizando que o conteudo pode conter citacoes alucinadas.

A verificacao se baseia em datasets golden armazenados no diretorio data/reference/. O projeto tambem conta com 810.225 registros de metadados do STJ para validacao mais ampla de processos.

Endpoint: POST /v1/enrich

O DocumentEnricher (core/enricher.py) realiza duas operacoes em um documento juridico: classificacao heuristica IRAC e carregamento de contexto do knowledge graph.

IRAC e um framework padrao para analise de decisoes juridicas:

ComponenteO Que IdentificaPadroes Exemplo
IssueA questao juridica sendo decidida”questao”, “controversia”, “discute-se”, “cinge-se”
RuleA norma ou principio juridico aplicado”artigo”, “lei”, “sumula”, “nos termos de”
ApplicationComo a regra foi aplicada aos fatos”no caso”, “in casu”, “verifica-se”, “configurado”
ConclusionA decisao do tribunal”portanto”, “ante o exposto”, “da provimento”, “nega”

A classificacao e heuristica e baseada em regex — nao depende de um LLM. Cada secao IRAC e identificada escaneando o texto do documento (ementa, tese, razoes_decidir) contra padroes regex compilados:

# From core/enricher.py
IRAC_PATTERNS = {
IRACSection.ISSUE: [
r"\b(?:questao|problema|controversia|debate|discussao|tese|cerne)\b",
r"\b(?:discute-se|indaga-se|pergunta-se|cinge-se)\b",
],
IRACSection.RULE: [
r"\b(?:art\.?|artigo|lei|sumula|codigo|dispositivo|norma)\b",
r"\b(?:preve|estabelece|dispoe|prescreve|determina)\b",
],
# ...
}

Apos a classificacao IRAC, o enricher carrega contexto do grafo executando 5 queries paralelas no Neo4j:

Tipo de EntidadeMetodoO Que Retorna
Criteriosget_criterios()Criterios juridicos conectados a decisao
Dispositivosget_dispositivos()Dispositivos legais citados
Precedentesget_precedentes()Decisoes precedentes citadas
Legislacaoget_legislacao()Arestas de legislacao com metadados de relacionamento
Decisoes Relacionadasget_related_decisions()Decisoes conectadas via criterios compartilhados

O resultado do enriquecimento inclui um flag kg_available indicando se o grafo Neo4j continha dados para esta decisao.

# From core/enricher.py
@dataclass
class EnrichmentResult:
document_id: str
irac: IRACAnalysis | None = None
features: DocumentFeatures | None = None
criterios: list[Criterio] = field(default_factory=list)
dispositivos: list[DispositivoLegal] = field(default_factory=list)
precedentes: list[Precedente] = field(default_factory=list)
legislacao: list[DecisaoLegislacaoEdge] = field(default_factory=list)
related_decisions: list[RelatedDecision] = field(default_factory=list)
kg_available: bool = False

Se um FeaturesStore estiver configurado, o enricher tambem carrega as 21 features extraidas por IA para o documento.

Endpoint: POST /v1/factual/extract

O FactualExtractor (core/factual_extractor.py) usa um Groq LLM para extrair duas representacoes estruturadas independentes a partir de texto juridico:

Um conjunto de 10-15 bullets factuais mais uma narrativa condensada (2-3 frases), otimizado para busca semantica:

  • Cada bullet cita o trecho fonte do texto original quando identificavel
  • Fatos incertos ou contestados sao marcados com uncertainty: true
  • O digest_text e projetado para ser denso e comparavel entre casos

O argumento juridico central extraido do documento:

  • Descricao da tese central (1-3 frases)
  • Base legal: dispositivos citados (ex.: “CDC art. 14”, “CC/2002 art. 186”)
  • Precedentes citados no texto (ex.: “REsp 1.234.567/SP”, “Sumula 297/STJ”)

Essas representacoes densas produzem vetores mais discriminativos do que a codificacao de decisoes inteiras, que sofrem de media de topicos em documentos longos. A entrada e limitada a 4.000 caracteres para alinhar com os limites de contexto do LLM.

Integrada ao pipeline do verificador, a verificacao de validade temporal checa se as normas juridicas referenciadas ainda estao em vigor. Isso captura referencias a legislacao revogada ou substituida, que e uma fonte comum de imprecisao em conteudo juridico gerado por IA.