3,583 papers
arXiv:2510.12637 87 14 окт. 2025 г. FREE

COSTAR-A: добавь "Answer" — и модель выберет один вариант

КЛЮЧЕВАЯ СУТЬ
Проблема: Маленькие локальные LLM (1-8B параметров) на вопросах с выбором вариантов часто возвращают пустой ответ или перечисляют все варианты вместо одного. Спрашиваешь "Сколько вам лет?" с вариантами 18-24, 25-34 — модель либо молчит, либо пишет весь список. COSTAR-A позволяет заставить маленькую модель дать конкретный выбор вместо молчания или ухода от ответа. Фишка: добавь блок # Answer # в конец промпта COSTAR — и модель понимает "здесь моя очередь генерировать". Yi-Coder-1.5B с 0% до 100% решительности, Llama 3.1-8B с 0% до 57%.
Адаптировать под запрос

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.

Часть B7 демографических вопросов с выбором варианта (возраст, доход, образование, пол, ориентация). К двум моделям добавили 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)


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

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

Проблема: Маленькие локальные LLM (1-8B параметров) на вопросах с выбором вариантов часто возвращают пустой ответ или перечисляют все варианты вместо одного. Спрашиваешь "Сколько вам лет?" с вариантами 18-24, 25-34 — модель либо молчит, либо пишет весь список. COSTAR-A позволяет заставить маленькую модель дать конкретный выбор вместо молчания или ухода от ответа. Фишка: добавь блок # Answer # в конец промпта COSTAR — и модель понимает "здесь моя очередь генерировать". Yi-Coder-1.5B с 0% до 100% решительности, Llama 3.1-8B с 0% до 57%.

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

COSTAR — это 6 блоков с хэштегами: Context (контекст), Objective (цель), Style (стиль), Tone (тон), Audience (аудитория), Response (формат ответа). COSTAR-A добавляет седьмой блок — # Answer # в самый конец. Это не код, просто хэштеги и пустая строка после них. Пустая строка работает как триггер генерации — модель видит "поле для ответа" и заполняет его. Без этого блока маленькая модель может зависнуть — не понять что от неё ждут текст прямо сейчас.

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

Маленькие модели (до 8B параметров) плохо выводят намерение из контекста. Если промпт не содержит явной команды "дай ответ", модель не понимает что нужна генерация. Большие модели (GPT-4, Claude) сами "догадываются", маленькие — нет. Хэштеги работают как делимитеры — модель видит чёткую границу "здесь инструкции, здесь моё поле". Пустая строка после # Answer # = сигнал к генерации. Модель "дописывает" текст после этого маркера. Формат похож на бланк документа с полем "Ваш ответ: _____" — модель видит пробел и заполняет. Qwen2.5-3B показала обратный эффект (85.7% с COSTAR упала до 28.6% с COSTAR-A) — у каждой модели свои "привычки" реагировать на структуру.

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

Маркетинг и исследования → создание синтетических персонажей и симуляция их ответов на анкеты, особенно когда используешь маленькие локальные модели (1-8B параметров) на своём железе. Подходит для закрытых вопросов с выбором вариантов (демография, предпочтения, множественный выбор). НЕ подходит для открытых вопросов типа "Что вы думаете о..." — там обычный COSTAR работает так же хорошо.

Мини-рецепт

1. Контекст: Опиши персонажа который отвечает — возраст, профессия, доход, ситуация. Пример: # Контекст # Ты отвечаешь от лица Марины, 32 года, маркетолог из Питера, зарплата 150к
2. Цель: Укажи что нужно сделать и сам вопрос с вариантами. Пример: # Цель # Выбери ОДИН вариант. Вопрос: "Ваш размер одежды?" Варианты: XS, S, M, L, XL
3. Стиль, Тон, Аудитория: Задай как отвечать и для кого. Можно пропустить если задача простая — сэкономишь токены. Пример: # Стиль # Прямой, без объяснений. # Тон # Нейтральный. # Аудитория # Исследователи
4. Формат ответа: Уточни формат — только один вариант, без комментариев. Пример: # Формат ответа # Только один вариант из списка, ничего лишнего
5. Триггер генерации: Добавь в самый конец # Answer # и пустую строку. Модель увидит пустое поле и начнёт заполнять.

Примеры

[ПЛОХО] : Ответь на вопрос: "Ваш возраст?" Варианты: 18-24, 25-34, 35-44, 45-54, 55+ (Маленькая модель вернёт пустую строку или перечислит все варианты)
[ХОРОШО] : # Контекст # Ты отвечаешь от лица Алексея, 29 лет, программист из Москвы, работает в стартапе, холост. # Цель # Выбери ОДИН вариант. Вопрос: "Ваш возраст?" Варианты: 18-24, 25-34, 35-44, 45-54, 55+. # Стиль # Прямой. # Тон # Нейтральный. # Аудитория # Маркетологи для сегментации. # Формат ответа # Только один вариант, без объяснений. # Answer # (Модель выдаст конкретный выбор: "25-34")
Источник: COSTAR-A: A prompting framework for enhancing Large Language Model performance on Point-of-View questions
ArXiv ID: 2510.12637 | Сгенерировано: 2026-01-11 23:30

Концепты не выделены.

📖 Простыми словами

COSTAR-A: добавь "Answer" — и модель выберет один вариант

arXiv: 2510.12637

LLM — это не телепаты, они работают на предсказании следующего слова, и иногда им банально не хватает «пинка», чтобы начать говорить. Когда ты даешь модели сложную инструкцию с кучей условий, она может просто зависнуть в анализе и выдать какую-то невнятную рефлексию вместо результата. Фреймворк COSTAR-A решает эту проблему, добавляя в конец промпта седьмой элемент — Answer. Это явный триггер, который переключает нейронку из режима «я изучаю условия» в режим «я выдаю конкретный ответ здесь и сейчас».

Это как если бы ты полчаса объяснял официанту, что любишь прожарку медиум-рэйр, ненавидишь лук и хочешь сидеть у окна, но в конце забыл сказать: «Неси стейк». Официант все понял, записал, но продолжает стоять и смотреть на тебя, потому что команда к действию не прозвучала. Маленькие модели до 8B параметров ведут себя именно так: они тонут в контексте и забывают, что от них вообще-то ждут выбора конкретного варианта.

Метод раскладывает задачу на атомы: Context (кто ты), Objective (что делаем), Style и Tone (как пишем), Audience (для кого) и Response (в каком формате). Но магия случается на последнем этапе — Answer. Ты буквально оставляешь пустую строку после этого слова, и модель воспринимает это как команду «фас». Это критично для закрытых вопросов, где нужно выбрать один вариант из списка, а не пускаться в пространные рассуждения о жизни.

Хотя метод тестировали на выборе ответов, он идеально ложится на любую симуляцию персонажей. Если тебе нужно, чтобы нейронка прикинулась вредным клиентом или студентом-новичком и оценила твой лендинг, обычный промпт может выдать сухую аналитику. COSTAR-A заставляет модель «включить» роль на полную катушку. Принцип универсален для любых задач, где важна точность попадания в роль, будь то написание кода, создание рекламных креативов или проверка гипотез.

Главный вывод: чем меньше и глупее модель, тем сильнее ей нужен этот финальный триггер. Если ты используешь локальные нейронки или недорогие API, забудь про надежду на их интуицию. Используй структуру из 7 элементов, всегда заканчивай директивой на ответ, и ты увидишь, как количество «тупняков» и пустых ответов сокращается в разы. SEO для промптов теперь выглядит именно так — четко, структурно и с обязательным пинком в конце.

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

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

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