TL;DR
APIO — метод, который создаёт промпт из примеров входа-выхода и затем улучшает его через три операции: Improve (попросить LLM улучшить инструкцию), Rephrase (перефразировать без изменения смысла), Permute (изменить порядок). Ключевая идея — структурировать промпт как markdown-список инструкций, а не как монолитный блок текста. Это даёт контроль на уровне отдельных инструкций.
Обычные методы автоматической оптимизации промптов требуют seed prompt — начальную версию, которую создают вручную. Если промпт написан плохо, оптимизация не поможет. Кроме того, эти методы работают с промптом как с единым блоком текста — невозможно точечно улучшить конкретную часть. APIO решает обе проблемы: генерирует промпт из примеров и структурирует его как список, где каждая строка — отдельная инструкция.
Метод двухшаговый. Шаг 1 (Индукция): LLM смотрит на примеры правильных входов-выходов и выводит список из 3-5 инструкций — одна инструкция из одного примера. Шаг 2 (Оптимизация): метод прогоняет список через beam search с тремя операциями: улучшить инструкцию (показать ошибки и попросить исправить), перефразировать (сохранить смысл, изменить формулировку), переставить (поменять порядок инструкций). Лучшие кандидаты добавляются в пул. Процесс повторяется 15 раз.
Схема метода
ШАГ 1 (Индукция — один промпт к LLM):
Вход: 3 примера "входной текст → правильный выход"
→ Список из 3 инструкций (одна на примере)
ШАГ 2 (Оптимизация — 15 итераций):
Взять текущий список инструкций
→ Применить три операции:
• Improve: попросить LLM улучшить каждую инструкцию для снижения ошибок
• Rephrase: попросить LLM перефразировать каждую инструкцию
• Permute: случайно поменять местами 2 инструкции
→ Проверить кандидатов на валидации
→ Добавить лучших в пул
→ Повторить
Весь процесс автоматизирован через код, но принципы можно применить вручную в чате.
Пример применения
Задача: Редактируешь коммерческое предложение для клиента. Текст написал технический специалист — много жаргона, длинные предложения, канцелярит. Нужно сделать понятным для руководителя компании, который не в теме.
Промпт (адаптация APIO вручную):
Я дам тебе текст коммерческого предложения. Твоя задача — переписать его так,
чтобы он был понятен руководителю компании без технического бэкграунда.
Список инструкций:
- Убери технический жаргон или объясни термины простыми словами
- Разбей длинные предложения на короткие (максимум 15-20 слов)
- Замени канцелярит и пассивные конструкции на активный залог и прямую речь
- Сохрани ключевые цифры, сроки и выгоды для клиента
- Проверь что каждое предложение отвечает на вопрос "зачем это клиенту"
[ТЕКСТ]
После первого прогона попроси улучшить конкретные инструкции:
Твой вывод всё ещё содержит фразы типа "осуществление деятельности"
и "в рамках реализации". Улучши инструкцию 3 — сделай её жёстче,
чтобы модель убирала ВСЕ следы канцелярита.
Или перефразируй инструкцию:
Перефразируй инструкцию 2 без изменения смысла.
Попробуй другую формулировку — может сработает лучше.
Или поменяй порядок:
Попробуй выполнить инструкции в таком порядке:
сначала разбей на короткие предложения,
потом убери жаргон, потом замени канцелярит.
Результат:
Модель выдаст переписанный текст. Если не устроит — итеративно улучшай инструкции. Каждая инструкция в списке — отдельная ручка настройки. Можешь точечно улучшить, перефразировать или переставить конкретную инструкцию, не трогая остальные.
Почему это работает
Монолитный промпт ("переписать текст понятно для руководителя") даёт модели слишком много свободы. Модель интерпретирует по-своему — может убрать важные детали, добавить лишнее, или не решить ключевую проблему (например, оставить канцелярит).
Список инструкций — это явная декомпозиция задачи. Каждая строка — конкретное требование. Модель выполняет их по порядку, не додумывая. Когда инструкций несколько, модель меньше пропускает детали — каждое требование зафиксировано отдельной строкой.
Рычаги управления:
- Добавь/убери инструкцию — если результат не устраивает, добавь новое требование или убери лишнее
- Перефразируй — та же идея, другими словами → модель может понять лучше
- Поменяй порядок — иногда выполнение инструкций в другой последовательности даёт лучший результат
- Уточни конкретную инструкцию — например, "убери жаргон" → "убери жаргон или замени на простой аналог в скобках"
Исследователи использовали автоматический beam search для поиска лучших комбинаций, но ты можешь делать это вручную в чате — просить модель улучшить, перефразировать, или пробовать другой порядок.
Шаблон промпта
Я дам тебе {тип_контента}. Твоя задача — {цель_редактирования}.
Список инструкций:
- {инструкция_1}
- {инструкция_2}
- {инструкция_3}
- {инструкция_4}
- {инструкция_5}
[КОНТЕНТ]
Как заполнить:
{тип_контента}— что редактируешь (письмо, статья, презентация, пост){цель_редактирования}— что должно получиться (понятно для ЛПР, без ошибок, в стиле бренда){инструкция_N}— конкретное требование (одно действие на строку)
Правила хороших инструкций:
- Одна инструкция = одно действие
- Конкретно, не абстрактно: ❌ "улучши текст" → ✅ "замени пассивный залог на активный"
- Измеримо: ❌ "сделай короче" → ✅ "не больше 15 слов на предложение"
🚀 Быстрый старт — вставь в чат:
Вот шаблон APIO для создания промптов через список инструкций.
Адаптируй под мою задачу: [твоя задача].
Задавай вопросы, чтобы заполнить поля.
[вставить шаблон выше]
LLM спросит какой контент редактируешь, какая цель, и предложит 5-7 конкретных инструкций под твою задачу. Потом можешь улучшать их итеративно — попросить перефразировать, добавить новую, или поменять порядок.
Ограничения
⚠️ Требует примеры: Индукция промпта из примеров работает, если есть 3-5 качественных пар "вход → правильный выход". Без примеров — придётся писать инструкции вручную.
⚠️ Итеративный процесс: Одного прогона может не хватить. Метод предполагает улучшение через несколько итераций — проверил результат, подкрутил инструкцию, проверил снова.
⚠️ Не для всех задач: Метод показал лучшие результаты на задачах редактирования текста (исправление ошибок, упрощение). Для задач классификации или генерации с нуля — может не дать преимущества перед обычным промптом.
⚠️ Уступает файн-тюнингу: На исправлении грамматики APIO дал F0.5 = 59.40, что лучше других промптинговых методов (57.41), но сильно хуже SFT-моделей (72.80). Если нужна максимальная точность — промптинг не заменит обученную модель.
Как исследовали
Команда взяла два стандартных бенчмарка: BEA-2019 для исправления грамматики (4384 примера в train+dev) и ASSET для упрощения текста (2000 примеров в train+dev). Протестировали на GPT-4o-mini и GPT-4o.
Сначала модель индуцировала промпт из 3 случайных примеров — каждый пример давал одну инструкцию. Запустили 10 попыток, выбрали лучший промпт на валидации.
Потом оптимизировали через 15 итераций: на каждом шаге применяли три операции (Improve, Rephrase, Permute), получали 32 кандидата, брали лучших по метрике (Levenshtein distance на валидации). Добавили penalty за слишком большие изменения — чтобы не улететь далеко от стартового промпта.
Сравнили с baseline: zero-shot (простая инструкция без примеров), few-shot (3 примера в промпте), APIO-индукция-only (без оптимизации). APIO выиграл у всех промптинговых методов на обеих задачах.
Удивительно: метод индукции без оптимизации на GEC показал хуже (38.72), чем даже zero-shot (49.90) на GPT-4o-mini. Но после 15 итераций оптимизации — взлетел до 57.07. Это показывает что оптимизация критична — стартовый промпт может быть слабым, но процесс улучшения вытягивает.
Инсайт для практики: Даже если первая версия промпта не зашла — не бросай. Попробуй перефразировать инструкции или поменять порядок. Иногда небольшая корректировка формулировки даёт скачок в качестве.
Оригинал из исследования
Контекст: Исследователи использовали три meta-prompts для оптимизации. Ниже — промпт для операции Improve, который просит LLM улучшить инструкцию для снижения ошибок.
You are a super-talented prompt engineer. You are working on improvement of the Text
Simplification System.
The System has these Instructions:
- {instruction1}
- {instruction2}
- {instruction3}
Below are the examples of System's work:
Input 1: {input_text_1}
System's Output 1: {output_text_1}
Gold Output 1: {gold_output_text_1}
Error 1 between System's Output 1 and Gold Output 1 for given Input 1: {num1}
different words.
Input 2: {input_text_2}
System's Output 2: {output_text_2}
Gold Output 2: {gold_output_text_2}
Error 2 between System's Output 2 and Gold Output 2 for given Input 2: {num2}
different words.
Mean error for examples 1-2: {ave_num} words.
Suggest new instruction to augment existing instructions forcing the System's
Outputs to be exactly the same as Gold Outputs for the given System's Inputs. You
need to minimize Errors between System's Outputs and Gold Outputs. Put new
instruction between <new_instruction> and tags. Do not use no
more than two sentences. Do not mention Gold Output. Do not use "newline" symbols in
your answer. Prioritize fixing cases which have larger error (which have more
different words).
Промпт показывает модели текущие инструкции, примеры работы системы, и конкретные ошибки (сколько слов отличается). Потом просит предложить новую инструкцию, которая уменьшит ошибки. Приоритет — на случаях с большим количеством отличий.
Это автоматизированный процесс через API, но принцип применим вручную: покажи модели где она ошиблась и попроси улучшить конкретную инструкцию.
Адаптации и экстраполяции
💡 Адаптация для написания контента под бренд:
Вместо исправления ошибок — используй список инструкций для адаптации стиля под голос бренда.
Я дам тебе черновик поста для Instagram. Твоя задача — переписать в стиле
бренда [название].
Список инструкций:
- Используй короткие предложения (до 10 слов) и абзацы по 2-3 строки
- Добавь разговорные обороты и риторические вопросы для вовлечения
- Каждый абзац начинай с эмоционального крючка или провокационного утверждения
- Убери официоз и замени на живую речь (не "мы предлагаем", а "попробуй")
- Закончи призывом к действию в форме вопроса или вызова
[ЧЕРНОВИК]
Если результат не зашёл — улучши конкретную инструкцию: "Инструкция 3 не работает — посты всё равно звучат скучно. Переформулируй её жёстче."
🔧 Техника: Замени общие требования на метрики → точнее контроль
Оригинальный APIO использует Levenshtein distance (количество различающихся слов) как метрику для оптимизации. В твоём случае — придумай свою метрику.
Вместо:
- Сделай текст проще
Напиши:
- Разбей предложения длиннее 20 слов. Целевое: 12-15 слов на предложение.
Вместо:
- Убери жаргон
Напиши:
- Замени каждый термин на аналог из списка: [термин → простое слово].
Если аналога нет — объясни термин в скобках одним предложением.
Числовые ограничения и конкретные правила дают модели меньше свободы — она выполняет требования точнее.
🔧 Техника: Тестируй порядок инструкций
APIO использует операцию Permute — случайная перестановка инструкций. Порядок влияет на результат, потому что модель выполняет инструкции последовательно.
Попробуй два варианта:
Вариант 1: Сначала структура, потом стиль
1. Разбей на короткие предложения
2. Убери жаргон
3. Замени канцелярит
Вариант 2: Сначала стиль, потом структура
1. Замени канцелярит
2. Убери жаргон
3. Разбей на короткие предложения
Иногда результат сильно отличается. Если модель сначала упрощает стиль, а потом разбивает предложения — может потерять детали. Если наоборот — сохранит больше информации.
Ресурсы
APIO: Automatic Prompt Induction and Optimization for Grammatical Error Correction and Text Simplification
Artem Chernodub (Zendesk), Aman Saini, Yejin Huh, Vivek Kulkarni, Vipul Raheja (Grammarly)
Accepted at RANLP 2025 (Recent Advances in Natural Language Processing)
Код и данные: https://github.com/achernodub/apio
