🤔 TOON: Hype ou realmente eficiente?
Antes de mais nada, para quem não conhece o TOON é uma representação minimalista e estruturada, desenhada para eliminar as redundâncias do JSON, como a repetição constante de chaves, vírgulas, aspas e etc.
Observo muitos devs rechaçando esse formato, achando que a economia de tokens é irrelevante. Mas será que estamos esquecendo algo? A facilidade de 'digestão' dos dados pelo modelo também seria uns dos benefícios o que poderia levar a ganhos em performance.
A performance parece ser deixada de lado porque em serviços Pay-Per-Token a redução de custo parece irrelevante. Mas se estivermos falando de software altamente requisitado? E levando em consideração, a recente previsão de que a OpenAI terá um prejuízo de 27 bilhões em 2025, o que faz acreditar que a "bolha de IA" é uma possibilidade. Senário que pode elevar os custos significativamente.
Então resolvi fazer minha própria comparação entre formatos utilizando localmente modelos diversos com Ollama.
Dados e formatos
JSON
{
"squad": "Checkout",
"members": [
{ "name": "Alice", "role": "lead" },
{ "name": "Bob", "role": "dev" },
{ "name": "Carol", "role": "qa" }
]
}
TOON
|squad|members[name;role]|
Checkout;Alice;lead,Bob;dev,Carol;qa
Não há um exato formato padrão para toon bem definido quanto há para o json. Mas esse é o exemplo mais comum.
Prompt
As instruções necessárias que se somarão aos dados:
Analise os dados fornecidos e responda às perguntas abaixo.
PERGUNTAS:
1. Quem tem skills "ruby" e "python"?
2. Quem são os administradores?
3. Quem tem notificações ativadas (t/true/sim)?
4. Quem tem skill "Java"?
5. Quem usa o tema escuro?
FORMATO DE RESPOSTA OBRIGATÓRIO:
- Responda apenas com o número da pergunta seguido dos dados.
- Formato: "Nome <email›"
- Se ninguem for encontrado, responda "-"
- Um usuário por linha.
[dados formatados]
No prompt [dados formatados] é onde os dados (json ou toon) irão concatenados.
Testes
Para a medição utilizei a resposta do server Ollama:
{
"model": "mistral:latest",
"created_at": "2025-12-22T03:09:00.539772Z",
"response": "...",
"done": true,
"done_reason": "stop",
"context": ["..."],
"total_duration": 20554289250,
"load_duration": 11930875,
"prompt_eval_count": 328,
"prompt_eval_duration": 1090808834,
"eval_count": 91,
"eval_duration": 4868799538
}
Em nossas medidas estamos usando os dados de prompt_eval_count, prompt_eval_duration.
mistral:latest
| Formato | Custo (Tokens) | Classificação | Performance |
|---|---|---|---|
| toon | 1399 tk | ⭐⭐⭐⭐⭐ | ⏱ 7.56s ⚡ 185 t/s |
| json | 2576 tk | ⭐⭐⭐ | ⏱ 13.64s ⚡ 189 t/s |
| json_minified | 1543 tk | ⭐⭐⭐⭐⭐ | ⏱ 8.45s ⚡ 183 t/s |
deepseek-r1:7b
| Formato | Custo (Tokens) | Classificação | Performance |
|---|---|---|---|
| toon | 1213 tk | ⭐⭐⭐⭐ | ⏱ 10.16s ⚡ 119 t/s |
| json | 2063 tk | ⭐⭐⭐ | ⏱ 13.14s ⚡ 157 t/s |
| json_minified | 1284 tk | ⭐⭐⭐⭐⭐ | ⏱ 7.55s ⚡ 170 t/s |
openchat:7b
| Formato | Custo (Tokens) | Classificação | Performance |
|---|---|---|---|
| toon | 1412 tk | ⭐⭐⭐⭐⭐ | ⏱ 9.39s ⚡ 150 t/s |
| json | 2589 tk | ⭐⭐⭐ | ⏱ 18.19s ⚡ 142 t/s |
| json_minified | 1556 tk | ⭐⭐⭐⭐⭐ | ⏱ 10.16s ⚡ 153 t/s |
Como é possível ver em TOON e json minified a diferença é pequena. Mas ainda sim TOON tem em geral uma melhor performance. Então dentro de um senário de grande escala essa diferença pode significar ganho de performance e redução de custo de recurso.
Código no GitHub:
https://github.com/b0bd3v/llm-token-efficiency