Попросил нейросеть написать 50 слов — она выдала 73. Как заставить модель считать
Попросил нейросеть написать пост на 50 слов — получил 73. Исправил промпт — вышло 42. Переделал снова — 68. Знакомо? Модели физически не умеют считать слова в голове. Но есть хак, который поднимает точность попадания с 10% до 94%.
Суть проблемы: модели теряют счёт
Нейросети не имеют встроенного счётчика. Когда просишь "напиши ровно 100 слов", модель пытается считать в процессе генерации — и сбивается уже после 5-10 слов.
Исследователи из National Taiwan University (2025) протестировали способность LLM к подсчёту на 11 моделях. Результат: точность падает с 99% (1-2 слова) до 15% на дистанции 10 слов. Это как просить человека вслепую отмерить ровно 100 шагов — после 30-го начнёшь сбиваться.
Причина — архитектура трансформеров. Они обрабатывают текст параллельно, но не накапливают числовое состояние типа "уже написано 47 слов". Счётчика просто нет.
CAPEL: вынеси счётчик наружу
CAPEL (Countdown-Aided Prompting for Exact Length) — техника, которая превращает подсчёт в видимый процесс. Вместо счёта в голове модель пишет с маркерами обратного отсчёта:
Модель видит число в предыдущем маркере и просто продолжает паттерн до <0>. Это как считать вслух вместо "в уме" — ошибки сразу видны.
Метафора: Это шпаргалка, которую разрешили подсмотреть. Модель не держит число в голове — оно уже написано в тексте.
Пример: пост для Telegram ровно 30 слов
Задача: написать пост о пользе утренних прогулок. Лимит — 30 слов.
Промпт:
Результат: Модель выдаёт текст с маркерами от <30> до <0>. Убираешь маркеры регуляркой — получаешь ровно 30 слов. Точность на GPT-4.1 — 94%.
Попробуйте сами — вот как выглядит ответ ChatGPT с этим методом:
Почему это работает
Трансформеры отлично решают задачи pattern completion (продолжи паттерн), но плохо справляются с подсчётом в памяти. CAPEL превращает счёт в паттерн:
Обычный подход: Модель пытается помнить "написал 47 слов" → теряет счёт → выдаёт 80 вместо 100.
С CAPEL: Модель видит <47> в своём же выводе → просто пишет <46> и слово → продолжает до <0>.
Метафора: Это как считать ступеньки вслух. Забудешь число — посмотришь на последнюю произнесённую цифру и продолжишь.
Ключевые рычаги:
- Шаг декремента = 1. Если сделать <10><8><6>... (шаг 2), модель снова будет считать между маркерами — и собьётся.
- Формат маркера. Угловые скобки <N> работают лучше всего — чётко отделяют счётчик от текста.
- Пример в промпте. Показываешь паттерн — модель его повторяет.
- Список ошибок. В промпте описываешь типичные косяки ("не пропускай маркеры", "не дублируй <0>") — частота сбоев падает.
Готовый шаблон промпта
Для любой задачи с ограничением длины:
Подставляешь своё N и задачу — работает.
Когда CAPEL не поможет
Метод не универсален. Ограничения:
Длинные тексты (>500 слов). Точность падает. На 1000 слов даже GPT-4.1 даёт ~50% exact match. Для книг не подойдёт.
Некоторые модели отказывают. o4-mini и GPT-4o-mini иногда воспринимают countdown как попытку извлечь внутренние рассуждения и игнорируют инструкцию.
Маркеры увеличивают вывод. Текст в 100 слов → ~200 токенов (слова + маркеры). Если платишь за API — учитывай.
Качество может немного упасть. Модель тратит "внимание" на соблюдение формата. На MT-Bench иногда снижение на 0.5-1 балл по 10-балльной шкале. Если критично — используй двухэтапную генерацию: сначала черновик без ограничений, потом перепиши с CAPEL.
Где копать глубже
Метод описан в работе "Prompt-Based One-Shot Exact Length-Controlled Generation with LLMs" (2025) исследователей из National Taiwan University. Они протестировали 11 моделей (GPT-4o, GPT-4.1, DeepSeek-V3, Qwen) на 4 бенчмарках.
Главная находка: LLM не могут считать токены в процессе генерации из-за архитектурных ограничений трансформеров. Но если вынести счёт в видимый текст — точность попадания в целевую длину прыгает с 1.9% до 94.2%.
Это универсальный принцип: любая задача, где модель должна "помнить число" в процессе генерации, решается лучше через visible scratchpad (видимые промежуточные шаги).
Куда применять
CAPEL решает реальную боль для тех, кто работает с жёсткими лимитами:
- Посты в соцсетях (Twitter, Telegram)
- Мета-описания для SEO (155-160 символов)
- Заголовки (60-70 символов для Google)
- SMS-рассылки
- Описания товаров на маркетплейсах
Один промпт, один запрос, без итераций. Работает через любой API.