3,583 papers
arXiv:2508.13805 89 19 авг. 2025 г. FREE

CAPEL: точный контроль длины текста через счётчик-обратный отсчёт прямо в промпте

КЛЮЧЕВАЯ СУТЬ
LLM не умеет считать слова — это не лень, это архитектура. Трансформер генерирует токен за токеном, но внутри него нет счётчика «сколько слов уже написано». К 20-му слову он теряет след и дальше работает на интуиции — отсюда вечные «примерно 100 слов» вместо ровно 100. CAPEL позволяет получать тексты с точным числом слов: попросил 50 — получил 50, не 43 и не 58. Фишка: счёт выносится наружу через убывающие метки прямо в тексте — модель пишет <50>слово<49>слово... и не считает, а продолжает очевидный паттерн, который видит перед собой. Точность попадания в цель прыгает с 2–10% до 75–96%.
Адаптировать под запрос

TL;DR

LLM не умеют считать слова — когда просишь написать ровно 100 слов, получаешь то 80, то 130. CAPEL решает это через видимый обратный отсчёт прямо в тексте: модель пишет одно слово на каждую цифру от N до 0, и счётчик остаётся у неё перед «глазами» всё время генерации.

Проблема не в лени модели — это архитектурное ограничение. Трансформер при обычной генерации не накапливает счётчик внутри себя. Без внешней опоры он «теряет счёт» уже после 2-3 слов — дальше работает на интуиции. Вот почему просьба «напиши ровно 50 слов» даёт от 35 до 70.

CAPEL добавляет суффикс-инструкцию к любому промпту: модель обязана перед каждым словом напечатать убывающую метку , ... <1>, <0>. Счёт перенесён из «головы» модели в видимый текст — и точность попадания прыгает с 2-10% до 75-96%.


🔬

Схема метода

Один промпт (один запрос):

[Твоя задача] + [суффикс CAPEL с правилами]
        ↓
Модель пишет: <5>Привет,<4>мир!<3>Как<2>дела?<1>Отлично.<0>
        ↓
Убираешь метки → чистый текст ровно N слов

Весь метод — один запрос. Метки потом вырезаются вручную или просишь модель выдать чистую версию.


🚀

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

Задача: Написать биографию спикера для конференции «Russian Product Week» — ровно 40 слов. Редактор уже дважды возвращал текст: то 52 слова, то 34. Дедлайн завтра.

Промпт:

Напиши биографию спикера Алексея Горбунова — основателя сервиса доставки 
«Быстро», ex-CPO Яндекс.Маркета, спикера TEDx. Тема выступления: 
«Как мы за 6 месяцев выросли с 0 до 2 млн заказов».

Требуемый формат вывода:
1. Для каждого целого k от 40 до 1:
   • Напечатай метку 
   • Сразу после — одно русское слово (с возможными знаками препинания вплотную).
   Пробел только между парами «метка + слово».
2. После слова при метке <1> напечатай <0> и прекрати генерацию.
3. Метки не считаются словами — только сами слова.
4. Метки должны убывать строго на 1, без пропусков и повторов.
5. Две метки подряд без слова между ними — запрещено.
6. После <0> — никакого текста, даже переноса строки.

Правильный пример (N=5):
<5>Алексей<4>основал<3>компанию<2>в<1>2019.<0>

Типичные ошибки (не допускай):
— Преждевременная остановка: <5>текст<4>конец<0>
— Метки подряд: <3><2>слово
— Текст после <0>

Результат: Модель выдаст текст с метками — ровно 40 пар «метка + слово», от <40> до <1>, завершённых <0>. После того как уберёшь метки, останется биография ровно в 40 слов. Если хочешь — попроси модель сразу выдать две версии: с метками и без.


🧠

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

Трансформер — отличный предсказатель следующего токена, но плохой счётчик. Когда модель генерирует текст, у неё нет внутренней переменной «сколько слов уже написано». Она «чувствует» длину примерно — по обучающим паттернам. Поэтому при длинных текстах ошибка накапливается и выходит боком.

Зато у модели отличная память на паттерны в видимом тексте. Если в выводе стоит <7>, модель «видит» это и легко предсказывает, что следующая метка должна быть <6>. Это не счёт в уме — это продолжение очевидного паттерна, и вот это трансформеры делают блестяще.

CAPEL использует сильное против слабого: превращает задачу «считай слова в уме» в задачу «продолжай убывающий паттерн цифр». Счётчик теперь виден в тексте — модель не может его «потерять». Авторы называют это externalized scratch pad — внешний черновик прямо в выводе.

Рычаги управления: - Целевое число N → подставь нужное количество слов/символов - Пример в промпте → чем точнее пример, тем меньше ошибок «два маркера подряд» - Список типичных ошибок → добавляй или убирай под конкретную модель - Вариант Draft→CAPEL → сначала черновик, потом переписать с метками — лучше сохраняет качество текста


📋

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

{Твоя задача — напиши что именно нужно создать и о чём}

Требуемый формат вывода:
1. Для каждого целого k от {число_слов} до 1:
   • Напечатай метку 
   • Сразу после — одно {русское / английское} слово 
     (знаки препинания вплотную к слову, без пробела внутри).
   Пробел только между парами «метка + слово».
2. После слова при метке <1> напечатай <0> и прекрати генерацию.
3. Метки НЕ считаются словами — только сами слова.
4. Метки убывают строго на 1, без пропусков и повторов.
5. Две метки подряд без слова между ними — запрещено.
6. После <0> — никакого текста, даже переноса строки.

Правильный пример ({пример_N}=5):
<5>{слово1}<4>{слово2}<3>{слово3}<2>{слово4}<1>{слово5}.<0>

Типичные ошибки (не допускай):
— Преждевременная остановка: <5>текст<4>конец<0>
— Метки подряд: <3><2>слово
— Текст после <0>

Что подставлять: - {Твоя задача} — обычная инструкция: «напиши пост», «сделай краткое резюме», «составь биографию» - {число_слов} — ровно столько слов, сколько нужно (1-256 — надёжная зона) - {русское / английское} — выбери язык; для русского считаем слова, для китайского — иероглифы - {пример_N} и {слово1-5} — заполни 5-словным примером из своей тематики


🚀 Быстрый старт — вставь в чат:

Вот шаблон CAPEL для точного контроля длины текста. 
Адаптируй под мою задачу: {твоя задача}. 
Задавай вопросы, чтобы заполнить поля.

[вставить шаблон выше]

LLM спросит: какой текст нужен, сколько точно слов, на каком языке, и попросит пример фразы из твоей тематики для блока «Правильный пример» — потому что конкретный пример в промпте критически важен для точного следования паттерну.


⚠️

Ограничения

⚠️ Длинные тексты: До 256 слов — точность высокая (60-90%+ попаданий в цель). После 512 слов модели начинают сбиваться. На 1000+ слов метод всё ещё лучше базового, но уже не гарантирует точность.

⚠️ Некоторые модели ломаются: o4-mini и gpt-4o-mini иногда обрывают текст или игнорируют метки — особенно на длинных текстах. DeepSeek-R1 в исследовании не заработал вовсе. Если не работает — попробуй модель без режима «думать».

⚠️ Компромисс качество/точность: Чем строже следуешь счётчику, тем чуть «деревяннее» текст. Решение — вариант Draft→CAPEL: сначала модель пишет черновик свободно, потом переписывает его с метками в том же ответе. Это сохраняет качество и не требует лишних запросов.

⚠️ Метки нужно убирать: Финальный текст содержит метки — <40>Алексей<39>основал.... Либо вырезай вручную, либо добавь в конце промпта: «После текста с метками выведи чистую версию без меток».

⚠️ Русский язык — слова, не символы: Метод считает слова (пробел-разделитель). Для точного подсчёта символов в русском нужна адаптация под посимвольный режим — в оригинале он описан только для китайского.


🔍

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

Авторы поставили простой вопрос: можно ли добиться точной длины текста одним промптом, без дообучения? Чтобы ответить честно, они прогнали 11 моделей (GPT-4.1, GPT-4o, DeepSeek-V3/R1, Qwen3 нескольких размеров) через четыре разных сценария — от случайных текстов до новостных саммари и сложных инструкций.

Самый показательный тест: 1000 текстов на случайные темы, каждый с разным целевым числом слов от 1 до 1000. Базовая инструкция «напиши ровно N слов» — и CAPEL. У GPT-4.1 точное попадание выросло с 1,9% до 94,2%; у Qwen3-8B — с 0,6% до 72%. При этом качество текста по независимой оценке почти не изменилось.

Любопытная деталь: исследователи специально проверили, насколько модели умеют считать слова в уме — давали одно предложение и спрашивали «сколько здесь слов?». При 2 словах — 98% точность. При 10 словах — 15%. Это объясняет, почему внешний счётчик даёт такой прирост: проблема не в промпте, а в том, что подсчёт в уме для трансформера фундаментально сложен.

Неожиданный вывод: «умные» рассуждающие модели иногда ломаются на CAPEL. o4-mini и gpt-4o-mini — парадоксально хуже, чем GPT-4.1. Авторы предполагают, что убывающие метки похожи на запрос «показать цепочку рассуждений», и защитные фильтры или режим мышления мешают выполнить инструкцию.


💡

Адаптации и экстраполяции

🔧 Draft→CAPEL: сначала черновик, потом счётчик

Если качество важнее абсолютной точности — добавь перед суффиксом CAPEL инструкцию:

Сначала напиши свободный черновик текста — без ограничений по длине, 
просто хорошо. Затем, в том же ответе, перепиши черновик, 
используя формат CAPEL ниже, укладываясь ровно в {число_слов} слов.

[суффикс CAPEL]

Модель сначала думает о качестве, потом — о длине. Авторы показали: GPT-4.1 в этом режиме сохраняет качество на уровне базового промпта и при этом попадает в длину в ~67% случаев — против 74.9% у чистого CAPEL, но при заметно лучшем качестве текста.


🔧 Видимые шаги для проверки

Если хочешь видеть счёт и контролировать процесс — не убирай метки сразу. Попроси модель выдать текст с метками и без в двух блоках:

Выведи два блока:
БЛОК 1 (с метками): <40>слово<39>слово...<0>
БЛОК 2 (чистый): текст без меток

Так можно проверить, не сбилась ли модель — и сразу получить готовый результат.


🔧 Адаптация под лимит символов (Telegram, VK)

Telegram-описание канала — до 255 символов. Метод CAPEL считает слова, не символы. Но можно попросить модель считать слова AND держать текст до 255 символов как дополнительное условие:

{задача}

Дополнительные условия:
- Используй формат CAPEL ниже (N=35 слов)
- Следи, чтобы итоговый текст без меток не превышал 255 символов
- Если слово длинное — замени на короткий синоним

[суффикс CAPEL с N=35]

Точного соответствия символам это не гарантирует, но даёт хорошее приближение.


🔗

Ресурсы

Статья: Prompt-Based One-Shot Exact Length-Controlled Generation with LLMs Авторы: Juncheng Xie, Hung-yi Lee — National Taiwan University (NTU) arXiv: 2508.13805 (август 2025) Связанные методы: Chain-of-Thought prompting (Wei et al. 2022), Hansel (Song et al. 2025), BB-MH (Gu et al. 2024), LIFEBench (Zhang et al. 2025)


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

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

LLM не умеет считать слова — это не лень, это архитектура. Трансформер генерирует токен за токеном, но внутри него нет счётчика «сколько слов уже написано». К 20-му слову он теряет след и дальше работает на интуиции — отсюда вечные «примерно 100 слов» вместо ровно 100. CAPEL позволяет получать тексты с точным числом слов: попросил 50 — получил 50, не 43 и не 58. Фишка: счёт выносится наружу через убывающие метки прямо в тексте — модель пишет <50>слово<49>слово... и не считает, а продолжает очевидный паттерн, который видит перед собой. Точность попадания в цель прыгает с 2–10% до 75–96%.

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

Трансформер — плохой счётчик, но отличный продолжатель паттернов. Это ключевое различие. Попроси его держать счёт в голове — провалится. Покажи убывающий ряд <7>...<6>...<5>... — продолжит без ошибок: следующее число очевидно. CAPEL превращает задачу «посчитай слова в уме» в задачу «продолжи числовой паттерн» — и именно это трансформеры делают блестяще. Счётчик теперь всегда виден в тексте — потерять его невозможно.

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

У трансформера при обычной генерации нет внутренней переменной «текущее число слов». Без опоры на что-то видимое он теряет счёт уже после 2–3 слов — дальше угадывает. Когда счётчик вынесен в текст, задача меняется: не «считай» — а «продолжай ряд». Это как разница между устным счётом в уме и пальцами на руках — второе надёжнее в разы. На коротких текстах (до 256 слов) точность достигает 60–90%+, на средних — стабильно выше 75%. Исследователи называют это externalized scratch pad — внешний черновик прямо в выводе. Модель не изменилась — изменилась задача, которую ей дали.

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

Контент с жёсткими лимитами: биографии спикеров, посты в соцсетях, аннотации, SEO-мета-описания, тезисы для конференций, пресс-релизы — везде, где редактор возвращает текст с пометкой «перебор/недобор». Особенно хорошо работает для задач до 256 слов с фиксированным числом и для случаев, где несколько итераций правки уже потрачены впустую. НЕ подходит: тексты длиннее 512 слов (точность падает), работа с o4-mini и gpt-4o-mini на длинных запросах (они обрывают или игнорируют метки), задачи где нужен точный подсчёт символов для русского текста — метод считает слова через пробел, не символы.

Мини-рецепт

1. Напиши задачу: обычная инструкция — «составь биографию», «напиши пост о продукте», «сделай анонс мероприятия».
2. Добавь суффикс CAPEL: «Для каждого k от {число} до 1: напечатай метку , сразу после — одно слово со знаками препинания вплотную. После слова при <1> напечатай <0> и стоп. Метки не считаются словами. Две метки подряд — запрещено.»
3. Вставь пример из своей тематики: <5>Алексей<4>основал<3>компанию<2>в<1>2019.<0> — конкретный пример снижает ошибки формата резче, чем любые дополнительные объяснения.
4. Убери метки из результата: либо вручную, либо добавь в конце промпта «после текста с метками выведи чистую версию без меток».
5. Если текст получился деревянным: используй вариант Draft→CAPEL — попроси модель сначала написать черновик свободно, потом переписать его с метками в том же ответе. Качество сохраняется, а точность длины остаётся высокой.

Примеры

[ПЛОХО] : Напиши биографию спикера ровно на 40 слов
[ХОРОШО] : Напиши биографию спикера Алексея Горбунова — основателя сервиса доставки «Быстро», бывшего директора по продукту Яндекс.Маркета. Тема выступления: «От 0 до 2 млн заказов за 6 месяцев». Формат вывода: 1. Для каждого k от 40 до 1: напечатай метку , сразу после — одно слово (знаки препинания вплотную). Пробел только между парами «метка + слово». 2. После слова при <1> напечатай <0> и прекрати генерацию. 3. Метки не считаются словами. Две метки подряд — запрещено. Пример (N=5): <5>Алексей<4>основал<3>компанию<2>в<1>2019.<0> После текста с метками выведи чистую версию без меток.
Источник: Prompt-Based One-Shot Exact Length-Controlled Generation with LLMs
ArXiv ID: 2508.13805 | Сгенерировано: 2026-03-02 06:27

Проблемы LLM

ПроблемаСутьКак обойти
Модель не умеет считать слова при генерацииПросишь написать ровно 50 слов. Получаешь 35 или 70. Проблема не в невнимательности. У трансформера нет внутреннего счётчика. Он оценивает длину «на глаз» — по паттернам из обучения. Чем длиннее текст, тем сильнее ошибка накапливается. Работает для любой задачи где нужна точная длинаПеренеси счётчик из «головы» модели в видимый текст. Дай модели убывающие метки: она пишет одно слово на каждую цифру. Метки видны — счёт не теряется

Методы

МетодСуть
Видимый обратный счётчик — точная длина текстаДобавь к своей задаче суффикс с правилами: модель перед каждым словом печатает убывающую метку , ... <1>, <0>. Одна метка = одно слово. Потом убираешь метки — остаётся чистый текст ровно нужной длины. Шаблон суффикса: Для каждого k от {N} до 1: напечатай , сразу после — одно слово. После <1> напечатай <0> и стоп. Метки не считаются словами. Метки убывают строго на 1. Две метки подряд запрещены. Обязательно добавь пример из своей тематики: <5>Алексей<4>основал<3>компанию<2>в<1>2019.<0> Когда работает: 1–256 слов, любая задача с точным лимитом. Когда ломается: тексты 512+ слов, некоторые модели с режимом «думать» (o4-mini, DeepSeek-R1). Компромисс качество/точность: сначала черновик свободно, потом попроси переписать с метками в том же ответе — текст живее

Тезисы

ТезисКомментарий
Трансформер продолжает паттерны. Но не считает в умеМодель не держит счётчик внутри себя. Зато блестяще продолжает очевидные последовательности. Видит <7> — легко предсказывает <6>. Это не счёт, это продолжение ряда. Любую задачу «посчитай» можно переформулировать как «продолжи паттерн» — точность резко растёт. Применяй: когда нужен контроль числа шагов, элементов, итераций — дай модели видимую убывающую метку вместо просьбы «помни сколько осталось»
📖 Простыми словами

Генерация с контролем точной длины на основе промптов в один шаг с помощью LLM

arXiv: 2508.13805

Суть проблемы в том, что у нейронок напрочь отсутствует встроенный спидометр или линейка. Когда ты просишь ChatGPT написать текст ровно на 50 слов, он не считает их в уме — он просто гадает на кофейной гуще, опираясь на примерные паттерны из обучения. Для модели текст — это поток токенов, а не дискретные единицы, поэтому она постоянно лажает: то недоберет десяток слов, то разойдется в графомании. LLM не умеют считать, они просто имитируют уверенность, и чем длиннее задача, тем сильнее накапливается эта статистическая погрешность.

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

Работает это максимально просто и эффективно: модель пишет цифру, а следом за ней — одно слово. Например: «10 Мама 9 мыла 8 раму...». Такой жесткий контроль шага не дает трансформеру уйти в астрал, потому что счетчик всегда находится в его «поле зрения» (контекстном окне). Это превращает процесс из творческого полета в строгий алгоритм, где ошибка исключена на уровне механики. В итоге на выходе мы получаем текст, где количество слов совпадает с заданным с аптекарской точностью, а лишние цифры потом просто вычищаются скриптом.

Хотя метод тестировали на генерации коротких текстов, принцип универсален для любой задачи, где важен объем. Это спасение для SMM-щиков, которым нужно впихнуть невпихуемое в лимиты Twitter, для редакторов с жесткой сеткой верстки или для разработчиков, чьи интерфейсы «разрывает» от лишней строчки. Точный контроль длины превращает капризную нейронку в предсказуемый инструмент, который наконец-то понимает разницу между «примерно столько» и «ровно 40».

Короче, хватит надеяться, что промпт в духе "пиши короче" сработает — это путь в никуда. Если нужна хирургическая точность, используй метод обратного отсчета, который делает структуру текста прозрачной для самой модели. CAPEL закрывает вопрос с лимитами, превращая генерацию из лотереи в прогнозируемый процесс. Кто первый внедрит такой контроль в свои пайплайны, тот перестанет тратить часы на ручную подрезку хвостов и бесконечные регенерации.

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

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

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