antonio leandro

ia generativa

Reflexion: Language Agents with Verbal Reinforcement Learning

paper · Shinn, Noah, Cassano, Federico, Berman, Edward, Gopinath, Ashwin, Narasimhan, Karthik, Yao, Shunyu · · ~41 min de leitura do original

a tese

dá para reforçar um agente sem tocar em nenhum peso: ele escreve em português claro por que falhou, guarda esse texto na memória e usa o parágrafo como gradiente na tentativa seguinte

o que fica

  1. Uma recompensa escalar diz que a trajetória falhou, mas não onde; um parágrafo em linguagem natural aponta a ação errada e o que fazer no lugar dela, e é isso que o agente consegue usar no próximo episódio.
  2. A auto-reflexão sozinha piora o resultado: no ablation em Rust, refletir sem executar testes deu 52% contra 60% do baseline, porque o agente não sabe quando parar e continua editando código que já estava certo.
  3. Executar testes sem escrever a reflexão também não ajuda: ficou nos mesmos 60% do baseline, o que mostra que identificar o erro e consertar a implementação são duas tarefas, não uma.
  4. A qualidade do loop está presa à qualidade dos testes autogerados: o Reflexion perdeu para o GPT-4 no MBPP Python (77,1 contra 80,1), e o culpado é a taxa de falso positivo dos testes, 16,3% ali contra 1,4% no HumanEval.
  5. Escrever uma auto-correção útil é capacidade de modelo grande: no starchat-beta o Reflexion empatou com o baseline em 0,26, sem ganho nenhum.
  6. O método fracassa quando a tarefa exige exploração criativa em vez de correção: no WebShop os autores abortaram depois de quatro tentativas, porque o agente nem sequer produzia reflexões intuitivas.

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.

lido na íntegra por pipeline de llm, revisado por antonio leandro antes de publicar ·