o problema
Em 2023 já existia um punhado de agentes construídos sobre LLM — ReAct, SayCan, Toolformer, WebGPT — que geravam texto e ações executadas contra um ambiente: um jogo, um compilador, uma API. Todos tinham o mesmo buraco. Quando o agente errava, ele não aprendia nada. Na tentativa seguinte, refazia o mesmo caminho. O jeito clássico de corrigir isso é reinforcement learning, mas RL com gradiente pede muitas amostras e fine-tune do modelo, e ninguém ia refinar um modelo de centenas de bilhões de parâmetros entre um episódio e outro.
O número do próprio paper mostra o tamanho do buraco: em AlfWorld, o agente ReAct puro para de melhorar entre a sexta e a sétima tentativa e sua taxa de alucinação converge em 22%, sem sinal de recuperação. Ele fica preso achando que pegou um objeto que não pegou, executa mais vinte ações em cima dessa premissa e não consegue voltar atrás. E mesmo que houvesse orçamento para treinar, o sinal disponível é magro: um escalar dizendo “falhou”. Descobrir qual das trinta ações causou a falha a partir de um único bit é o problema de credit assignment, e é caro.
a ideia
Trocar o gradiente numérico por um parágrafo. O agente falha, recebe o sinal binário, e então um segundo passo de LLM lê a trajetória inteira mais o veredito e escreve, em primeira pessoa, o que deu errado e o que fazer diferente. Esse texto vai para uma memória e entra no contexto da próxima tentativa.
Os autores chamam isso de gradiente semântico, e a analogia se sustenta na parte que importa: como um gradiente, o texto indica direção, não só magnitude do erro. A diferença é que ele é legível. Dá para abrir a memória do agente e ver a frase “eu deveria ter procurado a luminária antes da caneca”. Nenhum peso mudou.
como funciona
O framework separa três papéis, que podem ou não ser o mesmo modelo. O Actor gera texto e ações a partir do estado — nos experimentos, é um agente ReAct ou chain-of-thought. O Evaluator pontua a trajetória produzida. O Self-Reflection lê o par trajetória-nota e devolve o parágrafo.
O laço é curto: gera trajetória, avalia, reflete, anexa a reflexão à memória, repete até o avaliador aprovar ou estourar o teto de tentativas. A memória tem dois níveis — a trajetória atual é a de curto prazo, as reflexões acumuladas são a de longo prazo — e a de longo prazo é uma janela deslizante de 1 a 3 experiências, limite imposto pela janela de contexto, não por teoria.
O Evaluator muda conforme a tarefa, e é aí que está o trabalho de engenharia. Em HotPotQA, exact match contra o gabarito. Em AlfWorld, uma heurística escrita à mão: se o agente repetir a mesma ação com a mesma resposta por mais de três ciclos, ou passar de trinta ações, dispara a reflexão. Em programação, o próprio agente escreve a suíte de testes com chain-of-thought, descarta o que não vira AST válida e fica com até seis testes.
o que isso custou
O ablation em Rust é a parte mais honesta do paper. Tirar a geração de testes e deixar só a reflexão dá 52%, abaixo dos 60% do baseline: sem execução, o agente não sabe se o código já está certo e segue editando até estragar. Tirar a reflexão e deixar só os testes dá exatamente os 60% do baseline. Os autores fecham a conclusão que decorre disso: debug por tentativa e erro cego, sem passo de explicação, não funciona em problema difícil.
O loop herda os defeitos dos testes que ele mesmo escreve. Um falso positivo — todos os testes passam numa implementação errada — faz o agente entregar cedo e com confiança. É o que explica o único benchmark em que o Reflexion perde: MBPP Python, 77,1 contra 80,1 do GPT-4, com 16,3% de falso positivo, contra 1,4% no HumanEval, onde ele chega a 91,0.
Fora isso: não há garantia formal de sucesso, e a técnica é otimização de política, então cai em mínimo local como qualquer outra. No WebShop, os autores abortaram após quatro tentativas — a tarefa exige exploração diversa, e o agente nem produzia reflexões úteis. E test-driven development não especifica função não determinística, função impura que chama API, função que depende de hardware ou de concorrência.
onde isso aparece hoje
O laço gerar, executar, explicar a falha por escrito, reescrever virou a forma padrão de agente de código, e o paper mostra por que os dois lados são necessários. O Actor aqui é literalmente ReAct ou chain-of-thought com uma memória colada por cima, e o benchmark que ele desloca é o HumanEval do Codex, superando o GPT-4 puro. A mesma aposta em veredito por execução em vez de julgamento do modelo reaparece na geração automática de teste em escala industrial, como no trabalho da Meta, e a memória de reflexões é um dos ancestrais diretos da discussão sobre harness para agentes de longa duração. O LeetcodeHardGym, com 40 questões hard em 19 linguagens publicadas depois do corte de pré-treino do GPT-4, é uma resposta precoce ao problema de contaminação de benchmark.