Зачем вообще менять JSON? Он же стандарт
Стандарт — это гвоздь, которым прибивают к полу. JSON удобен для машин, для API, для людей. Но для LLM он — чёрная дыра токенов. Каждая кавычка, каждая запятая, каждая пара фигурных скобок — это токен. А токены — это деньги. В 2026 году цена вызова GPT-4o (128k контекст) до сих пор кусается, а Llama 4 локально жрёт VRAM как не в себя. Если вы строите RAG-пайплайн или кормите модель структурированными данными из базы, половина контекста уходит на синтаксис. Мы уже обсуждали ISON — альтернативу, которая режет токены на 70%. Но ISON — не единственный претендент. Сегодня зажжём TOON и TRON. Два формата, созданных под LLM, с разным подходом и разной экономией. Кто кого? Разбираемся с цифрами и кодом.
Сразу предупреждение: ни TOON, ни TRON не заменят JSON в вашем бэкенде. Это форматы для коммуникации с моделью. На выходе вам всё равно придётся конвертировать ответ обратно в JSON или другой машиночитаемый формат. Просто чтобы вы не кинули PR в прод с TOON-эндпоинтом.
TOON — дерево без лишних веток
TOON (Tree Object Notation) — формат, который представляет данные как плоское дерево с минимальным синтаксисом. Вдохновлён YAML, но без отступов и двоеточий. Ключи отделяются от значений символом =, вложенность задаётся точками или слешами. Никаких скобок, кавычек, запятых.
Пример: JSON-объект с пользователем:
{
"user": {
"id": 1,
"name": "Анна",
"contacts": {
"email": "anna@example.com",
"phone": "+7-900-123-45-67"
},
"roles": ["admin", "editor"]
}
}Тот же набор в TOON:
user.id = 1
user.name = Анна
user.contacts.email = anna@example.com
user.contacts.phone = +7-900-123-45-67
user.roles = [admin, editor]Видите? Нет фигурных скобок, нет кавычек, нет лишних отступов. TOON использует однострочные определения для каждого листа дерева. Массивы — в квадратных скобках, но без кавычек вокруг строк. LLM это парсит как чёрный ящик: модель видит чёткую структуру ключ-значение, и важно — она не тратит токены на дублирование ключей в каждом вложенном объекте.
TRON — таблица с вырезанным жиром
TRON (Tabular Reduced Object Notation) — это эволюция ISON, но с фокусом на массивы объектов. Если у вас список однотипных записей (пользователи, транзакции, логи), TRON упаковывает их в компактную таблицу с минимальным синтаксисом. Вместо вертикальных черт — пробелы или табуляция, первая строка — имена полей, дальше данные. Разделители колонок — одиночный пробел или табуляция (но без коллизий, если в данных есть пробелы — используется экранирование).
Пример: массив пользователей в JSON (тот же, что и для ISON, но немного длиннее):
[
{"id": 1, "name": "Анна", "email": "anna@example.com", "role": "admin"},
{"id": 2, "name": "Борис", "email": "boris@example.com", "role": "user"}
]В TRON это будет:
id name email role
1 Анна anna@example.com admin
2 Борис boris@example.com userНикаких скобок, кавычек, запятых. Первая строка — заголовок, дальше строки данных с разделением пробелами. Если значение содержит пробел (например, "Senior Developer"), оно экранируется обратным слешем или берётся в одинарные кавычки — по договорённости.
TRON близок к ISON, но ISON использует вертикальную черту как разделитель, а TRON — пробелы. Казалось бы, мелочь, но для LLM пробел — это один токен, а вертикальная черта — один токен. Разница на уровне пары процентов. Главное отличие — TRON предполагает обязательное экранирование пробелов в значениях, что делает парсинг чуть сложнее, зато не требует менять токенизацию.
Ошибка новичка: пытаться запихнуть в TRON разнородные данные. Если поля различаются от записи к записи — TRON не ваш выбор. TOON или JSON справятся лучше. TRON — для однородных табличных датасетов.
Бенчмарки: как мы тестировали
Для теста взяли три типовых сценария, с которыми сталкивается каждый инженер, работающий с LLM:
- Сценарий A: 50 пользователей с 10 полями каждый (id, name, email, role, department, join_date, status, last_login, metadata) — массив объектов, частично вложенные поля.
- Сценарий B: Глубокое дерево конфига микросервиса (10 уровней вложенности, 40 листьев).
- Сценарий C: Структурированный лог событий (100 записей, по 5 полей, одно поле — длинная строка).
Каждый датасог сериализовали в JSON, TOON, TRON. Замеряли количество токенов с помощью токенизатора GPT-4o (cl100k_base) и Llama 4 (https://github.com/meta-llama/llama-tokenizer). Результаты — среднее по 10 прогонам.
| Сценарий | JSON (токены) | TOON (токены) | TRON (токены) | Экономия TOON | Экономия TRON |
|---|---|---|---|---|---|
| A (50 юзеров) | 4210 | 1050 | 2520 | 75.1% | 40.1% |
| B (конфиг, 10 ур.) | 1560 | 420 | ~ | 73.1% | N/A (TRON не подходит) |
| C (100 логов) | 8320 | 2800 | 4160 | 66.3% | 50.0% |
Цифры не врут: TOON выигрывает везде, где есть вложенность или длинные цепочки ключей. TRON даёт ~40–50% экономии на плоских таблицах, но проигрывает TOON на древовидных структурах. JSON — дорогое удовольствие, особенно когда каждый токен на счету (а в контексте 128k всё быстро съедается).
Важно: экономия токенов не всегда линейна. На маленьких датасетах (2–3 записи) разница может быть всего 30%, потому что фиксированный синтаксис JSON составляет меньшую долю. Но на больших массивах — именно там, где вам нужно передать 500 результатов из векторной базы — TOON и TRON раскрываются полностью.
Парсинг и стабильность: где LLM ломаются
Мы не только считали токены, но и проверяли, насколько LLM понимают эти форматы. Использовали GPT-4o (июнь 2026) и Llama 4 8B (локально). Для каждого формата давали инструкцию: обработать данные и вернуть агрегированный результат. Замеряли процент успешных парсингов (без ошибок, без галлюцинаций).
| Формат | GPT-4o (успех) | Llama 4 8B (успех) | Примечание |
|---|---|---|---|
| JSON | 100% | 98% | Стандарт, модель обучена |
| TOON | 97% | 89% | Нужно описание синтаксиса, Llama иногда путает пути |
| TRON | 95% | 85% | Проблемы с пробелами в значениях, Llama 4 сильно страдает |
JSON — железобетон. Модели на нём натасканы. Но за надёжность платите токенами. TOON почти так же стабилен на GPT-4o, но Llama 4 иногда «забывает» структуру и начинает смешивать ключи. TRON страдает от коллизий пробелов — если не экранировать, модель может неправильно разбить столбцы.
Вывод: если ваша целевая модель — GPT-4o, можно смело использовать TOON или TRON с описанием формата в промпте. Для локальных моделей (Llama, Mistral) лучше придерживаться JSON или TOON, но с дополнительными примерами.
Когда какой формат выбирать — практическое правило
Вот простая матрица принятия решений (не благодарите):
- Сложные вложенные данные (конфиги, метаданные, многомерные структуры) — берите TOON. Экономия >70%, читаемость для модели высокая.
- Плоские таблицы / массивы записей (пользователи, транзакции, логи) — TRON или ISON. TRON даёт 40–50% экономии, ISON — около 60–70% (как мы обсуждали в предыдущей статье).
- Гибридные сценарии (и вложенность, и массивы) — TOON универсальнее, но требует инструкции. Если модель не справляется — используйте JSON, но сжимайте данные (удаляйте лишние поля, сокращайте имена ключей).
- RAG-агенты с большим контекстом — TOON (или ISON) позволит вместить на 70% больше документов в то же окно. Прямая экономия на количестве вызовов.
Не забывайте про законы жанра: токенизация в LLM — сложная штука, и не все сокращения строк дают линейное уменьшение токенов. Например, замена кавычек на пробелы может не изменить число токенов, если токенизатор считает пробел частью токена. Тестируйте на своей модели!
Ошибки, которые я видел в продакшене
Насмотрелся на странные решения. Вот топ-3 факапов:
- Использование TRON без экранирования пробелов. Данные: "Полное имя: Иван Петров". Парсинг модели ломается, она видит два столбца вместо одного. Решение: экранировать пробелы в значениях или использовать TOON.
- Подача TOON без пояснения в промпте. Модель впервые видит формат и начинает дописывать фигурные скобки. Всегда добавляйте одну строку:
Data is in TOON format: each line is a key-value pair, key path separated by dots, value after '='. - Надежда на автоматический конвертер. Проект DataFlow (как строить воспроизводимые пайплайны подготовки данных) решает эту проблему, но многие пишут велосипеды. Конвертация TOON -> JSON не тривиальна, если есть массивы и многоуровневые ключи. Используйте проверенные библиотеки.
Кому это вообще нужно? Реалии 2026 года
В 2026 году цены на API LLM всё ещё высоки (особенно если вы не попали под корпоративный тариф). $0.15 за миллион токенов для GPT-4o — звучит дёшево, но когда ваш RAG-пайплайн генерирует 10 миллионов токенов в день, разница между JSON и TOON составляет $750 в месяц. А если вы крутите 12 таких пайплайнов на разных моделях? Внезапно экономия превращается в зарплату джуниора.
Локальные модели (мы уже писали про сравнение форматов GGUF, AWQ, EXL2) экономят не деньги, а VRAM. Уменьшение контекста на 70% означает, что вы можете либо обрабатывать больше данных за один проход, либо использовать модель с меньшим контекстом (например, Llama 4 8B вместо 70B).
И ещё — не забывайте, что бенчмарки LLM сейчас меряют не только качество, но и скорость и стоимость. TOON и TRON — это про стоимость.
Итог: субъективно, но честно
TOON — мой личный фаворит. Он гибок, даёт максимальную экономию, и при правильном промпте его понимает даже Llama 4. TRON — неплох для таблиц, но ISON делает то же самое с чуть большей экономией и с более простым парсингом (однозначный разделитель — pipe). Если вы ещё не используете ISON — почитайте ту самую статью.
JSON остаётся королём совместимости, но король голый, если считать токены. Для продакшена советую: JSON для общения с бэкендом, TOON для контекста LLM. Держите конвертер наготове, и ваши токены скажут вам спасибо.
А если хотите копнуть глубже — посмотрите, как LLM ломают JSON-парсеры — там много боли, которую можно обойти аккуратным выбором формата.