ADR 001: Migração de Arquitetura Zero-Shot para RAG (Busca Vetorial)

Campo Valor
Data 21/04/2026
Status ✅ Aceito (Implementado na Sprint 05)
Participantes @henriquemendeselias, @jot4-ge, @luizhtmoreira, @G2SBiell, @lucasaraujoszz, @matheus0346

1. Contexto e Problema

O ContraDito iniciou com uma arquitetura onde o Llama 3 8B atuava em formato One-Shot/Zero-Shot: recebia o texto bruto do discurso e deveria classificar o tema, inferir a postura e gerar um resumo em uma única requisição.

Ao escalar para os 513 deputados federais (Sprint 04), foram identificadas falhas críticas:

  • Sobrecarga Cognitiva: O LLM não conseguia processar com precisão textos políticos altamente subjetivos, eufemísticos e longos.
  • Inconsistência de Dados: Quebras frequentes no formato de saída (JSON corrompido) e alucinações na correlação de contextos, gerando falsos positivos no Score de Coerência.

2. Decisão Arquitetural

Decidimos abandonar a classificação direta via LLM e pivotar para uma arquitetura baseada em Retrieval-Augmented Generation (RAG) com busca vetorial no banco de dados.

As mudanças técnicas acordadas:

  1. Modelo de Embeddings (SBERT): Adoção do paraphrase-multilingual-mpnet-base-v2 para transformar leis e discursos em vetores de 768 dimensões.
  2. Banco Vetorial: Ativação da extensão pgvector no Supabase com índices HNSW.
  3. Filtro de Similaridade: O cruzamento ("Dito" vs "Feito") passa a ser calculado via Similaridade de Cosseno diretamente no banco.
  4. Redução do Escopo do LLM: O Llama 3 deixa de ser motor de busca. Recebe apenas o par filtrado (Ementa da Lei + Discurso relevante) e dedica 100% do processamento para justificar textualmente a postura (A Favor, Contra, Neutro).

3. Consequências

Pontos Positivos

  • Alta Precisão e Rastreabilidade: Eliminação de alucinações no cruzamento de dados. O Score passa a ser baseado em métricas matemáticas auditáveis.
  • Performance: A busca vetorial via índice HNSW é executada em milissegundos no banco, aliviando a latência da API.

Trade-offs

!!! warning "Custo Adicional" Complexidade de Infraestrutura: Exigiu reestruturação do docker-compose para isolar dependências pesadas de IA (PyTorch e Sentence-Transformers) em um contêiner separado (Worker ETL), além de adaptações no script de seeding (Upsert de texto limpo + vetor numérico).