Few-shot промптинг: примеры в запросе вместо долгих объяснений

Few-shot — несколько примеров правильного ответа прямо в промпте. Разбираем, когда это помогает, как оформлять примеры и как посчитать, окупаются ли они.

5 мин · · разработка · автоматизация

Few-shot промптинг — это несколько примеров «вход → правильный выход» прямо в запросе к модели. Вместо длинного описания формата вы показываете два-три образца, и модель продолжает в том же духе. Приём полезный, но примеры отправляются с каждым запросом и стоят токенов. Ниже — когда few-shot помогает, как оформлять примеры, какие ошибки встречаются чаще всего и как посчитать, окупаются ли примеры.

Как работает few-shot

Zero-shot, без примеров:

Преобразуй текст в JSON с полями name и age. Текст: "John is 30 years old"

Модель сама решает, как оформить ответ: добавить ли пояснение, обернуть ли JSON в блок кода, строкой или числом записать возраст.

Few-shot, с примерами:

Преобразуй текст в JSON с полями name и age. Отвечай только JSON. Текст: "Alice is 25 years old" JSON: {"name": "Alice", "age": 25} Текст: "Bob, 40" JSON: {"name": "Bob", "age": 40} Текст: "John is 30 years old" JSON:

Примеры задают формат точнее любого описания: видно, что возраст — число, что лишнего текста нет и что вход бывает разным.

Когда few-shot помогает

Нестандартный формат вывода. Внутренняя разметка, особый вид отчёта, строгий порядок полей — всё, что трудно описать словами.

Неочевидные правила классификации. Например, нужно не только определить тональность, но и коротко объяснить причину:

Определи тональность и коротко объясни причину. Текст: "Доставка опоздала на неделю" Ответ: {"sentiment": "negative", "reason": "задержка доставки"} Текст: "Курьер приехал раньше срока" Ответ: {"sentiment": "positive", "reason": "доставка быстрее ожидаемого"} Текст: "Заказ пришёл в обычный срок" Ответ:

Свой синтаксис. Если ответ должен быть в формате вашей системы, один образец часто полезнее абзаца объяснений:

Преобразуй задачу в команду внутри блока [EXEC]. Задача: "Найди все файлы .txt в папке /home" [EXEC] find /home -name "*.txt" [/EXEC] Задача: "Посчитай строки во всех файлах .py в текущей папке"

Когда примеры не нужны

  • Простой ответ. Если нужно одно слово из короткого списка («positive, negative или neutral»), хватит инструкции и перечня вариантов.
  • Формат, который задаётся схемой. Для JSON можно описать поля и типы или использовать structured output, если ваш клиент его поддерживает.
  • Много однотипных примеров. Десять похожих образцов почти не добавляют информации по сравнению с тремя разными, а токенов стоят втрое больше.

Как оформлять примеры

Через messages (рекомендуется для API)

Каждый пример — пара сообщений user и assistant, а настоящий запрос идёт последним:

bash
messages = [
    {"role": "system", "content": "Classify sentiment. Answer with one word: positive, negative or neutral."},
    {"role": "user", "content": "Доставка опоздала на неделю"},
    {"role": "assistant", "content": "negative"},
    {"role": "user", "content": "Курьер приехал раньше срока"},
    {"role": "assistant", "content": "positive"},
    {"role": "user", "content": "Заказ пришёл в обычный срок"},
    {"role": "assistant", "content": "neutral"},
    {"role": "user", "content": "Отличный сервис, спасибо!"},
]

Модель видит примеры как свои прошлые ответы, и граница между образцами и настоящим запросом получается чёткой.

В одном тексте

Когда интерфейс позволяет отправить только одно сообщение, используйте явные метки и одинаковое оформление для всех примеров:

Вход: "Доставка опоздала на неделю" Выход: negative Вход: "Курьер приехал раньше срока" Выход: positive Вход: "Отличный сервис, спасибо!" Выход:

Типичные ошибки

Реальные данные в примерах

Если в образцах реальные номера, адреса или имена, модель может перенести их в ответ на другой запрос. Для маскирования и извлечения данных берите заведомо синтетические значения: 000-00-0000, user@example.com.

Перекос в примерах

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

Ошибка в образце

Модель повторяет то, что видит. Опечатка в ключе JSON или неверный ответ в одном примере перейдут в результат. Проверяйте примеры так же внимательно, как код.

Слишком похожие примеры

Если образцы почти одинаковые, модель может копировать их структуру там, где задача требует другой. Достаточно трёх-пяти разных примеров.

Сколько стоят примеры

Примеры отправляются с каждым запросом как входные токены. Формула:

стоимость примеров = токены_примеров × число_запросов × цена_входа / 1 000 000

Цены Zukko за 1M токенов (вход и выход одинаковые): claude-sonnet-5 и gpt-5.6-sol — $0.3, glm-5.3 — $0.1, glm-5.3-flash — $0.04. Актуальный список моделей и цен — GET https://api.zukko.pro/v1/models или страница «Модели» в кабинете.

Пример: пять примеров по 50 токенов, всего 250 токенов на запрос.

  • 10 000 запросов × 250 токенов = 2 500 000 токенов;
  • на claude-sonnet-5: 2.5 × $0.3 = $0.75;
  • на glm-5.3-flash: 2.5 × $0.04 = $0.10.

Окупаются ли примеры? Пусть без них ответ в среднем занимает 500 токенов, а с ними — 400. Экономия на выходе — 100 токенов на запрос, расход на примеры — 250. В Zukko вход и выход стоят одинаково, поэтому достаточно сравнить токены: 400 + 250 = 650 против 500. С примерами получается дороже. По одному только размеру ответа примеры окупятся, если сократят его минимум на 250 токенов, то есть вдвое. Обычно few-shot окупается иначе: меньше брака, повторных запросов и ручных исправлений. Это и нужно измерять.

Оговорка про кэш: у вендора повторяющееся начало промпта можно кэшировать, и чтение из кэша стоит около 10% входной цены. В Zukko кэшированные токены оплачиваются по обычной входной цене. Поэтому для запросов с большим одинаковым блоком примеров разница с официальным прайсом меньше, чем при прямом сравнении цен.

Код: few-shot на Python

bash
from openai import OpenAI

client = OpenAI(
    base_url="https://api.zukko.pro/v1",
    api_key="fetch_ваш_ключ",
)

EXAMPLES = [
    ("Доставка опоздала на неделю", "negative"),
    ("Курьер приехал раньше срока", "positive"),
    ("Заказ пришёл в обычный срок", "neutral"),
]

response.usage.prompt_tokens показывает, сколько входных токенов заняли инструкция, примеры и запрос. По этой цифре видно, во что обходятся примеры. Подробнее о формате запроса — в справке по chat completions, ключ создаётся в кабинете.

Как проверить, помогает ли few-shot

  1. Соберите 30–50 реальных входов с известными правильными ответами.
  2. Прогоните их без примеров и с примерами на одной и той же модели.
  3. Сравните долю правильных ответов и средний расход токенов из usage.
  4. Повторите на другой модели из списка: результат зависит от модели и задачи, переносить его вслепую не стоит.

Частые вопросы

Сколько примеров нужно?

Для формата обычно хватает одного-двух. Для неочевидной логики — трёх-пяти разных. Больше имеет смысл, только если тест показывает рост точности.

Нужны ли примеры для классификации на 10 и больше классов?

Примеры должны покрывать хотя бы самые частые и самые похожие друг на друга классы. Если примеров по всем классам выходит слишком много, лучше дать список классов с короткими определениями и примеры только для спорных случаев.

Можно ли использовать few-shot со стримингом?

Да. Примеры передаются в messages как обычно. При стриминге проверяйте if chunk.choices: перед chunk.choices[0], потому что последний чанк приходит с usage и пустым choices.

Работает ли few-shot одинаково на всех моделях?

Нет, отклик на примеры у моделей разный. Проверяйте на своих данных по методу выше, прежде чем выбирать модель и число примеров.

zukko

Платите в 25×
меньше

за Claude Code & ChatGPT

Один ключ fetch_* и base URL api.zukko.pro — в Cursor, Claude Code, Codex и любом SDK.