3,583 papers
arXiv:2505.14178 87 1 мая 2025 г. FREE

Token-Aware Formatting: управление гранулярностью токенов через разделители

КЛЮЧЕВАЯ СУТЬ
Если GPT-4 не может посчитать букву 'r' в слове 'strawberry', это не глупость — модель физически не видит отдельные буквы внутри токена. Токенизатор BPE склеивает 2-4 символа в непрозрачный блок [straw][berry], и модель работает с двумя объектами вместо десяти символов. Token-Aware Formatting позволяет разбить текст на атомарные единицы через разделители — каждый символ становится отдельным токеном, и модель видит структуру. Вместо слитного 'abcde' подаёшь 'a, b, c, d, e' — запятые ломают склейку BPE, и точность вырастает до 80% на задачах подсчёта. Маленькая модель (GPT-4o-mini) с правильным форматом обгоняет o1 с плохим.
Адаптировать под запрос

TL;DR

Token-Aware Formatting — принцип форматирования входных данных, который манипулирует токенизацией через разделители, чтобы разбить текст на атомарные единицы. Вместо слитного текста "abcde" подаёшь "a, b, c, d, e" — каждый символ становится отдельным токеном, и модель видит структуру, которая была скрыта.

Современные токенизаторы (BPE) склеивают 2-4 символа в один токен для эффективности: "strawberry" превращается в два токена [straw][berry]. Модель не видит отдельные буквы внутри токена — для неё это непрозрачный блок. Поэтому GPT-4 не может посчитать "r" в "strawberry": буквы скрыты внутри токенов. То же с цифрами: "12345" может стать одним токеном, и модель не видит отдельные "1", "2", "3". Даже с Chain-of-Thought это не работает — если модель не видит атомарные единицы на входе, она не может с ними оперировать.

Решение — форсировать токенизацию на нужном уровне детализации. Четыре формата с нарастающей точностью: (a) слитный текст "abcde" → BPE склеивает как хочет; (b) пробелы "a b c d e" → лучше, но пробелы тоже могут склеиться; (c) запятые "a, b, c, d, e" → почти всегда разделяет; (d) явная структура "['a', 'b', 'c', 'd', 'e']" → гарантированно отдельные токены. Разница в точности — до 80% на задачах подсчёта и сортировки. Маленькая модель (GPT-4o-mini) с правильным форматом обгоняет o1 с плохим.

🔬

Схема метода

ШАГ 1: Определи атомарную единицу задачи
→ Для подсчёта букв: отдельный символ
→ Для сортировки слов: отдельное слово
→ Для арифметики с цифрами: отдельная цифра

ШАГ 2: Выбери формат разделения
→ Формат (b): пробелы между единицами — "a b c"
→ Формат (c): запятые — "a, b, c" 
→ Формат (d): список — "['a', 'b', 'c']"

ШАГ 3: Переформатируй данные и подай в промпт
→ Один запрос к LLM

Форматы по нарастанию надёжности:

(a) Слитный → "abcde" — токенизатор решает сам, непредсказуемо

(b) Пробелы → "a b c d e" — лучше, но пробелы могут склеиться с соседями

(c) Запятые → "a, b, c, d, e" — почти всегда разделяет

(d) Список → "['a', 'b', 'c', 'd', 'e']" — максимальная гарантия

🚀

Пример применения

⚠️ Зона силы метода: Задачи, где нужна точная работа с отдельными символами, цифрами, словами — подсчёт, сортировка, поиск паттернов, арифметика. НЕ для: анализа смысла, генерации текста, общих рассуждений.

Задача: Проверяешь гипотезу — есть ли закономерность в номерах телефонов клиентов. Нужно посчитать, сколько раз встречается цифра "7" в списке из 25 номеров. Это простая задача, но GPT-4 ошибается при слитной подаче.

Промпт (плохой формат — слитный текст):

Посчитай, сколько раз встречается цифра 7 в этих номерах:
89171234567
89265557890
89037777123
...

Дай только число.

Промпт (хороший формат — токен-видимый):

Посчитай, сколько раз встречается цифра 7 в этих номерах.
Каждая цифра отделена запятой:

8, 9, 1, 7, 1, 2, 3, 4, 5, 6, 7
8, 9, 2, 6, 5, 5, 5, 7, 8, 9, 0
8, 9, 0, 3, 7, 7, 7, 7, 1, 2, 3
...

Дай только итоговое число.

Результат:

В первом случае модель выдаст неточный результат или откажется считать (особенно на длинных номерах). Во втором — правильный подсчёт с точностью близкой к 100%. Если добавить Chain-of-Thought ("покажи подсчёт для каждого номера"), точность в хорошем формате вырастет до 97%, а в плохом останется низкой.

🧠

Почему это работает

Слабость LLM: Модель работает с токенами, не с символами. Токенизатор BPE склеивает частые последовательности символов в единые блоки для эффективности обучения. "strawberry" превращается в [straw][berry]. Эмбеддинг токена [straw] — это единый вектор, внутри которого нет отдельных признаков для букв "s", "t", "r", "a", "w". Модель видит два объекта вместо десяти символов.

Сильная сторона LLM: Модель отлично работает, когда каждый токен = атомарная единица задачи. Если задача "посчитай буквы a" и каждая буква — отдельный токен, модель может применить внимание к каждой, последовательно обработать через CoT, получить точный результат.

Механика обхода: Разделители (пробелы, запятые, кавычки) ломают склейку в BPE. Токенизатор видит "a, b, c" и создаёт токены: [a][,][ ][b][,][ ][c] или ['a'][,][ ]['b']. Главное — буквы теперь изолированы в отдельных токенах. Модель получает гранулярный вход, CoT может пошагово оперировать каждым элементом.

Рычаги управления:

  • Тип разделителя → пробел экономит токены, но менее надёжен; запятая точнее; список ['x'] максимально надёжен, но расходует больше токенов
  • CoT → без разделителей CoT почти не помогает; с разделителями CoT резко улучшает точность (с 60% до 97%)
  • Длина входа → чем длиннее слитный текст, тем хуже работает; с разделителями деградация медленнее

Исследование показало: разница между форматом (a) слитный и (d) список — до 80% точности на задачах подсчёта длиной 30-40 символов.

📋

Шаблон промпта

Базовый шаблон для задач подсчёта/сортировки/обработки символов:

{инструкция_задачи}

Данные (каждый элемент отделён):
{элемент_1}, {элемент_2}, {элемент_3}, ...

{дополнительные_инструкции}

Для максимальной надёжности (формат-список):

{инструкция_задачи}

Данные:
['{элемент_1}', '{элемент_2}', '{элемент_3}', ...]

{дополнительные_инструкции}

Плейсхолдеры: - {инструкция_задачи} — что нужно сделать: посчитать, отсортировать, найти паттерн - {элемент_1}, {элемент_2}, ... — твои данные, разделённые запятыми или в формате списка - {дополнительные_инструкции} — формат вывода, использование CoT и т.д.

Когда использовать какой формат: - Формат (c) с запятыми — универсальный, баланс надёжности и читаемости - Формат (d) список — когда критична 100% точность и можно потратить больше токенов - Формат (b) пробелы — когда экономия важнее и задача простая

Пример конкретного промпта:

Посчитай, сколько раз встречается буква "о" в этой фразе.

Данные (каждая буква отделена):
к, о, р, о, в, а,  , д, а, л, а,  , м, о, л, о, к, о

Покажи подсчёт пошагово, затем дай итоговое число.
⚠️

Ограничения

⚠️ Расход токенов: Разделители увеличивают длину промпта в 2-3 раза — "abc" (3 символа) становится "a, b, c" (5 токенов). На длинных данных это дорого и может упереться в лимит контекста.

⚠️ Узкий класс задач: Метод работает только там, где нужна точная работа с атомарными единицами — символы, цифры, отдельные слова. Для задач анализа смысла, генерации текста, рассуждений общего характера — бесполезен.

⚠️ Читаемость: Формат "['a', 'b', 'c', ...]" выглядит неестественно. Для длинных текстов становится нечитаемым. Если нужна последующая обработка человеком — неудобно.

⚠️ Не универсальное решение: Модель всё равно может ошибаться на очень длинных последовательностях (>40 элементов). Точность падает даже с правильным форматом, хотя медленнее чем без него.

🔍

Как исследовали

Авторы провели систематическое тестирование на чёрных ящиках — без доступа к внутренностям моделей. Логика: токенизация — единственная переменная, задача остаётся той же.

Три типа задач: - Подсчёт — посчитать конкретную букву/цифру в строке - Сортировка — отсортировать символы/слова по алфавиту - Реверс — перевернуть последовательность

Четыре формата токенизации: - (a) Слитный текст "abcde" - (b) Пробелы "a b c d e" - (c) Запятые "a, b, c, d, e" - (d) Список "['a', 'b', 'c', 'd', 'e']"

Модели: GPT-4o-mini, Claude 3.5 Sonnet, Qwen Turbo, OpenAI o1

Объём: По 1000 случайных инстанций для каждой комбинации (задача × формат × длина). Длины: 10-20, 20-30, 30-40 символов для подсчёта; 5-30 для сортировки и реверса.

Метрика: Exact match accuracy — либо правильно, либо нет.

Ключевые находки:

  1. Деградация с длиной резко различается: В формате (a) точность падает с 30% (10-20 символов) до 2% (30-40). В формате (d) — с 97% до 70%.

  2. CoT помогает только с правильным форматом: В формате (a) CoT почти не улучшает результат (30% → 45%). В формате (d) CoT даёт скачок (60% → 97%).

  3. Разные буквы — разная сложность: Подсчёт "a" точнее чем подсчёт "e" или "z" в формате (a) — потому что "a" реже склеивается в BPE. Это model-dependent эффект: для каждой модели свой токенизатор, свои паттерны склейки.

  4. Маленькая модель обгоняет большую: GPT-4o-mini с форматом (d) показывает 97% точности. OpenAI o1 с форматом (a) — около 50%. Правильная токенизация важнее размера модели.

Теоретическая база:

Авторы формализуют через Token Awareness — функцию, которая показывает, есть ли в эмбеддинге токена информация о конкретном свойстве (например, "содержит букву r"). Если TokenAware(token, "содержит r") = 0, модель не может использовать это в рассуждениях.

Также вводят понятие CoT Expressiveness — насколько богат язык токенов для выражения промежуточных шагов. Если токены слишком грубые, даже CoT не может экстернализовать все нужные состояния.

📌

Связь с другими техниками

Chain-of-Thought (CoT): Исследование показывает границу применимости CoT. Теория говорит "CoT делает модель Тьюринг-полной", практика — нет. Причина: токенизация ломает выразительность. CoT не волшебная палочка, он работает только когда входные данные видимы модели на токенном уровне.

Few-Shot и контекст: Принцип переносится — если в few-shot примерах данные слитные, модель выучит плохой паттерн. Если примеры в формате (c) или (d), модель обучится работать с правильной гранулярностью.

Structured Output: Схожая идея — дать модели явную структуру. Здесь структура на входе, не на выходе. Оба принципа используют силу LLM в работе с чёткими границами.

🔗

Ресурсы

Tokenization Constraints in LLMs: A Study of Symbolic and Arithmetic Reasoning Limits Xiang Zhang, Juntai Cao, Jiaqi Wei, Yiwei Xu, Chenyu You University of British Columbia, Zhejiang University, Cisco, Stony Brook University

Код, промпты и результаты: Anonymous GitHub


📋 Дайджест исследования

Ключевая суть

Если GPT-4 не может посчитать букву 'r' в слове 'strawberry', это не глупость — модель физически не видит отдельные буквы внутри токена. Токенизатор BPE склеивает 2-4 символа в непрозрачный блок [straw][berry], и модель работает с двумя объектами вместо десяти символов. Token-Aware Formatting позволяет разбить текст на атомарные единицы через разделители — каждый символ становится отдельным токеном, и модель видит структуру. Вместо слитного 'abcde' подаёшь 'a, b, c, d, e' — запятые ломают склейку BPE, и точность вырастает до 80% на задачах подсчёта. Маленькая модель (GPT-4o-mini) с правильным форматом обгоняет o1 с плохим.

Принцип работы

Четыре формата с нарастающей точностью: слитный текст 'abcde' → BPE склеивает как хочет, непредсказуемо; пробелы 'a b c d e' → лучше, но пробелы могут склеиться с соседями; запятые 'a, b, c, d, e' → почти всегда разделяет; список ['a', 'b', 'c'] → гарантированно отдельные токены. Атомарная единица зависит от задачи: для подсчёта букв — отдельный символ, для арифметики — цифра, для сортировки слов — слово. Разделители (запятые, кавычки) разрывают частотные паттерны токенизатора, заставляя каждый элемент жить отдельно.

Почему работает

Токенизатор BPE склеивает частые последовательности в единые блоки для эффективности — 'strawberry' превращается в [straw][berry]. Эмбеддинг токена [straw] — это единый вектор, внутри которого нет отдельных признаков для букв s, t, r, a, w. Модель видит два объекта вместо десяти символов — отсюда провал в задачах подсчёта. Разделители ломают склейку: модель получает гранулярный вход, пошаговые рассуждения (CoT) могут оперировать каждым элементом отдельно. Без разделителей CoT почти не помогает; с разделителями точность скачет с 60% до 97%. Разница между слитным форматом и списком — до 80% точности на последовательностях длиной 30-40 символов.

Когда применять

Задачи с точной работой на уровне символов/цифр/слов → подсчёт вхождений ('сколько раз буква о'), сортировка списков, поиск паттернов в последовательностях, арифметика с отдельными цифрами, особенно когда базовый промпт даёт низкую точность. НЕ подходит для анализа смысла текста, генерации контента, общих рассуждений — там токенизация не критична, а расход токенов больно бьёт по бюджету.

Мини-рецепт

1. Определи атомарную единицу задачи: для подсчёта букв — отдельный символ, для арифметики — цифра, для сортировки — слово
2. Выбери формат разделения: запятые a, b, c (универсальный баланс надёжности и читаемости) или список ['a', 'b', 'c'] (максимальная гарантия, но больше токенов)
3. Переформатируй данные и подай в промпт: вместо strawberry используй s, t, r, a, w, b, e, r, r, y
4. Добавь пошаговые рассуждения (CoT) если нужна максимальная точность — с разделителями это даёт скачок с 60% до 97%

Примеры

[ПЛОХО] : Посчитай, сколько раз встречается буква 'о' в фразе: корова дала молоко
[ХОРОШО] : Посчитай, сколько раз встречается буква 'о' в этой фразе. Каждая буква отделена: к, о, р, о, в, а, , д, а, л, а, , м, о, л, о, к, о. Покажи подсчёт пошагово, затем дай итоговое число.
Источник: Tokenization Constraints in LLMs: A Study of Symbolic and Arithmetic Reasoning Limits
ArXiv ID: 2505.14178 | Сгенерировано: 2026-01-20 16:30

Проблемы LLM

ПроблемаСутьКак обойти
Модель не видит символы внутри токеновТокенизатор BPE склеивает 2-4 символа в один блок для экономии. Слово "strawberry" превращается в два токена [straw][berry]. Модель видит два объекта, а не десять букв. Поэтому не может посчитать "r" в слове или цифры в числе "12345". Атомарные единицы (буквы, цифры) скрыты внутри непрозрачного блока. Это ломает задачи подсчёта, сортировки, поиска паттернов на уровне символовРазбей текст на атомарные единицы через разделители. Вместо "abcde" подай "a, b, c, d, e". Запятая ломает склейку токенизатора. Каждый символ становится отдельным токеном. Модель видит структуру. Три формата: пробелы "a b c" (экономно, менее надёжно), запятые "a, b, c" (баланс), список "['a', 'b', 'c']" (максимальная надёжность)

Методы

МетодСуть
Форматирование с учётом токенизации — контроль гранулярности через разделителиШаг 1: Определи атомарную единицу задачи. Для подсчёта букв — это отдельный символ. Для сортировки слов — отдельное слово. Для арифметики — отдельная цифра. Шаг 2: Вставь разделители между единицами. Формат (b) пробелы: a b c d e — экономит токены, но может склеиться. Формат (c) запятые: a, b, c, d, e — почти всегда разделяет, универсальный выбор. Формат (d) список: ['a', 'b', 'c', 'd', 'e'] — гарантированное разделение, но дороже в 2-3 раза токенов. Шаг 3: Подай в промпт. Почему работает: Разделители ломают BPE-склейку. Каждый символ изолируется в отдельный токен. Модель получает гранулярный вход и может применить внимание к каждому элементу. Когда ДА: задачи подсчёта, сортировки, поиска паттернов на уровне символов/цифр. Когда НЕТ: анализ смысла, генерация текста, общие рассуждения — там атомарность не нужна, расход токенов неоправдан

Тезисы

ТезисКомментарий
Разделители управляют тем, что видит модельТокенизатор BPE склеивает частые последовательности в блоки. "abc" может стать одним токеном. Пробел, запятая или кавычка ломают этот процесс. Токенизатор видит "a, b, c" и создаёт отдельные токены для каждой буквы. Механика: разделитель — это сигнал границы для алгоритма BPE. Он не склеивает через специальные символы. Применяй: Когда задача требует работы с отдельными символами (подсчёт, поиск), добавь запятые между ними. Разница в точности — до 80% на длинных последовательностях (30-40 символов)
📖 Простыми словами

Tokenization Constraints inLLMs: A Study of Symbolic and Arithmetic Reasoning Limits

arXiv: 2505.14178

Нейросети на самом деле не умеют читать — они видят мир через токены, то есть куски слов и символов, которые свалили в одну кучу. Когда ты пишешь слово strawberry, для модели это не набор из десяти букв, а два готовых кирпича: straw и berry. Проблема в том, что внутри этих кирпичей буквы «замурованы» — у модели нет отдельного датчика для каждой буквы, она видит только общий смысл куска. Из-за этого на простых детских задачках вроде «сколько букв 'r' в слове» топовые алгоритмы начинают безбожно тупить и выдавать рандомные цифры.

Это как если бы тебе дали запечатанную коробку с пазлом, на которой написано «Лес», и спросили: «Сколько там деталек с изображением веток?». Ты знаешь, что в лесу есть ветки, но пока не высыплешь содержимое на стол, точно не посчитаешь. Модель находится в такой же ловушке: она оперирует цельными образами, а когда от неё требуют залезть внутрь структуры, она просто гадает по памяти, потому что токенизатор скрыл от неё детали.

Решение проблемы — метод Token-Aware Formatting, который работает как принудительная деконструкция. Вместо того чтобы скармливать модели слипшийся текст, ты вставляешь разделители, например, пишешь «s, t, r, a, w...». Это заставляет токенизатор разбить слово на атомарные единицы. Теперь каждая буква — это отдельный объект, который модель видит четко и ясно. В таком режиме магия «умного чат-бота» отключается, зато включается символьная логика, и ошибки в арифметике или сортировке исчезают, потому что данные больше не превращаются в невнятную кашу.

Этот принцип универсален для любых задач, где важна точность до знака. Тестировали на буквах и цифрах, но это работает везде: в коде, в сложных артикулах товаров или в химических формулах. Если модель лажает на простых вещах, значит, она просто не видит структуру за фасадом токенов. SEO для смыслов здесь не поможет — нужно менять саму подачу данных, превращая монолит в понятный для AI конструктор.

Короче: хватит ждать от нейронки чудес внимательности, если ты сам засунул ей в рот непережеванный кусок текста. Хочешь точности — используй разделители и принудительную токенизацию. Это костыль, который исправляет фундаментальный баг архитектуры, и пока токенизаторы не изменятся, это единственный способ заставить модель реально «считать», а не просто красиво врать. Кто понял этот трюк, тот перестает жаловаться на галлюцинации в простых расчетах.

Работа с исследованием

Адаптируйте исследование под ваши задачи или создайте готовый промпт на основе техник из исследования.

0 / 2000
~0.5-2 N-токенов ~10-30с
~0.3-1 N-токенов ~5-15с