Few Shot Prompting

Добавление в промпт нескольких примеров решённой задачи, чтобы модель поняла ожидаемый формат и суть. Градации: zero-shot (только описание задачи), one-shot (1 пример), few-shot (несколько). Это in-context learning — веса модели НЕ меняются.

Суть

Модель «подхватывает» паттерн прямо из контекста запроса: показав 2–3 примера «вход → выход», вы конкретизируете задачу лучше, чем длинным текстовым описанием.

Зачем это нужно

Дешёвый способ поднять качество без дообучения (см. LLM Training Stages): примеры задают формат вывода и уточняют намерение. Особенно помогает на классификации, разметке, специфичных форматах. Оговорка: «улучшает не всегда и не везде», но на многих задачах/моделях — заметно.

Как работает

  • Zero-shot: только описание задачи («переведи с английского на французский: …»).
  • One-shot: описание + 1 пример решения.
  • Few-shot: описание + несколько примеров.
  • Это называют in-context learning: модель «учится» по примерам в контексте, без обновления градиентов (есть и техники few-shot с обновлением градиентов — это уже другое).
  • Что именно переносят примеры — не то, что кажется. Замер с намеренно перепутанными ответами в примерах показал, что правильность самих ответов вносит гораздо меньше, чем ожидается; основной вклад дают набор допустимых меток, распределение входного текста и формат. То есть примеры показывают модели форму задачи, а не учат её решать. Практических следствий два: примеры обязаны покрывать все метки и быть похожими на настоящий вход, а вылизывать в них правильность ответа до последнего — не там, где лежит выигрыш.
  • Способность к emergent few-shot проявилась с ростом моделей (GPT-3).
  • «Запекание» примеров в системный промпт (Anthropic): примеры — главный способ «раздвинуть границы» приложения. Организуй feedback loop: где модель ошиблась — добавляй этот кейс в example set, чтобы в следующий раз она ссылалась на него. Сильнее всего помогает на пограничных/сложных случаях.

Пример

Задача: классифицируй запрос → [навигационный | информационный | транзакционный]
Пример: "сайт сбербанка" → навигационный
Пример: "как испечь хлеб"  → информационный
Пример: "купить iphone 15" → транзакционный
Запрос: "погода в москве" →

Сколько примеров и как их выбирать

Количество. Отдача убывающая и быстро: основной прирост даёт переход от нуля к одному-двум примерам — модель понимает формат и уровень детализации. Дальше кривая выполаживается, а стоимость растёт линейно, причём дважды: примеры занимают контекст и оплачиваются как входные токены на каждом запросе, а не один раз. Стабильный набор примеров при этом хорошо кэшируется, если стоит в начале промпта (Prompt Caching) — это и есть способ сделать few-shot дешёвым.

Признак, что примеров слишком много: модель начинает копировать их содержание, а не форму — в ответах всплывают сущности из примеров. Это не «мало примеров, добавим ещё», а сигнал сократить и разнообразить.

Подбор. Главный риск — не малое число, а смещение: если все примеры одного типа, модель считает этот тип нормой и на остальных случаях отвечает хуже, чем без примеров вовсе. Отсюда правило: примеры покрывают разные классы входа, включая пограничные и тот случай, где правильный ответ — отказ или уточняющий вопрос. Последнее забывают чаще всего, и в результате модель, обученная примерами всегда отвечать, не умеет сказать «данных нет».

Практический источник примеров — тот же eval-набор со срезами (Agent Evals): он уже собран по классам входа, и брать примеры оттуда надёжнее, чем придумывать.

Связано с

  • Prompt Engineering — few-shot как техника внутри «контракта»
  • Chain of Thought — часто комбинируют: примеры + рассуждения
  • LLM Training Stages — in-context vs реальное дообучение