
Привет! Меня зовут Андрей, я фронтенд-разработчик в Cloud.ru. Я работаю с LLM API каждый день. И каждый день отправляю в контекст структурированные данные: списки товаров, логи, пользователей, метрики. Все это — JSON. И все это — деньги.
В какой-то момент я посчитал, сколько токенов из моего промпта уходит на фигурные скобки, кавычки и повторяющиеся ключи. Оказалось — много. Слишком много.
Потом я попробовал TOON. Вот что из этого вышло.
Проблема: JSON — щедрый формат
Возьмем типичный кейс. Вы строите RAG-систему или ИИ-ассистента, который анализирует данные. В промпт подтягивается список из 50 записей. Вот как выглядит одна запись в JSON:
{"id": 2001, "timestamp": "2025-11-18T08:14:23Z", "level": "error", "service": "auth-api", "ip": "172.16.4.21", "message": "Auth failed for user", "code": "AUTH_401"}
Теперь умножьте на 50. Каждая запись повторяет 7 ключей: "id", "timestamp", "level", "service", "ip", "message", "code". Плюс кавычки вокруг каждого ключа и строкового значения. Плюс фигурные скобки. Плюс запятые. На 50 записях это ~350 лишних повторений ключей и сотни символов синтаксического мусора. Модели все это токенизируют. Вы за все это платите.
Решение: TOON за 30 секунд
TOON (Token-Oriented Object Notation) — формат, который кодирует те же данные с той же структурой, но без повторений. Ключи объявляются один раз в заголовке, дальше — только значения:
logs[3]{id,timestamp,level,service,ip,message,code}: 2001,2025-11-18T08:14:23Z,error,auth-api,172.16.4.21,Auth failed for user,AUTH_401 2002,2025-11-18T08:14:24Z,warn,payment,172.16.4.22,Timeout on payment gateway,PAY_TIMEOUT 2003,2025-11-18T08:14:25Z,info,user-svc,172.16.4.23,User profile updated,USR_200
Заголовок logs[3]{id,timestamp,level,service,ip,message,code}: говорит: массив из трех элементов, поля — такие-то. Все. Дальше строки с данными через запятую. Никаких кавычек вокруг ключей, никаких {} на каждый объект, никакого дублирования.
Для обычных объектов — синтаксис как в YAML:
name: Alice age: 30 role: admin settings: theme: dark lang: ru
Конвертация JSON -> TOON -> JSON — без потерь, 1:1. Это не другая модель данных, это другая запись той же модели.
Считаем токены: реальный тест
Я взял датасет из 50 лог-записей (7 полей каждая) и прогнал через токенизатор. Вот код:
Python:
import json import toon_format # pip install toon-format import tiktoken enc = tiktoken.encoding_for_model("gpt-4o") with open("logs.json") as f: data = json.load(f) json_str = json.dumps(data, indent=2) json_compact = json.dumps(data) toon_str = toon_format.encode(data) print(f"JSON (formatted): {len(enc.encode(json_str))} токенов") print(f"JSON (compact): {len(enc.encode(json_compact))} токенов") print(f"TOON: {len(enc.encode(toon_str))} токенов")
TypeScript:
import { encode as toToon } from "@toon-format/toon"; import { encode as tokenize } from "gpt-3-encoder"; import fs from "fs"; const data = JSON.parse(fs.readFileSync("./logs.json", "utf8")); const jsonFormatted = JSON.stringify(data, null, 2); const jsonCompact = JSON.stringify(data); const toonStr = toToon(data); console.log(JSON (formatted): ${tokenize(jsonFormatted).length} токенов); console.log(JSON (compact): ${tokenize(jsonCompact).length} токенов); console.log(TOON: ${tokenize(toonStr).length} токенов);
Результат на реальных данных (из бенчмарков TOON):
Формат |
Токены |
Экономия vs JSON |
JSON (formatted) |
379 |
— |
JSON (compact) |
236 |
-37.7% |
TOON |
150 |
-60.4% |
60% экономии. На одном промпте. Не гипотетически — замерено токенизатором.
Считаем деньги: сколько вы переплачиваете
Теперь самое интересное. Актуальные цены API (апрель 2026):
Модель |
Input (за 1 млн токенов) |
Output (за 1 млн токенов) |
GPT-4o |
$2.50 |
$10.00 |
GPT-4.1 |
$2.00 |
$8.00 |
Claude Sonnet 4.6 |
$3.00 |
$15.00 |
Claude Opus 4.6 |
$5.00 |
$25.00 |
Допустим, вы делаете 10 000 запросов в день, в каждом — массив из 100 объектов (типичный RAG/аналитика). Считаем для GPT-4o:
JSON |
TOON |
Разница |
|
Токенов на запрос |
~3,200 |
~1,850 |
-42% |
Токенов в день |
32 млн |
18.5 млн |
-13.5 млн |
Стоимость в день |
$80 |
$46.25 |
-$33.75 |
В месяц |
$2,400 |
$1,387 |
-$1,013 |
В год |
$28,800 |
$16,650 |
-$12,150 |
На Claude Opus 4.6 (input $5/1 млн) экономия еще ощутимее:
JSON |
TOON |
Разница |
|
В месяц |
$4,800 |
$2,775 |
-$2,025 |
В год |
$57,600 |
$33,300 |
-$24,300 |
$12 000-24 000 в год — только на input-токенах, только на одном эндпоинте. Если у вас несколько пайплайнов — умножайте.
Интеграция: 5 минут, 4 строки кода
Вам не нужно переписывать архитектуру. TOON подключается как прослойка перед отправкой в API:
Python + OpenAI:
import openai import json import toon_format def analyze_with_llm(data: list[dict]) -> str: toon_str = toon_format.encode({"records": data}) # JSON -> TOON response = openai.chat.completions.create( model="gpt-4o", messages=[{ "role": "user", "content": f"Проанализируй эти данные и найди аномалии:\n\n{toon_str}" }] ) return response.choices[0].message.content
TypeScript + Anthropic:
import Anthropic from "@anthropic-ai/sdk"; import { encode as toToon } from "@toon-format/toon"; async function analyzeData(records: any[]) { const toonData = toToon({ records }); const response = await anthropic.messages.create({ model: "claude-sonnet-4-6-20250514", max_tokens: 1024, messages: [{ role: "user", content: Проанализируй эти данные и найди аномалии:\n\n${toonData} }] }); return response.content[0].text; }
Одна строка toon_format.encode() — и вы экономите 40-60% токенов. Модель отвечает в обычном формате, ничего на выходе менять не нужно.
Большое сравнение: TOON vs все остальные
Ни один формат не идеален для всех случаев. Вот честная таблица:
Критерий |
JSON |
JSON compact |
YAML |
CSV |
TOON |
TRON |
Токены (табличные данные) |
100% |
~63% |
~72% |
~38% |
~40% |
~55% |
Токены (вложенные данные) |
100% |
~78% |
~85% |
н/п |
~67% |
~75% |
Точность LLM |
75.0% |
73.7% |
74.5% |
~72% |
76.4% |
— |
Вложенные структуры |
отлично |
отлично |
хорошо |
нет |
средне |
хорошо |
Совместимость с пайплайнами |
везде |
везде |
широко |
широко |
нужен SDK |
JSON-совместим |
Знакомство LLM (training data) |
огромное |
огромное |
большое |
большое |
минимальное |
минимальное |
Lossless round-trip с JSON |
да |
да |
с нюансами |
нет |
да |
да |
Ключевые выводы
TOON vs CSV: CSV компактнее на ~5-6% для плоских таблиц, но не поддерживает вложенность и типы. TOON добавляет минимальный overhead, но модель точнее парсит данные.
TOON vs YAML: TOON экономит 48% токенов на табличных данных. YAML лучше на конфигах с глубокой вложенностью.
TOON vs JSON compact: даже минифицированный JSON проигрывает TOON 35% на таблицах. На вложенных — разрыв меньше (~15%).
TOON vs TRON: TRON — JSON-совместимый (можно парсить обычным JSON-парсером). TOON компактнее, но требует отдельный парсер. Выбирайте TRON, если не хотите менять тулчейн.
Когда TOON — правильный выбор (и когда нет)
Используйте TOON, когда:
Массивы однородных объектов — списки пользователей, товаров, логов, метрик. Экономия 40-60%.
RAG-пайплайны — в контекст подтягиваются десятки документов с одинаковой структурой.
Batch-обработка — тысячи запросов в день, каждый процент экономии = реальные деньги.
Длинные контексты — когда данные не влезают в контекстное окно, а уменьшить их объем — критично.
НЕ используйте TOON, когда:
Глубоко вложенные структуры (4+ уровней). Точность LLM падает до 43% на nested-данных. JSON надежнее.
Данные идут не в LLM, а в обычный сервис. TOON — формат для промптов, не для REST API и баз данных.
Плоская таблица без вложенности. CSV на 5-6% компактнее и не требует SDK.
Нужна JSON Schema валидация. TOON — другой синтаксис, существующие валидаторы не подойдут.
Экосистема: что уже работает
Язык |
Пакет |
Статус |
TypeScript |
|
Основная реализация |
Python |
|
Стабильно |
Go |
|
В разработке |
Rust |
|
В разработке |
.NET |
|
В разработке |
CLI |
|
Работает |
Быстрый старт:
# TypeScript npm install @toon-format/toon # Python pip install toon-format # Конвертация файла через CLI npx @toon-format/cli data.json -o data.toon npx @toon-format/cli data.toon -o data.json # и обратно
Спецификация открыта, ABNF-грамматика задокументирована, тестовые фикстуры доступны: toon-format/spec.
Итог
TOON — не замена JSON. JSON останется стандартом для API, конфигов и хранения. Но если вы передаете структурированные данные в LLM — вы буквально выбрасываете деньги на синтаксический мусор.
Четыре строки кода. Пять минут интеграции. Минус 40-60% токенов. Минус $12 000-24 000 в год на средней нагрузке. Попробуйте на одном эндпоинте. Замерьте. Посчитайте. Ваш бюджет на API скажет спасибо. Или хотя бы перестанет тихо всхлипывать по ночам.
Если было полезно — я пишу о фронтенде, ИИ и подобных практических штуках в блоге и Telegram-канале. Заходите, буду рад.
Ссылки:
Комментарии (15)

arch1lochus
08.04.2026 17:07неясно, для чего вообще фронтенд-разработчику на постоянной основе скармливать в LLM большие объемы логов, пользовательских данных (oops!). У разрабов Cloud.ru KPI на трату токенов? :)

ramiil
08.04.2026 17:07Ну, для начала надо минимизировать json, что удалит лишние токены на табы/пробелы.

starfair
08.04.2026 17:07Грамотно написанный агент и так это сделает в фоновом режиме. Но как верно написано, такого рода мнимизация не избавит от дублирования описания полей, в регулярных структурах. Правда, сомнительно мне, что таковые часто встречаются в промптах, разве что в весьма специфичных .

whoisfedos Автор
08.04.2026 17:07мы все равно сталкиваемся с дополнительным этапом трансформации, лишних символов конечно станет меньше

SunRiseX64
08.04.2026 17:07Что-то я не понял зачем использовать toon, если то же самое можно записать в формате csv с первой заголовочной строкой

alterbred
08.04.2026 17:07почему-то вспомнились Fortran, пачки перфокарт и проблемы изменений в данных...

Politura
08.04.2026 17:07Используйте TOON, когда:
Массивы однородных объектов — списки пользователей, товаров, логов, метрик. Экономия 40-60%.
...
НЕ используйте TOON, когда:
Плоская таблица без вложенности. CSV на 5-6% компактнее и не требует SDK.
А в чем разница-то?
`` logs[3]{id,timestamp,level,service,ip,message,code}: 2001,2025-11-18T08:14:23Z,error,auth-api,172.16.4.21,Auth failed for user,AUTH_401 2002,2025-11-18T08:14:24Z,warn,payment,172.16.4.22,Timeout on payment gateway,PAY_TIMEOUT 2003,2025-11-18T08:14:25Z,info,user-svc,172.16.4.23,User profile updated,USR_200 ``Это как-раз и есть CSV - Comma Separated Values. Только в заголовок фигурные скобочки зафигачили, да счетчик записей, вот и все отличие.

Gromilo
08.04.2026 17:07Видимо пример не очень удачный. Потому что TOON должен уметь всё то же самое, что и JSON, а значит вложенные объекты. У CSV с этим плохо.
Но я тоже не понимаю, как это должно выглядеть

vagon333
08.04.2026 17:07@whoisfedos,
Прежде всего, благодарю за отличную идею, спернул в свои реализации.Далее вопросы по использованию:
Нужно ли в промпте инструктировать, что данные в формате TOON?
Есть ли смысл запрашивать ответ в формате TOON, как сейчас есть возможность запрашивать результаты в JSON формате и тем самым получать структурированные данные в ответе, что дает возможность передавать дальше по цепочке без парсинга.

whoisfedos Автор
08.04.2026 17:07Я думаю, что не все модели натасканы на информацию об этом формате, поэтому наверное лишний раз надо нейронке подсветить
За output токены мы тоже платим, а следовательно чем меньше символов на выходе => тем дешевле. Если строить весь пайплайн на формате toon, то есть смысл явно указывать нейронке чтобы отдавала toon формат. Если конечная конечный потребитель все таки принимает только json, то можно сделать просто хук в конце для нейронки (или даже просто скрипт) чтобы форматировалось все в json
x89377
cloud.ru ? Серьёзно ?