🤔 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