Autocrítica Inútil (Redundant Self-Critique) é um smell de IA, ou seja, um sinal de problema em sistemas com LLM, do grupo Dispensáveis. Uma etapa de revise sua resposta que dobra o custo e quase nunca muda nada.
Um revisor de PR gera comentários e, antes de publicar, passa por três rodadas de “revise sua revisão”. O código (anonimizado):
review = llm(REVIEW_PROMPT, diff)for _ in range(3): review = llm("Revise criticamente a revisão abaixo e melhore-a.", review)post_comments(review)
O trace de um mês mostrou que, em 94 de cada 100 PRs, a terceira versão tinha os mesmos comentários da primeira, com palavras levemente diferentes. Nos outros 6, a mudança era de estilo. O custo da revisão era quatro vezes o da primeira chamada.
Suponha, só para ver a conta, 2.000 tokens na geração e 2.000 em cada revisão. Quatro chamadas mandam cerca de 8.000 tokens de entrada só nesse passo, para devolver o comentário que a primeira já tinha. A latência acompanha: quatro idas ao modelo no caminho crítico.
Sinais de Autocrítica Inútil:
Há um passo de “revise”, “critique” ou “melhore” que roda sobre a própria saída, sem informação nova.
O passo de revisão usa o mesmo modelo, o mesmo contexto e nenhum critério verificável.
Comparando entrada e saída da revisão, quase nada muda.
O eval dá o mesmo resultado com e sem o passo.
O passo dobra ou triplica custo e latência.
flowchart LR
G(["1. Gerar"]):::llm --> R1(["2. Revise"]):::llm
R1 --> R2(["2. Revise de novo"]):::llm
R2 --> R3(["2. Revise mais uma vez"]):::llm
R3 --> OUT(["3. Quase a mesma saída, 4x o custo"]):::io
O modelo gera a resposta.
O mesmo modelo relê a própria resposta, sem dado novo, e reescreve.
A saída final é praticamente a primeira.
A intuição humana (“releia antes de enviar”) não se transfere. A pessoa que relê traz memória, cansaço, um padrão que acabou de ver no arquivo ao lado. O modelo relê o mesmo buffer.
Por que acontece
“Pense de novo” parece sempre bom. Revisar é um hábito humano sólido. Copiado para o pipeline, vira uma chamada extra com o mesmo input.
Trabalhos que mostram ganho com reflexão. Reflexion (Shinn et al., 2023) usa sinal externo (o ambiente, um teste). Self-Refine (Madaan et al., 2023) também estrutura o feedback. A cópia ingênua tira o sinal e fica só com “melhore o texto acima”.
Sem eval. Ninguém mediu se o passo muda alguma coisa. Quatro vezes o custo parece “mais qualidade”.
Parece mais seguro. Um passo a mais de “garantia” dá conforto, mesmo sem efeito. Em time de compliance, ninguém quer ser a pessoa que tirou a revisão.
Quanto custa ignorar
Custo e latência multiplicados sem ganho de qualidade. No revisor, cada PR espera quatro chamadas.
Às vezes, piora. A revisão sem critério pode “melhorar” algo que estava certo: suaviza um “isso quebra produção” num “talvez valha olhar”.
Falsa sensação de controle. O time acredita que há uma checagem de qualidade que não existe. O incidente passa pelas três voltas e ninguém desconfia do passo.
O guia “Building effective agents”, da Anthropic (dez. 2024), descreve o padrão Avaliador e Otimizador com um avaliador separado e uma rubrica. Isso é o oposto deste smell: há critério, independência e, quando vale, ganho medido.
O eval mostra que o passo não muda o resultado. Ele sai, e o que tinha de útil (um critério, um formato) vai para o prompt da etapa principal. Destino: Encadeamento de Prompts.
Se a revisão é necessária, dê a ela informação nova: um sinal externo (Reflexão) ou um avaliador separado com rubrica (Avaliador e Otimizador).
Antes de apagar, meça. Rode o eval com e sem o passo, na mesma seed, no mesmo conjunto. Se a nota não mexe, o passo sai. Se mexe pouco e o custo dobra, a conta precisa ser explícita, não um hábito.
O diff que o time espera, na prática:
review = llm(REVIEW_PROMPT, diff)post_comments(review)# critérios de tamanho e de "arquivo fora do diff" ficam em código, não numa segunda chamada
Três linhas a menos no caminho crítico. Se um dia o eval pedir a volta, ela volta com rubrica ou com um teste, não com “melhore o texto”.
Critérios objetivos (tamanho, schema, “o SQL roda”, “a citação existe no PDF”) cabem em código. Não peçam uma quarta chamada ao modelo.
O que você ganha
Custo e latência proporcionais ao trabalho real.
Um pipeline mais curto e mais fácil de depurar.
Quando houver revisão, ela terá um critério que dá para medir.
Quando ignorar
O eval mostra ganho. Se o passo melhora a qualidade de forma medida, ele não é inútil, mesmo sem sinal externo. Mantenha e monitore.
Tarefas longas de raciocínio. Em alguns problemas difíceis, uma segunda passada encontra erros. Meça antes de decidir.
É esse smell?
Perguntas rápidas
O que é Autocrítica Inútil?
Autocrítica Inútil (Redundant Self-Critique) é um smell de IA, ou seja, um sinal de problema em sistemas com LLM, do grupo Dispensáveis. Uma etapa de revise sua resposta que dobra o custo e quase nunca muda nada.
Como corrigir Autocrítica Inútil?
Com Embutir Etapa Trivial. Cada refatoração traz o passo a passo seguro, com eval antes e depois.