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)
