Meu Agente de IA Construiu uma Ferramenta de Benchmark para Meus Agentes de IA
- Categoria
- IA e LLM Local
- Publicado em
- 11 agosto 2026
- Atualizado em
- 19 agosto 2026
- Por
- Jacob Lloyd — escrito com ajuda de IA, depois do projeto
- Tempo de leitura
- 13 min de leitura
Em termos simples: Pedi ao meu agente de IA Hermes que construísse uma ferramenta de benchmark para meus LLMs locais. O resultado é o bench-llm: um CLI Python de 1.660 linhas que testa velocidade, raciocínio e aptidão para agente em qualquer modelo carregado no LM Studio. Roda com um único comando, gera JSON e uma tabela-resumo no terminal, e é grátis para baixar.
Meu agente de programação Hermes escreveu uma ferramenta de benchmark. Ela testa a velocidade, a inteligência e a aptidão para agente dos meus modelos locais — os mesmos modelos sobre os quais outros agentes de IA rodam — e gera JSON e uma tabela no terminal. A ferramenta tem 1.660 linhas de Python e se chama bench-llm — um agente de IA construiu uma ferramenta de benchmark para agentes de IA.
Atualização de 2026-08-19. O bench-llm foi a primeira versão. Ele cresceu até virar um benchmark multi-suíte (velocidade, codificação, uso de ferramentas, seguir instruções, raciocínio, escrita julgada) e depois virou o Gauntlet, uma reescrita completa com um nível difícil e GUI — o artigo está por vir. O script de arquivo único abaixo ainda funciona com o LM Studio e ainda é a forma mais rápida de obter um primeiro número. Duas correções ao post original: a tabela de resultados agora mostra execuções reais das suítes sucessoras na minha máquina de GPU (a tabela original não era reproduzível e foi removida), e o script precisa de duas dependências, não uma (veja Configuração).
Em resumo
- O que é: um CLI Python de 1.660 linhas que avalia qualquer modelo local carregado no LM Studio em três dimensões: Velocidade (TTFT, tokens/seg), Capacidade (codificação, lógica, JSON, sumarização) e Aptidão para agente (reconhecimento de tarefas, adesão a formato, concisão).
- Quanto custa: nada. Download grátis.
- O que você precisa: Python 3.8+,
pip install openai requestse o LM Studio rodando com modelos carregados. - Com o que você fica: um arquivo JSON em
~/benchmarks/, uma tabela-resumo no terminal e um panorama claro de quais dos seus modelos conseguem fazer o trabalho de verdade — não apenas qual gera texto mais rápido. - Quem construiu: o Hermes, meu agente de programação. Eu pedi, ele codificou, nós iteramos; o processo inteiro levou uma tarde.
Com o que você fica
Um único comando contra um modelo gera este formato de saída no seu terminal (execução de exemplo):
$ bench-llm gemma-4-31b-it
============================================================
bench-llm — Benchmarking: gemma-4-31b-it
GGUF Status: READY
GGUF Path: ~/.lmstudio/models/google/gemma-4-31b-it-Q4_K_M.gguf
GGUF Size: 16.5 GB
Arch: gemma4
Quant: Q4_K_M
============================================================
🔥 Warming up model... OK (0.23s TTFT)
⚡ SPEED BENCHMARKS
----------------------------------------
short_50 (131 chars, 3 runs)...
TPS: mean=84.2 median=83.8
TTFT: mean=0.231s median=0.228s
medium_200 (323 chars, 3 runs)...
TPS: mean=85.7 median=85.2
TTFT: mean=0.312s median=0.308s
long_800 (769 chars, 3 runs)...
TPS: mean=82.1 median=81.5
TTFT: mean=0.541s median=0.537s
🔍 Validating speed plausibility...
Confidence: HIGH
🧠 ABILITY TESTS
----------------------------------------
Running: Code Generation (median_of_list)... PASS
Running: Logic Puzzle (Pet Ownership)... PASS
Running: JSON Compliance... PASS
Running: Instruction Following... PASS
Running: Summarization (Key Facts)... FAIL
Ability Score: 4/5
🤖 AGENT FITNESS TESTS
----------------------------------------
Running: Task Acknowledgment... PASS
Running: Format Adherence... PASS
Running: Conciseness (Output/Input Ratio)... PASS
Agent Fitness Score: 3/3
📄 Results saved: ~/benchmarks/gemma-4-31b-it-2026-08-11.json
================================================================================
BENCHMARK RESULTS: gemma-4-31b-it
================================================================================
📊 SUMMARY TABLE
──────────────────────────────────────────────────────────────────────
Model ID gemma-4-31b-it
GGUF Size 16.5 GB
Architecture gemma4
Quantization Q4_K_M
T/s (short, mean) 84.2
TTFT (short, mean) 0.231s
Ability Score 4/5 (80.0%)
Agent Fitness Score 3/3 (100.0%)
Confidence 🟢 HIGH
──────────────────────────────────────────────────────────────────────
Ele também grava um payload JSON completo em ~/benchmarks/ com todas as medições brutas, cada resposta de teste e um resumo estruturado — para você poder realimentar os resultados no seu agente e perguntar "quais dos meus modelos deveriam cuidar do trabalho pesado com JSON?".
O que ele testa
Três dimensões, cada uma escolhida porque importa para uma pilha de agentes sempre ligada.
⚡ Velocidade
Três tamanhos de prompt — curto (~50 caracteres, "explique o que é uma variável"), médio (~200 caracteres, "explique recursão") e longo (~800 caracteres, "compare três paradigmas de programação") — com três execuções de aquecimento seguidas das medições reais.
O que é medido:
- TTFT (Time To First Token) — quanto tempo até o modelo começar a digitar. Crítico para a UX de chat; qualquer coisa acima de 500ms parece lento.
- Throughput (tokens/seg) — a rapidez com que ele gera depois de começar. Importa para blocos de código longos e relatórios.
- T/s de prefill — a rapidez com que ele processa o prompt de entrada antes de gerar. Um custo oculto, mas real.
Ele também roda uma verificação de plausibilidade contra limites de hardware conhecidos. Se o seu modelo de 30 GB afirma 200 T/s em uma 7900 XTX, o bench-llm sinaliza — esse número provavelmente está contaminado por decodificação especulativa ou cache pré-aquecido.
🧠 Capacidade
Cinco testes que são triviais para um modelo competente e um delator definitivo para um que está sofrendo:
- Geração de código — Escreva
median_of_list(numbers)com casos de borda (lista vazia, comprimento par, comprimento ímpar, não mutar a entrada). A função é executada dentro do bench-llm contra seis casos de teste — não é correspondência de padrões contra o texto da resposta, é código realmente rodando. - Quebra-cabeça lógico — Um quebra-cabeça de posse de quatro animais de estimação (Alice/peixe, Bob/pássaro, Carol/gato, Dan/cachorro). Uma regex extrai as atribuições da resposta e verifica as quatro.
- Conformidade com JSON — "Retorne um objeto JSON com exatamente estas chaves." Testa se o modelo consegue produzir JSON válido e conforme ao esquema sob demanda — o mínimo absoluto para chamada de ferramentas.
- Seguir instruções — Escreva os números de 1 a 10, marque os pares com *, some-os. Testa adesão precisa a formato: a resposta é trivial, o formato é o ponto principal.
- Sumarização — Um parágrafo denso sobre computação quântica baseada em hélio. Verifica se seis fatos técnicos importantes sobreviveram à compressão. A maioria dos modelos perde pelo menos um.
🤖 Aptidão para agente
É aqui que o bench-llm faz algo que não vi em outras ferramentas de benchmark. Ele envia ao modelo uma tarefa de agente real — buscar linhas ERROR no syslog, agrupar por serviço, produzir um relatório JSON — e avalia a resposta como um supervisor de agentes avaliaria:
- Reconhecimento de tarefas — O modelo entende o que foi pedido? Ele consegue esboçar uma abordagem e identificar bloqueios? (Um modelo que sai alucinando entradas de syslog falha aqui.)
- Adesão a formato — A saída corresponde ao esquema JSON solicitado? Verifica o array
services, o inteirototal_errorse a stringscan_period. - Concisão — Qual é a proporção saída/entrada? Modelos que respondem a um prompt de 1.300 caracteres com 20.000 caracteres de divagação são sinalizados como VERBOSE. Um agente que não consegue ser conciso queima sua janela de contexto a cada turno.
Os três testes de aptidão para agente compartilham o mesmo prompt — eles avaliam aspectos diferentes da mesma resposta. Isso mantém o benchmark rápido enquanto mede as qualidades que importam quando um modelo roda sem supervisão.
Como foi construído
O Hermes — o agente de programação da minha máquina — escreveu tudo. Eu dei uma especificação aproximada: "Preciso de uma ferramenta que avalie modelos locais no LM Studio, teste velocidade e inteligência, e gere JSON e uma tabela." Ele foi, voltou com um script funcional, e iteramos.
O processo foi:
- Primeira versão: apenas testes de velocidade — conectar à API compatível com OpenAI do LM Studio, fazer streaming de tokens, medir TTFT e T/s.
- Segunda versão: testes de capacidade — codificação (com execução real), quebra-cabeças lógicos, conformidade com esquema JSON, seguir instruções, sumarização.
- Terceira versão: aptidão para agente — a tarefa de syslog, avaliação da resposta como se o modelo fosse um agente da minha pilha.
- Passadas de polimento: resolução de arquivos GGUF (encontrar o arquivo real do modelo no disco, reportar tamanho e quantização), validação de plausibilidade de velocidade, a tabela-resumo, o modo
--quick, o--listpara descoberta de modelos e o comando de pré-verificação--check.
Todas as quatro iterações aconteceram em uma única tarde. O script final tem 1.660 linhas. Cada linha foi escrita pelo Hermes — eu revisei, testei em modelos reais, apontei problemas ("esse número de throughput não pode estar certo para um modelo de 123B"), e ele corrigiu. O validador de plausibilidade nasceu exatamente desse tipo de ciclo de feedback.
Decisões de design que ficaram
- Streaming, não polling. O bench-llm usa streaming compatível com OpenAI para obter o timing por token. Uma abordagem de polling borraria a medição de TTFT e perderia a granularidade no nível do token.
- Execução real de código no teste de codificação. Ele não pergunta "isso parece uma função de mediana?" — ele faz
exec()do código em um namespace novo e roda seis casos de teste; saída que parece confiante mas não roda, falha. - Extração de respostas com regex para os testes de lógica/JSON. Benchmarks que exigem formato preciso falham duramente com modelos que acrescentam "Claro! Aqui está sua resposta:" antes da saída real. Os verificadores do bench-llm extraem o payload de qualquer invólucro que o modelo coloque ao redor — testando o conteúdo do modelo, não sua verbosidade.
- Limpeza de VRAM entre benchmarks. Ele executa
pkill -f llama-servere espera o LM Studio mostrar zero modelos carregados antes de cada execução. Sem isso, o cache KV de um modelo anterior pode contaminar a medição de TTFT do benchmark seguinte. - Resolução de arquivos GGUF. Ele mapeia os IDs de modelo do LM Studio de volta aos arquivos GGUF reais no disco usando correspondência difusa por nome do publicador e arquitetura. Isso dá o tamanho do modelo, a quantização e se o arquivo sequer existe — respondendo "este modelo está realmente pronto para benchmark?" antes de desperdiçar uma execução.
Configuração
Três passos:
# 1. Install the two dependencies (requests talks to LM Studio's model-metadata
# endpoint — without it every model shows as "not found")
pip install openai requests
# 2. Make sure LM Studio is running with at least one model loaded
# (it should be listening on localhost:1234 — that's the default)
# 3. Run it
./bench-llm --list # see what's available
./bench-llm gemma-4-31b-it --quick # smoke test
./bench-llm gemma-4-31b-it # full benchmark
Sem arquivos de configuração, sem chaves de API (o LM Studio aceita qualquer string), sem banco de dados. Os resultados caem em ~/benchmarks/.
Opcional, mas útil: copie o bench-llm para o seu PATH para poder rodá-lo de qualquer lugar.
cp bench-llm ~/bin/
chmod +x ~/bin/bench-llm
Resultados reais: modelos base na minha máquina e no meu notebook
Os números abaixo vêm das suítes sucessoras (mesmo método de velocidade, conjunto de testes mais amplo) e cobrem apenas modelos base — sem fine-tunes da comunidade. "Máquina" é um box GPU headless, 2× RTX 5090 + 2× RTX 3090; "APU" é a GPU integrada deste notebook. Velocidade só é comparável dentro de um mesmo dispositivo. A ressalva das próprias suítes se aplica: as transcrições abrangem algumas revisões, então leia pequenas diferenças como ruído.
Velocidade + aptidão para agente (suíte bench, relatório de 2026-08-18 — Code / Tools / Instruct / Reason são taxas de aprovação):
| Modelo | Dispositivo | Gen tok/s | TTFT | Code | Tools | Instruct | Reason |
|---|---|---|---|---|---|---|---|
| Gemma 4 26B-A4B (QAT, Q4) | máquina | 229.0 | 110 ms | 88% | 100% | 50% | 95% |
| Nemotron 3 Nano 4B (Q8) | APU | 18.5 | 175 ms | 92% | 70% | 94% | 95% |
| Gemma 4 12B | APU | 10.1 | 633 ms | — | — | — | — |
Nível difícil (Gauntlet, 2026-08-19 — taxa de aprovação sobre os casos só-difíceis; "—" = categoria não executada para aquele modelo):
| Modelo | Onde | Difícil % | Code | Math | Tools | Instruct | Reason | Long-ctx |
|---|---|---|---|---|---|---|---|---|
| DeepSeek V4-Flash (referência na nuvem) | API | 95% (110/116) | 95% | 82% | 100% | 100% | 100% | 90% |
| Qwen3.8 27B (Q5) | máquina | 74% (23/31) | 74% | — | — | — | — | — |
| Qwen2.5 1.5B | máquina | 36% (80/225) | 32% | 9% | 59% | 18% | 16% | 74% |
| SmolVLM 256M | máquina | 4% (8/194) | 0% | 0% | 6% | 0% | 9% | 14% |
O que eu tiro disso: o MoE Gemma 4 26B (4B ativos) é o cavalo de batalha diário da máquina — 229 T/s, TTFT de 110ms, chamadas de ferramenta perfeitas — e sua coluna fraca é seguir instruções, que é exatamente no que um loop de agente não supervisionado se apoia. O Nemotron de 4B é a surpresa: em uma APU de notebook ele segue instruções melhor do que o 26B na máquina, só que cinco vezes mais devagar (18.5 T/s na APU vs 229 na máquina). No nível difícil, o Qwen3.8 27B base chega a 74% em codificação, as linhas de 1.5B e 256M mostram como é "pequeno demais para trabalho de agente", e a linha do V4-Flash na nuvem é o teto que os modelos locais perseguem — a $0.088 por toda a execução difícil.
O que o torna diferente
Existem muitos benchmarks de LLM. A maioria são conjuntos de quebra-cabeças acadêmicos (MMLU) ou trivia otimizada para leaderboards. O bench-llm faz três coisas que importam para alguém que realmente executa modelos locais:
- Testa qualidades de agente, não qualidades de chatbot. Adesão a formato, reconhecimento de tarefas e concisão são o que faz ou quebra um modelo em um loop de agente não supervisionado. Um modelo ótimo em conversa, mas incapaz de seguir um esquema JSON, é inútil em um fluxo de trabalho de chamada de ferramentas.
- Valida as próprias medições. O verificador de plausibilidade detecta números que não podem estar certos — contaminação por decodificação especulativa, caches pré-aquecidos, bugs de medição. Se uma ferramenta de benchmark não consegue te dizer quando a própria saída é lixo, você não pode confiar em nada dela.
- É um único script. Sem Docker, sem banco de dados, sem dependências de driver de GPU, sem download de dataset de 50 GB. Um arquivo Python, um pip install, e funciona contra o que você tiver carregado no LM Studio agora.
Armadilhas
- O LM Studio precisa estar rodando primeiro. O bench-llm não inicia o LM Studio para você — ele se conecta a localhost:1234. Se não houver nada escutando, ele falha com um erro claro.
- A limpeza de VRAM é agressiva. Ele executa
pkill llama-serverentre os benchmarks para limpar o cache KV. Se você tem outros processos llama-server que quer manter vivos, não rode o bench-llm — ou modifique o passo de limpeza. - A sumarização é o teste mais difícil. Quase todo modelo que testei perde pelo menos um fato importante. Se um modelo marca 4/5 com a sumarização como única falha, esse é um resultado forte — não leia como deficiência.
- Modelos de raciocínio têm TTFT mais lento. Modelos pensantes gastam tempo em uma fase de raciocínio antes de produzir saída. O bench-llm mede o TTFT a partir do primeiro token de qualquer tipo — incluindo tokens de raciocínio. Isso faz os modelos de raciocínio parecerem mais lentos do que parecem na prática, porque os tokens de pensamento fluem durante o que de outra forma seria tempo morto. A saída JSON separa o TTFT em
ttft_reasoning_settft_content_spara você ver a divisão. - O teste de codificação faz
exec()da saída do modelo. Ele roda em um namespace novo com funções de teste puras — não é um sandbox real, então execute como um usuário que não tem nada a perder — mas se a ideia de rodar código gerado por LLM te incomoda, pule os testes de capacidade com--speed-only. - Muitos modelos demoram. Um benchmark completo em um modelo leva de 2 a 5 minutos dependendo da velocidade; algumas dúzias é uma noite inteira. Use
--quickpara comparações e guarde a suíte completa para seus principais candidatos.
Download
O bench-llm é um único script Python mais um README. Sem etapa de build, sem assistente de instalação — descompacte e rode.
O zip inclui:
bench-llm— o script de benchmark de 1.660 linhasREADME.md— instruções condensadas de configuração e uso
Os dois arquivos foram escritos pelo Hermes, meu agente de programação. Licença MIT — use, modifique, envie no seu próprio toolchain. Dependências: openai e requests.
Relacionados: Quanto Meus Agentes de IA Realmente Custam (por que a velocidade local importa), Reasonix e DeepSeek Harness (os agentes de programação que esses modelos sustentam), e a stack local de agentes em que rodam.
Downloads
- Baixar bench-llm (zip) 18 KB
Gratuito para uso pessoal. Se isso te economizar uma tarde, o botão do café está logo ali.