Benchmark do Clef da Cloudflare contra o Jev em Batalha Naval: dois modelos novos, o mesmo empate

A 1 de outubro, a Cloudflare lançou o Clef, dois modelos de decisão da equipa de Workers AI. O Clef tem 27 mil milhões de parâmetros e o Clef-flash tem 9. Os dois seguem a mesma API "System One" do Jev da TypeSafe: envias um estado e umas perguntas tipadas, e recebes uma probabilidade para cada resposta permitida. A Cloudflare diz que a migração a partir do Jev é direta.
Uma semana antes eu tinha escrito que um modelo pequeno e dedicado devia ganhar a um modelo de fronteira atrás de um endpoint nas centenas de pequenos julgamentos de que os agentes precisam. O Clef é um segundo modelo dedicado, com pesos abertos, suporte para imagens e números de latência muito rápidos. Como a API é a mesma, o meu benchmark de Batalha Naval conseguia falar com ele quase sem mudanças, por isso corri-o.
Sessenta jogos por jogador, quatro corridas novas, 7,18 dólares no total.
Manter a comparação honesta
Todos os jogadores usaram os mesmos 60 tabuleiros da corrida de setembro, tirados da família mista para que nenhuma baseline jogue em casa. Verifiquei o emparelhamento em vez de o assumir: as frotas são idênticas byte a byte, tabuleiro a tabuleiro, por isso todas as comparações abaixo são emparelhadas, incluindo as que usam os números antigos do Jev e das baselines.
Os três modelos passaram pelo mesmo endpoint, a Decisions API da OpenRouter. Chegar ao Jev por um lado e ao Clef pela Workers AI teria medido duas redes e duas regiões, além de dois modelos, sem forma de perceber depois qual delas fez a diferença. Com um só endpoint, a única coisa que muda é o modelo.
Os jogadores são os mesmos dois de antes. O jogador pure recebe o tabuleiro em bruto e todas as casas por tentar como opções, cerca de 90 a meio do jogo. O jogador hybrid recebe uma lista curta de 16 casas que um solver de densidade já ordenou e descreveu por palavras.
O quadro
Menos é melhor. Dezassete tiros é um jogo perfeito, 100 é o pior que consegues fazer.
| Jogador | Média de tiros | Custo |
|---|---|---|
| Jev hybrid | 46,0 | $0,12 |
| Solver de densidade (código) | 48,3 | |
| Clef hybrid | 48,6 | $0,60 |
| Clef-flash hybrid | 49,9 | $0,23 |
| Caça / Perseguição (código) | 51,9 | |
| Clef pure | 76,2 | $2,95 |
| Jev pure | 85,5 | $0,65 |
| Clef-flash pure | 87,0 | $1,21 |
| Aleatório | 95,3 |
Com uma lista curta, tudo empata
Depois de o código ordenar as 16 melhores casas e as descrever, os três modelos ficam entre 46,0 e 49,9 tiros, e o solver de densidade fica nos 48,3, mesmo no meio deles. Nenhum modelo ganha ao solver. Nenhum modelo ganha a outro modelo.
O Clef contra o solver é o resultado mais renhido do projeto todo: 0,3 tiros de diferença em 60 tabuleiros, p = 0,85. Para resolver este empate seriam precisos cerca de 12.345 jogos. Os outros pares precisariam de algo entre 210 e 1.047.
Fiz 36 comparações, por isso o limiar corrigido para considerar alguma coisa significativa é 0,0014. O Jev a ganhar ao Clef-flash no jogador hybrid deu p = 0,030, o que passa a fasquia habitual dos 5% e mais nenhuma. Trato-o como empate.
Portanto a conclusão de setembro sobrevive a mais dois modelos e fica um pouco mais forte. A configuração em que um modelo parece bom é a mesma em que o código já fez o trabalho, e nessa configuração o modelo não acrescenta nada que eu consiga medir.
Num tabuleiro em bruto, o Clef é melhor
Este é o único sítio onde algum modelo se separa de outro. O jogador pure do Clef precisa de 76,2 tiros contra os 85,5 do Jev, uma diferença de 9,3 tiros com p = 0,0002, bem dentro do limiar corrigido. Também ganha ao Clef-flash por 10,8.
A razão era previsível antes de correr um único jogo. Escrevi um pequeno teste que envia um tabuleiro com 90 opções e olha para o que volta.
| Modelo | Casas decimais | Com valor, de 90 | Opção mais alta |
|---|---|---|---|
| Jev | 2 | 44,9 | 0,28 |
| Clef | 4 | 90,0 | 0,05 |
| Clef-flash | 4 | 90,0 | 0,05 |
O Jev devolve duas casas decimais. Em 90 opções, cerca de 45 voltam exatamente a zero e outras 33 empatam em 0,01, o que deixa uma ordem útil para mais ou menos uma dúzia de casas. O Clef devolve quatro casas decimais e ordena as noventa. O jogador pure é exatamente a tarefa onde isso conta. Com só 16 opções no jogador hybrid, as cerca de doze casas que o Jev consegue ordenar chegam bem e a vantagem desaparece.
E não ajuda muito. Com 76,2 tiros, o jogador pure do Clef continua 28 tiros atrás do solver de densidade e 24 atrás da heurística de caça e perseguição. Ser o melhor de três modelos numa tarefa em que os três perdem por muito para cem linhas de código simples não serve de base para construir nada.
Uma correção ao meu próprio artigo
Esse teste também apanhou um erro no que escrevi em setembro. Disse que só seis casas voltavam com algum valor e que quase toda a distribuição arredondava para zero. As duas coisas estavam erradas. O Jev mantém 0,996 da probabilidade, e cerca de 45 das 90 opções voltam com valor, medido em 6, 8 e 12 posições de tabuleiro, sempre com a mesma resposta.
O problema do arredondamento é que deixa dezenas de opções empatadas no fundo da lista, sem forma de as ordenar. O meu mapa de calor parecia vazio porque 0,01 quase não se vê na escala de cores, não porque os valores fossem zero. A conclusão de que o jogador pure do Jev tem muito pouco sinal útil continua de pé, mas o número e o mecanismo que dei para ela não, por isso corrigi o artigo original com uma nota datada.
Quanto é que cada modelo ouve o código
Voltei a correr todos os jogos hybrid, recalculei a ordem do solver em cada tiro e vi onde é que a escolha do modelo caía nessa ordem.
| Jogador hybrid | Posição média escolhida (de 16) | Escolhe a melhor casa | Média de tiros |
|---|---|---|---|
| Jev | 4,68 | 26,9% | 46,0 |
| Clef | 5,92 | 27,1% | 48,6 |
| Clef-flash | 6,54 | 20,0% | 49,9 |
| Acaso | 7,50 | 6,25% |
As colunas batem certo. Quanto mais um modelo se afasta da ordem do código, pior joga. Os três estão bem acima do acaso, por isso estão todos a ler a lista curta. Só que uns confiam mais nela do que outros.
Isso também explica porque é que o Clef é tão irregular. Tem a maior dispersão de todos os jogadores com modelo e três jogos acima dos 75 tiros, quando o Jev não tem nenhum. No pior, o tabuleiro 1031, o Clef precisou de 99 tiros e o Jev de 44. A escolha média do Clef foi 8,41 em 16, escolheu a pior casa do solver mais vezes do que a melhor, e 58 dos seus 99 tiros falharam enquanto uma casa com navio estava ali mesmo na lista curta. O código estava a fazer o seu trabalho e o modelo deitava-o fora.
O Clef-flash é o oposto: a menor dispersão de todos os jogadores com modelo, nenhum desastre, mas também nunca se destaca.
As minhas latências saíram ao contrário
O anúncio da Cloudflare indica latências medianas de 38,8 ms para o Clef-flash, 209,3 ms para o Clef e 524,1 ms para o Jev. Eu medi 40 chamadas intercaladas por modelo, da mesma máquina, pelo mesmo endpoint, de ponta a ponta e com a rede incluída.
| Modelo | 16 opções, mediana | 90 opções, mediana |
|---|---|---|
| Jev | 300 ms | 277 ms |
| Clef-flash | 350 ms | 425 ms |
| Clef | 524 ms | 713 ms |
O Jev foi o mais rápido nos dois tamanhos, e a mediana dele quase não mexeu quando o input cresceu de cerca de 760 para 2.300 tokens. A do Clef subiu um terço.
Não acho que algum dos dois conjuntos de números esteja errado. 38,8 ms mal dá para uma ida e volta a qualquer sítio, por isso os números da Cloudflare quase de certeza deixam a rede de fora. Os meus descrevem o caminho pela OpenRouter, o que os torna comparáveis entre si e com mais nada. Se estás a escolher entre estes modelos pela latência, mede a partir de onde o teu código corre de facto.
Custo
O output é grátis nos dois modelos Clef, por isso o custo depende só do input. O Clef cobra 0,240 dólares por milhão de tokens de input, 5,7 vezes os 0,042 dólares do Jev. As quatro corridas da tabela custaram 4,99 dólares, e as corridas descartadas, os testes e as verificações juntaram mais 2,19. A corrida pure do Clef custou 2,95 dólares para acabar 28 tiros atrás de um solver que não custa nada a correr.
O que a Batalha Naval não te diz sobre o Clef
Há coisas que o Clef faz em que este benchmark nunca toca.
Aceita imagens, até quatro por pedido, e o Jev só aceita texto. Se a tua decisão depende de uma captura de ecrã, de um documento digitalizado ou da fotografia de uma encomenda danificada, o Clef consegue vê-la e o Jev não. Das APIs de decisão que eu tinha visto antes do Clef, só a da OpenAI aceitava imagens, e essa continua em "limited preview".
Os pesos são abertos, com licença Apache 2.0 no Hugging Face. Podes correr o Clef no teu próprio hardware, o que conta se os dados sobre os quais decides não podem sair da tua rede. Correr o modelo nos teus próprios servidores também quer dizer que uma atualização silenciosa não te muda os resultados sem dares por isso. Pela API alojada, porém, o Clef não indica nenhuma versão, por isso não consigo associar estes números a uma build como consigo associar os do Jev à jev-1.13-20260917.
Nada disto aparece num jogo de Batalha Naval. É um benchmark só de texto, num jogo e numa família de tabuleiros, e não diz nada sobre como o Clef se porta no trabalho para que a Cloudflare o construiu, como triagem de suporte ou avaliação de conteúdo para trust and safety.
O que eu tiro disto
Entraram dois modelos novos no benchmark e o resultado principal não mexeu. Quando o código já montou uma boa lista curta, o modelo por cima empata com o código, seja ele qual for. Quando o modelo tem de fazer sozinho a parte difícil, o melhor dos três continua muito atrás de umas linhas de código simples.
O que vale a pena copiar é a forma como o teste foi montado, mais do que os números. Um só endpoint para todos os modelos, para a rede não ser uma variável escondida. Tabuleiros emparelhados, verificados em vez de assumidos. Um limiar de significância corrigido quando fazes dezenas de comparações. E um teste que verifica o mecanismo antes de correres os jogos, que no meu caso previu o único resultado real e apanhou o meu próprio erro de setembro.
Os resultados completos, incluindo tudo o que estes números não estabelecem, estão em results-clef.md. O código está em github.com/ickas/battleship-vs-jev, e os comandos para reproduzir todas as tabelas acima estão no fim desse ficheiro.