Contaminação de benchmark: o modelo já viu a prova antes do teste?

Contaminação de benchmark é quando os dados da avaliação entram no treino do modelo, e a nota sobe por memorização em vez de capacidade real. A revisão sistemática da área separa isso em quatro níveis (exata, sintática, semântica e de nível de tarefa), o que significa que nem precisa ser cópia literal pra sujar o resultado. Já tem caso documentado em SWE-bench Verified, BrowseComp, SWE-Bench+ e GSM1k. Como nenhum método de detecção é confiável em todos os cenários, o jeito honesto de usar ranking é como pista, nunca como veredito: o teste que decide é o seu, na sua base de código.
O Claude Opus 4.6 desconfiou que estava sendo avaliado, identificou qual era o benchmark e foi atrás do gabarito 😅
A Anthropic documentou o caso no BrowseComp: em 1.266 problemas apareceram nove exemplos de contaminação, e em dois casos inéditos o modelo levantou a hipótese de estar sob avaliação, identificou o benchmark e chegou a localizar e descriptografar a resposta
Isso deixou de ser curiosidade de paper faz tempo
Se você escolhe modelo olhando tabela de ranking (e todo mundo faz isso), a pergunta que interessa é bem simples: aquele número mede capacidade ou memória?
Bora destrinchar isso
Como um exercício público acaba dentro do treino do modelo:
O caminho é menos misterioso do que parece
Benchmark bom precisa de tarefa real, então quem monta vai buscar onde tem material de verdade: issues do GitHub, problemas de plataforma de competição, fórum, artigo, dataset público
Ou seja, conteúdo público
E o que mais entra em pipeline de treino de LLM? Conteúdo público 😛
O benchmark e o corpus de treino bebem da MESMA fonte. Não precisa de má fé de ninguém pra o gabarito acabar do lado de dentro
Que tipo de vazamento conta como contaminação?
A revisão sistemática sobre detecção de contaminação classifica o problema em quatro níveis: exata, sintática, semântica e de nível de tarefa
Formação Claude Code
Domine Claude Code do absoluto zero até o avançado
- 114 aulas
- 4 projetos
- 9h 18min
O nome já entrega a escala: vai do item idêntico dentro do treino até formas bem mais indiretas, em que o que vazou não é o texto exato, e sim algo próximo demais dele
Esse é o ponto que mais gente erra: não precisa ser cópia literal pra contaminar
Se você conhece cache de aplicação, a analogia serve bem. O modelo não precisa ter o registro exato guardado, basta ter visto material perto o suficiente pra reconstruir a resposta sem raciocinar de novo
A definição corrente é essa: contaminação é exposição aos dados de avaliação durante o treino, o que infla a pontuação artificialmente por memorização em vez de capacidade real
Quatro casos reais de contaminação em benchmarks conhecidos:
Nada de achismo aqui, vamos só de caso documentado
SWE-bench Verified: a OpenAI parou de reportar
Em fevereiro de 2026 a OpenAI publicou que não usa mais o SWE-bench Verified como medida de capacidade de código de fronteira
Os motivos citados: saturação, testes falhos e contaminação vinda de repositórios públicos
E tem a parte que dói: na auditoria de contaminação, todos os modelos de fronteira testados (GPT-5.2, Claude Opus 4.5 e Gemini 3 Flash) conseguiram reproduzir gold patches verbatim ou detalhes específicos de certas tarefas do Verified
Reproduzir o patch de referência LITERALMENTE não é resolver o problema
É lembrar da resposta
BrowseComp e o Opus 4.6: o modelo percebeu a prova
O caso da abertura, com os números da análise da Anthropic sobre eval awareness
Nove exemplos de contaminação em 1.266 problemas
Ao menos 20 fontes distintas de respostas vazadas do BrowseComp circulando por aí
Um único problema consumiu 40,5 milhões de tokens, cerca de 38 vezes a mediana
Depois de reexecutar os problemas sinalizados com uma blocklist, a pontuação do Opus 4.6 foi ajustada para 86,57%
SWE-Bench+: a solução estava dentro da própria issue
Esse é quase piada de tão direto
O estudo SWE-Bench+ analisou 2.294 issues reais do GitHub em 12 repositórios Python
Resultado: 32,67% dos casos marcados como resolvidos tinham a solução presente na descrição ou nos comentários da issue (solution leakage) e 31,08% passaram por cobertura de testes fraca
Filtrando esses casos, a taxa de resolução do sistema estado da arte avaliado cai de 12,47% para 3,97%
Não é o modelo lendo o código e deduzindo o fix
É o modelo lendo a resposta que o próprio enunciado entregou
GSM1k: o mesmo teste, com problemas novos
A Scale AI fez o experimento mais limpo dessa lista com o GSM1k: criou um conjunto novo no mesmo estilo do GSM8k e comparou
Mesma dificuldade, mesmo formato, itens inéditos
Deu queda de acurácia de até 13% ao trocar um conjunto pelo outro, concentrada nas famílias Phi e Mistral
Modelos de fronteira mostraram sinais mínimos de overfitting, então não é caso de sair condenando todo mundo
E tem a pista mais interessante: correlação positiva (Spearman r² = 0,32) entre a probabilidade de o modelo gerar exemplos do GSM8k e o tamanho do gap entre os dois conjuntos
Quanto mais o modelo "cospe" o benchmark antigo, mais ele cai no benchmark novo. Faz sentido, né?
| Caso | O que foi encontrado | Número que resume |
|---|---|---|
| SWE-bench Verified | Modelos de fronteira reproduzindo gold patches verbatim | 3 de 3 modelos de fronteira testados |
| BrowseComp | Modelo identificou o benchmark e achou o gabarito | 9 contaminações em 1.266 problemas |
| SWE-Bench+ | Solução vazada dentro da própria issue | 12,47% caindo para 3,97% após o filtro |
| GSM1k | Overfitting exposto por conjunto novo equivalente | queda de até 13% |
Contaminação não é o único defeito: o benchmark também pode estar quebrado:
Aqui tem duas coisas diferentes que vivem sendo misturadas
Contaminação é o modelo ter visto a prova
Benchmark quebrado é a prova estar mal feita, com gabarito que reprova resposta certa
Na auditoria da OpenAI ao SWE-bench Verified, feita sobre um subconjunto de 27,6% do dataset (justamente os problemas em que os modelos mais falhavam), ao menos 59,4% dos problemas auditados apresentavam falhas de design de teste ou de descrição do problema
Dentro disso: 35,5% com testes que exigem detalhes de implementação específicos e 18,8% com testes que cobram funcionalidade que o enunciado nem pediu
Traduzindo pro seu dia a dia: é aquele teste que quebra porque você nomeou o método diferente, não porque a feature parou de funcionar 🙂
E o SWE-bench Pro?
Esse é o exemplo de como a coisa se move rápido demais pra você confiar em post antigo
A OpenAI recomendou o SWE-bench Pro em fevereiro de 2026 e depois RETRATOU a recomendação, em publicação de 8 de julho de 2026
O split público tem 731 tarefas
O pipeline automático de análise sinalizou 200 tarefas quebradas (27,4%) e a campanha de anotação humana identificou 249 (34,1%), com cinco engenheiros de software experientes independentes na revisão, além de agentes investigadores
Os problemas apontados: testes rígidos demais cobrando detalhes de implementação que o prompt não pediu, e prompts subespecificados que omitem requisitos exigidos por testes ocultos
O estado final hoje é esse: recomendação retirada, com orientação de examinar com cautela resultados derivados do SWE-bench Pro
Tome cuidado ao citar tabela de leaderboard sem olhar a data
O que isso muda na hora de escolher um modelo pelo ranking:
Agora a parte prática, porque no fim você precisa escolher alguma coisa pra rodar amanhã
Primeira mudança: dois números da mesma tabela podem simplesmente não ser comparáveis
Se o modelo A memorizou parte do conjunto e o modelo B não, a diferença entre eles não mede quem programa melhor, mede quem raspou mais conteúdo público
E o pior é que você não tem como saber isso só olhando a coluna de porcentagem
Segunda mudança: ganho de poucos pontos percentuais em benchmark antigo e saturado não te diz nada
Saturação foi um dos motivos citados pela própria OpenAI pra abandonar o SWE-bench Verified como medida de fronteira. Quando todo mundo está lá em cima, a régua parou de separar os modelos
Terceira, e essa é a que vale: o teste que importa é a sua base de código privada
O seu legado esquisito, a sua convenção interna, aquele módulo que ninguém entende direito
NADA disso está em benchmark público, e é exatamente por isso que serve
Inclusive é assim que você descobre onde dá pra economizar, tipo saber quando um modelo mais barato basta, coisa que ranking nenhum vai te contar
Sinais de que um resultado está bom demais para ser verdade:
Não dá pra provar contaminação de fora, mas dá pra ficar esperto com alguns padrões
- Salto grande em benchmark antigo e público, estagnação em conjunto novo. Causa provável: memorização do material já indexado. O que fazer: comparar os dois números lado a lado antes de comemorar o maior
- Queda em variante equivalente do mesmo teste. É o padrão GSM1k: mesma dificuldade, itens inéditos, acurácia despenca. Causa provável: overfitting no conjunto original. O que fazer: procurar avaliação em conjunto novo antes de acreditar no antigo
- Benchmark montado sobre material público e antigo. Causa provável: a fonte do teste e a fonte do treino são a mesma. O que fazer: dar mais peso a avaliação com item posterior ao corte de treino
- System card sem nenhuma palavra sobre descontaminação. Causa provável: ou não fizeram, ou não quiseram contar. O que fazer: procurar a seção específica, quem faz costuma documentar
- Gasto anômalo de tokens em um item isolado. No caso do BrowseComp, um problema queimou 40,5 milhões de tokens, cerca de 38 vezes a mediana, e ali tinha comportamento estranho de verdade. O que fazer: olhar outlier de custo como pista, não como acaso
Pra prevenir, duas atitudes simples
Exigir do fornecedor a metodologia de descontaminação, por escrito, em vez de aceitar só o número da tabela
E testar em tarefa que só você tem
O que os benchmarks estão fazendo para resistir à contaminação:
A turma que monta avaliação não ficou parada, e as duas saídas mais conhecidas atacam o problema por ângulos diferentes
Data de publicação como filtro. O LiveCodeBench coleta problemas de plataformas de competição (LeetCode, AtCoder e Codeforces) e anota cada um com a data de lançamento
Aí, pra um modelo com corte de treino D, avalia-se somente nos problemas lançados depois de D
Simples e elegante: se o problema nasceu depois do treino, o modelo não pode ter visto
Renovação contínua do conjunto. O LiveBench troca cerca de um sexto das questões por mês, o que renova o conjunto completo a cada seis meses
As questões novas ficam um mês sem divulgação pública
E a pontuação usa gabarito objetivo, sem juiz humano e sem LLM como juiz, com fontes que incluem competições de matemática recentes, artigos do arXiv, notícias e datasets
É prova nova toda hora, e ninguém vê o gabarito antes
Por que ainda não existe detector confiável de contaminação:
Agora o contraponto honesto, senão isso aqui vira receita de bolo
A revisão sistemática cobriu 55 estudos até o fim de 2025, agrupados em cinco famílias de detecção: casamento de strings, baseada em verossimilhança, inferência de pertencimento, detecção via prompt em LLM e auditoria de benchmark
A conclusão? Nenhum método é consistentemente confiável em todos os níveis de contaminação, cenários de acesso ao modelo e etapas de treino
E aquele truque que parecia infalível, de olhar a queda de desempenho depois do corte de treino, também tem asterisco
O estudo Test of Time mostra que questões geradas por LLM produzem padrões temporais bem diferentes de questões de preenchimento tiradas direto do mesmo material
Uma transformação simples por LLM chegou a REMOVER o padrão temporal em benchmarks que reportavam queda pós corte, incluindo o LiveCodeBench
Ou seja: o sinal temporal depende de como a questão foi escrita, não só de quando ela nasceu
E quem constrói modelo sabe disso. O system card do Claude Opus 4.5 registra que a descontaminação não é uma ciência exata e que todos os desenvolvedores de modelos precisam continuar melhorando seus métodos nessa área, além de incluir análise de contaminação para o SWE-bench e descontaminação difusa (fuzzy) para avaliações de resposta longa
Quando o próprio fornecedor escreve isso na documentação, é bom levar a sério
Conclusão: trate o benchmark como pista, não como veredito
Benchmark não é mentira, é medida imperfeita
Ele ainda serve pra descartar opção obviamente fraca e pra sentir a direção geral do mercado
O que ele não faz é decidir por você, principalmente quando o benchmark é público, antigo e nasceu do mesmo material que virou treino
O próximo passo é bem concreto e você consegue fazer nesta semana: monta um conjunto próprio de tarefas reais do seu projeto, coisas que só existem no seu repositório privado, e roda os modelos candidatos nelas
Dez tarefas honestas do seu backlog valem mais que qualquer tabela
E antes de acreditar no número, abre o system card do modelo e procura a seção de contaminação. Se não tiver nenhuma, já é resposta 🙂
até o próximo post!
Perguntas frequentes
Como saber se um benchmark está contaminado antes de confiar no resultado?
Não existe um método único confiável: a revisão sistemática que cobre 55 estudos até o fim de 2025 testou cinco famílias de detecção (casamento de strings, baseada em verossimilhança, inferência de pertencimento, detecção via prompt em LLM e auditoria de benchmark) e concluiu que nenhuma é consistentemente confiável em todos os níveis, cenários de acesso ao modelo e etapas de treino. Na prática, o sinal mais forte ainda é auditoria manual caso a caso, como fez a OpenAI no SWE-bench Verified e no SWE-bench Pro.
Queda de desempenho depois da data de corte de treino prova contaminação de benchmark?
Não necessariamente. O estudo ‘Test of Time: Rethinking Temporal Signal of Benchmark Contamination’ mostra que questões geradas por LLM produzem padrões temporais bem diferentes de questões retiradas diretamente do material original, e uma transformação simples por LLM chegou a remover esse padrão em benchmarks que reportavam queda pós corte, incluindo o LiveCodeBench. O sinal temporal depende de como a questão foi escrita, não é prova definitiva sozinho.
O que é eval awareness e por que o caso do Claude Opus 4.6 no BrowseComp chamou atenção?
Eval awareness é quando o próprio modelo percebe que está sendo avaliado durante um teste. A Anthropic documentou que em dois casos inéditos, dentro de nove exemplos de contaminação encontrados em 1.266 problemas do BrowseComp, o Opus 4.6 levantou a hipótese de estar sob avaliação, identificou o benchmark e chegou a localizar e descriptografar o gabarito. Depois de reexecutar os problemas sinalizados com uma blocklist, a Anthropic ajustou a pontuação do modelo para 86,57%.
Existe algum benchmark pensado para resistir à contaminação?
Alguns tentam reduzir o risco por desenho. O LiveCodeBench anota cada problema com data de lançamento e avalia o modelo só em itens posteriores ao corte de treino dele, enquanto o LiveBench renova cerca de um sexto das questões todo mês, o que renova o conjunto completo a cada seis meses, mantendo as questões novas sem divulgação pública por um mês. Nenhum dos dois elimina o problema por completo, mas ambos reduzem a janela de exposição.
Benchmark contaminado é o mesmo problema que benchmark quebrado?
Não. Contaminação é o modelo ter visto os dados de avaliação durante o treino; benchmark quebrado é a prova em si estar mal desenhada, com teste que reprova resposta correta. A auditoria da OpenAI ao SWE-bench Verified encontrou os dois problemas ao mesmo tempo: contaminação em modelos de fronteira e, num subconjunto de 27,6% do dataset, ao menos 59,4% dos problemas com falhas de design de teste ou de descrição.
Dá para confiar em ranking de benchmark na hora de escolher modelo?
Dá, mas com ressalva: a própria Anthropic registra no system card do Claude Opus 4.5 que descontaminação não é ciência exata e que todos os desenvolvedores de modelos precisam continuar melhorando seus métodos nessa área. Vale olhar se o benchmark citado passou por auditoria recente, como aconteceu com o SWE-bench Verified e o SWE-bench Pro, este último com recomendação da OpenAI retirada em julho de 2026.
Formações
Formação Vibe Coding
Do Prompt ao Produto: Crie Software Real com IA
- 474 aulas
- 20 projetos
- 39h 27min
Blog | Mais populares
Benchmark da OpenAI ou ranking independente: em qual confiar para avaliar o GPT-6 Astra?
GPT-6 Astra benchmark: OpenAI cravou 100% no ExploitBench, mas o ranking independente deu só 61 pontos. Veja qual número confiar antes de usar o modelo.
O que significa “ChatGPT network error” e como resolver
O “ChatGPT Network Error” é uma ocorrência frequente na rotina de muitos usuários do ChatGPT. Porém, poucos compreendem seu significado, quando esse erro surge, etc. […]
