TL;DR
COSTAR-A — это улучшенная версия известного фреймворка промптинга COSTAR, которая добавляет седьмой компонент "Answer" в конец промпта. COSTAR расшифровывается как Context (контекст), Objective (цель), Style (стиль), Tone (тон), Audience (аудитория), Response (формат ответа). COSTAR-A добавляет явную директиву "Answer" (ответ), которая заставляет модель дать конкретный ответ, а не молчать или уходить от прямого выбора.
Исследователи обнаружили критическую слабость маленьких локальных моделей (1-8 миллиардов параметров): на вопросы с выбором вариантов (point-of-view questions) они часто возвращают пустой ответ или перечисляют все варианты вместо одного. Особенно это проявляется на демографических вопросах типа "Сколько вам лет?" с вариантами "18-24", "25-34" и т.д. Без явной команды "дай ответ" модель либо молчит, либо пишет "варианты: 18-24, 25-34, 35-44..." вместо выбора одного. Причина — маленькие модели не так уверенно "достраивают" намерение промпта, как большие GPT-4 или Claude. Им нужна более явная инструкция.
COSTAR-A решает это прямолинейно: в самом конце промпта добавляется блок # Answer # (просто хэштеги и слово, никакого кода). Это триггерит модель на генерацию конкретного ответа. Llama 3.1-8B с COSTAR давала пустые выводы или повторяла промпт целиком, а с COSTAR-A — выбирала один вариант из списка в 4 из 7 вопросов (57%). Yi-Coder-1.5B вообще молчала с COSTAR (0%), а с COSTAR-A — 100% решительности. Метод особенно полезен для маленьких локальных моделей, которые работают на своем железе без облака.
Схема метода
1. CONTEXT → Кто отвечает, какой контекст
2. OBJECTIVE → Что нужно сделать (выбрать один вариант)
3. STYLE → Стиль ответа (прямой, разговорный)
4. TONE → Тон (дружелюбный, нейтральный)
5. AUDIENCE → Для кого ответ (исследователи, админы)
6. RESPONSE → Формат (только один вариант из списка)
7. ANSWER → [Пустая строка — триггер генерации]
Все блоки в одном промпте. Модель видит структуру, доходит до # Answer # и понимает — надо дать конкретный ответ.
Пример применения
Задача: Маркетолог Настя из онлайн-школы английского готовит A/B-тест email-рассылки. Ей нужно создать 5 персонажей учеников разного возраста и дохода, чтобы протестировать как письмо зайдет каждому сегменту. Вместо ручного заполнения табличек, она просит модель симулировать ответы на анкету от лица вымышленных персон.
Промпт:
# Контекст #
Ты отвечаешь на анкету от лица Дениса — 28-летнего менеджера среднего звена из Москвы, который хочет подтянуть английский для работы. Зарплата 120 тысяч рублей, высшее образование (бакалавр экономики), живёт с женой в съёмной квартире.
# Цель #
Ответь на этот вопрос из демографической анкеты, выбрав ОДИН вариант из предложенных. Вопрос: "Каков ваш годовой доход?" Варианты: "до 500 тыс.", "500 тыс. - 1 млн", "1 млн - 2 млн", "более 2 млн", "не хочу отвечать".
# Стиль #
Прямой, без лишних объяснений.
# Тон #
Нейтральный, деловой.
# Аудитория #
Маркетологи, которые строят сегменты пользователей.
# Формат ответа #
Выбери ТОЛЬКО один вариант из списка. Никаких комментариев.
# Answer #
Результат:
Модель выдаст один вариант: "500 тыс. - 1 млн" (Денис с зарплатой 120к * 12 месяцев ≈ 1.44 млн попадает в этот диапазон).
Без блока # Answer # маленькая модель может:
- Вернуть пустую строку
- Написать все варианты через запятую
- Повторить промпт целиком
С блоком # Answer # — конкретный выбор, готовый к вставке в таблицу сегментации.
Почему это работает
Слабость маленьких LLM: Модели до 8B параметров хуже инферят намерение из контекста. Если промпт не содержит явной команды "дай ответ", модель может "зависнуть" — не понять, что от неё ждут генерацию текста прямо сейчас. Это проявляется на закрытых вопросах (multiple choice), где нужен конкретный выбор. Большие модели (GPT-4, Claude) сами "понимают" что надо выбрать, маленькие — нет.
Сильная сторона LLM: Модели хорошо реагируют на структурированные триггеры. Хэштеги (# Answer #) работают как делимитеры — модель видит чёткую границу "здесь заканчиваются инструкции, здесь начинается моё поле для ответа". Пустая строка после # Answer # — это сигнал к генерации. Модель "дописывает" текст после этого маркера.
Как метод использует сильную сторону: COSTAR-A эксплицитно указывает место для ответа через структуру с хэштегами. Это снижает неопределённость для маленьких моделей. Вместо "догадайся что я хочу" промпт говорит "вот все инструкции, а теперь — ANSWER — твоя очередь". Формат похож на шаблон документа с полем "Ваш ответ: _____" — модель видит пробел и заполняет его.
Рычаги управления:
- Количество компонентов: Можно убрать Style/Tone если задача простая — сэкономишь токены, ускоришь ответ
- Формулировка блока Response: Замени "один вариант" на "топ-3 варианта по приоритету" → модель выдаст ранжированный список
- Позиция Answer: Если переместить
# Answer #в середину → модель начнёт генерировать раньше, но может пропустить последние инструкции - Использование делимитеров: Вместо
#можно использовать===или---— работает, но хэштеги стали стандартом после победы COSTAR на конкурсе Singapore GPT-4 Prompt Engineering Competition
Шаблон промпта
# Контекст #
{Описание персонажа или ситуации: кто отвечает, какой бэкграунд}
# Цель #
{Что нужно сделать: выбрать один вариант, ответить на вопрос}
Вопрос: "{текст_вопроса}"
Варианты: {список_вариантов_через_запятую}
# Стиль #
{Стиль ответа: прямой / разговорный / официальный}
# Тон #
{Тон: нейтральный / дружелюбный / строгий}
# Аудитория #
{Для кого ответ: исследователи / менеджеры / клиенты}
# Формат ответа #
{Формат: только один вариант / короткий ответ / одно предложение}
# Answer #
Что подставлять:
{Описание персонажа}— кто отвечает: возраст, профессия, контекст{текст_вопроса}— сам вопрос из анкеты{список_вариантов}— варианты ответа через запятую или список{Стиль},{Тон},{Аудитория}— настройки под задачу{Формат}— "только один вариант", "без объяснений", "одним словом"
🚀 Быстрый старт — вставь в чат:
Вот шаблон COSTAR-A для создания ответов персонажа на анкеты. Адаптируй под мою задачу: мне нужно создать 3 персонажа клиентов интернет-магазина одежды и сгенерировать их ответы на вопрос "Ваш размер одежды?" с вариантами XS/S/M/L/XL/XXL. Задавай вопросы, чтобы заполнить поля.
[вставить шаблон выше]
LLM спросит кто эти персонажи (возраст, пол, стиль) и какой контекст (онлайн-шоппинг, случайная выборка) — потому что ей нужно понять какие размеры вероятны для каждого персонажа. Она возьмёт паттерн из шаблона и подставит конкретные данные.
Ограничения
⚠️ Не универсально для всех моделей: Qwen2.5-3B показала лучшие результаты с обычным COSTAR (85.7% решительности), а с COSTAR-A упала до 28.6%. У каждой модели свои "привычки" реагировать на структуру промпта.
⚠️ Требует адаптации: Llama 3.1-8B улучшилась с 0% до 57% решительности, Yi-Coder-1.5B — с 0% до 100%, но это не значит что любая модель выстрелит с COSTAR-A. Нужно тестировать на конкретной модели.
⚠️ Длинный промпт = много токенов: Вся структура из 7 блоков съедает 200-300 токенов на инструкции. Если у тебя лимит 50 токенов на ответ (как в исследовании), промпт займёт бóльшую часть контекста. Для простых задач можно убрать Style/Tone/Audience — оставить только Context, Objective, Response, Answer.
⚠️ Не для открытых вопросов: Метод создавался для закрытых вопросов (выбор из вариантов). На открытых вопросах типа "Что ты думаешь о климатических изменениях?" COSTAR-A не даёт преимущества — обычный COSTAR или даже простой промпт работают так же хорошо.
Как исследовали
Команда из Kennesaw State University (США) взяла 5 маленьких локальных моделей (Yi-Coder-1.5B, Starcoder2-3B, Deepseek-1.3B, Qwen2.5-3B, Phi3-mini-3.8B) и прогнала через два этапа тестов.
Часть A — открытые вопросы (факты, мнения, арифметика, суммаризация). Сравнивали Context-Aware Prompt (CAP — простой вопрос + контекст + "Answer") и COSTAR (структура из 6 блоков). Оценивали три метрики: правильность (верный ответ), скорость (сколько секунд на 5 вопросов), самоумолчание (модель не пишет "я — AI ассистент" и не повторяет промпт). Лучшие две модели — Yi-Coder-1.5B и Qwen2.5-3B — прошли в часть B.
Часть B — 7 демографических вопросов с выбором варианта (возраст, доход, образование, пол, ориентация). К двум моделям добавили Llama 3.1-8B как бенчмарк. Сначала пробовали обычный COSTAR — Yi-Coder и Llama вообще молчали (0% решительности) или возвращали пустой промпт. Llama 3.1-8B даже с отключенным streamer (функция, которая чистит вывод) повторяла весь промпт вместо ответа. Тогда добавили блок # Answer # в конец → Yi-Coder выстрелила до 100%, Llama — до 57%. Qwen, наоборот, упала с 85.7% до 28.6%.
Почему результаты такие разные? Исследователи поняли: маленькие модели по-разному обучены реагировать на структуру. Yi-Coder и Llama, видимо, тренировались на датасетах где промпты заканчивались явным "Answer:" или "Output:". Qwen — на более "свободных" промптах без жёстких маркеров. Поэтому блок # Answer # для одних — триггер, для других — шум.
Удивительная находка: Скорость не коррелирует с качеством. Deepseek-1.3B был самым быстрым (38 секунд на 5 вопросов), но худшим по правильности — модель просто копировала вопрос вместо ответа. Быстро, но бесполезно. Yi-Coder была в 1.5 раза медленнее (58 сек), зато давала годные ответы.
Инсайт для практики: Если твоя локальная модель молчит или даёт "размытые" ответы на закрытые вопросы — добавь # Answer # в конец промпта. Это почти бесплатно (2 токена), но может разблокировать поведение модели. Если не помогло — значит модель не из "семьи" где этот триггер работает, попробуй другую структуру.
Оригинал из исследования
Контекст: Исследователи тестировали COSTAR-A на демографическом вопросе "How old are you?" с персонажем Jake — 20-летний студент психологии из Калифорнии. Вот оригинальный промпт на английском:
# Context #
You are answering this survey as Jake, a 20-year-old American male psychology student in California who enjoys socializing, mental health topics, and sports.
# Objective #
Answer this multiple choice question by selecting one of the options provided without any further explanation.
The question is: 'How old are you?'. The 7 options are ['Under 18', '18-24 years old', '25-34 years old', '35-44 years old', '45-54 years old', '55-64 years old', '65+ years old']
# Style #
Straightforward, conversational, relatable, clear, and factual.
# Tone #
Friendly, open, and reflective.
# Audience #
Survey administrators and researchers interested in American college students' perspectives.
# Response #
Select only the correct option from the list that captures Jake's viewpoint as a college student.
# Answer #
Результаты моделей:
- Yi-Coder-1.5B с COSTAR → пустая строка (
" ") - Yi-Coder-1.5B с COSTAR-A →
25-34 years old(ошибка, Jake 20 лет, правильно 18-24) - Qwen2.5-3B с COSTAR →
18-24 years old+ длинное объяснение про контекст - Qwen2.5-3B с COSTAR-A →
['18-24 years old']+ ещё более длинное объяснение - Llama 3.1-8B с COSTAR → повторение всего промпта
- Llama 3.1-8B с COSTAR-A →
18-24 years old(чистый ответ)
Видно что блок # Answer # заставил Yi-Coder и Llama дать конкретный выбор вместо молчания или повторения. Qwen работала и без него, но COSTAR-A сделала ответ менее чистым (добавились квадратные скобки и лишний текст).
Адаптации и экстраполяции
💡 Адаптация для генерации synthetic data
Если тебе нужно создать датасет из 1000 вымышленных профилей пользователей для тестирования продукта, используй COSTAR-A в цикле с разными персонажами.
Пример:
# Контекст #
Ты отвечаешь на опрос от лица Марины — 34-летняя директор по маркетингу в IT-стартапе, Санкт-Петербург, доход 250 тыс./месяц, замужем, двое детей.
# Цель #
Ответь на вопрос: "Как часто вы пользуетесь сервисами доставки еды?"
Варианты: "каждый день", "2-3 раза в неделю", "раз в неделю", "раз в месяц", "никогда"
# Стиль #
Реалистичный, как отвечает живой человек
# Тон #
Нейтральный
# Аудитория #
Аналитики продукта
# Формат ответа #
Только один вариант без комментариев
# Answer #
Меняй описание персонажа (Марина → Андрей, 22 года, курьер, доход 50к) → получаешь разные ответы для разных сегментов.
🔧 Техника: убери Style/Tone/Audience → токены для ответа
Если модель упирается в лимит токенов и обрезает ответ на середине, сократи промпт до минимума:
# Контекст #
{персонаж}
# Цель #
{вопрос + варианты}
# Формат ответа #
Только один вариант
# Answer #
Убрали 3 блока → освободили ~50-100 токенов → модель может сгенерировать полный ответ вместо обрезанного. Для простых задач (возраст, пол) детали стиля не критичны.
🔧 Техника: замени # Answer # на Ответ персонажа: для русских моделей
Если работаешь с русскоязычными моделями (Yandex GPT, GigaChat, ruGPT), хэштеги могут работать хуже — модели обучались на русских текстах где структура другая. Попробуй:
Контекст:
{персонаж}
Задача:
{вопрос}
Ответ персонажа:
Без хэштегов, но с явной меткой "Ответ персонажа:" — триггерит генерацию так же эффективно.
💡 Экстраполяция: COSTAR-A для агентов с принятием решений
Если строишь AI-агента который должен выбирать действие из списка (например, бот поддержки выбирает "эскалировать в support / ответить сам / перенаправить в FAQ"), используй ту же схему:
# Контекст #
Ты — бот поддержки магазина электроники. Пользователь написал: "Мой телефон не включается после обновления".
# Цель #
Выбери ОДНО действие из списка:
1. Эскалировать в техподдержку
2. Предложить сброс до заводских настроек
3. Перенаправить в раздел FAQ по обновлениям
4. Запросить больше информации
# Стиль #
Чёткий, техничный
# Тон #
Помогающий
# Аудитория #
Внутренняя система маршрутизации обращений
# Формат ответа #
Только номер действия
# Answer #
Модель выдаст: 1 или 2 — можно парсить и автоматически роутить обращение. Без # Answer # модель может написать "Я рекомендую выбрать действие 1 или 2" → не парсится.
Ресурсы
COSTAR-A: A prompting framework for enhancing Large Language Model performance on Point-of-View questions — Nzubechukwu C. Ohalete, Kevin B. Gittner, Lauren M. Matheny, School of Data Science and Analytics, Kennesaw State University, Georgia, USA.
Оригинальная статья COSTAR: How I Won Singapore's GPT-4 Prompt Engineering Competition — Sheila Teo, GovTech Data Science & AI Team (https://towardsdatascience.com/how-i-won-singapores-gpt-4-prompt-engineering-competition-34c195a93d41)
