Нулевой, одно- и малообразцовый режим
Выбор количества примеров
«Нулевой, одно- и малообразцовый режим» — бесплатный урок AI Prompt Engineering на CoddyKit. Это урок 1 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения AI Prompt Engineering, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс AI Prompt Engineering содержит 4 уроков всего.
Спектр количества примеров
Примеры обозначают количество размеченных демонстраций, размещённых в промпте перед текущим запросом. Обучение без примеров полностью опирается на предварительно обученные представления модели; обучение на небольшом числе примеров настраивает модель на небольшое распределение, специфичное для задачи, во время вывода без изменения весов.
Это обучение в контексте (ICL): трансформер рассматривает примеры как часть последовательности и неявно выполняет над ними своего рода метаобученную регрессию. Выбор значения k (количества примеров) — это гиперпараметр, который следует подбирать эмпирически, а не фиксированная универсальная рекомендация.
from dataclasses import dataclass
@dataclass
class ICLConfig:
k: int # number of demonstrations
selection: str # 'static' | 'dynamic'
order: str # 'random' | 'similarity' | 'curriculum'
# Zero-shot is simply k=0
cfg = ICLConfig(k=0, selection='static', order='random')Когда выигрывает режим без примеров
Предпочитайте режим без примеров, когда задача хорошо представлена в данных предварительного обучения (суммирование, перевод, распространённая классификация) и когда примеры могут исказить формат вывода. Для моделей, настроенных на выполнение инструкций, чёткая директива вместе со схемой вывода часто оказывается эффективнее примеров, которые незаметно задают стиль.
Режим без примеров также сводит к минимуму стоимость токенов и задержку, а ещё позволяет избежать смещения к преобладающей метке, при котором модель чрезмерно часто предсказывает класс, преобладающий в ваших примерах.
# Zero-shot with explicit schema beats vague few-shot
PROMPT = (
'Classify sentiment as POSITIVE, NEGATIVE, or NEUTRAL.\n'
'Respond with only the label.\n\n'
'Text: ' + user_text + '\nLabel:'
)Один пример как якорь формата
Режим с одним примером особенно эффективен, когда задача концептуально ясна, но формат вывода необычен или строго задан. Один пример гораздо надёжнее обучает точной структуре (ключам JSON, разделителям, регистру), чем описание в виде текста.
Используйте один пример, когда хотите ограничить структуру, не расходуя лишние токены и не рискуя получить перекос распределения меток, который вносят многочисленные примеры.
ONE_SHOT = (
'Extract entities as JSON.\n\n'
'Input: Apple released the iPhone in Cupertino.\n'
'Output: {"org": ["Apple"], "product": ["iPhone"], "loc": ["Cupertino"]}\n\n'
'Input: ' + query + '\nOutput:'
)Режим с несколькими примерами и кривая зависимости от k
Зависимость производительности от k редко бывает монотонной. Обычно производительность растёт, выходит на плато, а затем снижается, когда примеры переполняют контекст, рассеивают внимание и отодвигают текущий запрос от области недавнего внимания модели.
Эмпирически переберите значения k из множества {1, 2, 4, 8, 16} на отложенной выборке. Оптимальное значение k зависит от сложности задачи, длины примеров и фактической эффективности использования контекста моделью, которая обычно намного ниже заявленного размера окна.
def sweep_k(eval_set, candidates, ks=(1,2,4,8,16)):
results = {}
for k in ks:
acc = evaluate(build_prompt(candidates[:k]), eval_set)
results[k] = acc
return max(results, key=results.get)Почему работает ICL: неявный вывод
Исследования описывают ICL как выполнение моделью неявного байесовского вывода: примеры помогают найти скрытое понятие задачи, которому модель уже научилась во время предварительного обучения. Примеры выступают свидетельствами, сужающими апостериорное распределение задач, а не источником новых знаний.
Это объясняет неожиданный результат: даже неверные метки в примерах могут сохранять значительную часть точности, поскольку главный сигнал — это формат и пространство меток, а не соответствие между входными данными и метками.
# Min, Lyu et al. (2022): label correctness matters less than
# - the input distribution
# - the label space (which classes exist)
# - the format / structure
# Implication: invest in representative inputs + valid label setБюджет токенов и компромиссы по стоимости
Каждый пример расходует контекст и деньги. При длинных примерах четыре примера могут оказаться намного больше самого запроса. Рассчитывайте показатель стоимости одного пункта точности: если k=8 даёт прирост всего 0,5% по сравнению с k=4 при удвоенном количестве токенов, в рабочей среде выигрывает k=4.
Для процессов с высокой пропускной способностью предпочитайте кэширование статического блока примеров в запросе, чтобы повторяющиеся примеры оплачивались и обрабатывались один раз.
def cost_efficiency(acc_by_k, tokens_by_k, price_per_1k):
return {
k: acc_by_k[k] / (tokens_by_k[k] / 1000 * price_per_1k)
for k in acc_by_k
}
# Pick the k maximizing accuracy per dollar, not raw accuracyСмещение к преобладающей метке и позиционное смещение
Запросы с несколькими примерами несут скрытые смещения. Смещение к преобладающей метке заставляет модель предпочитать наиболее частый класс в примерах. Смещение к недавним примерам придаёт чрезмерный вес последнему примеру. Смещение к часто встречающимся токенам отдаёт предпочтение токенам, которые появляются чаще.
Методы калибровки, такие как контекстная калибровка, оценивают априорное распределение модели на входе без содержательного текста (например, с токеном N/A) и устраняют его влияние, значительно стабилизируя классификаторы с несколькими примерами.
# Contextual calibration (Zhao et al. 2021)
p_cf = model_probs(prompt_with_input('N/A')) # content-free prior
W = 1.0 / p_cf # diagonal correction
def calibrated(probs):
return normalize(W * probs)Балансировка набора примеров
Чтобы противодействовать смещению к преобладающей метке, сбалансируйте классы в примерах и меняйте их порядок. Для бинарной классификации при k=4 используйте 2 положительных и 2 отрицательных примера в перемешанном порядке, а не соотношение 3:1.
Для задач генерации сбалансируйте примеры по значимым измерениям (длине, тону, сложности), чтобы модель не сводилась к одному режиму, который встречался ей чаще всего.
import random
def balanced_demos(pool, k, label_fn):
by_label = {}
for ex in pool:
by_label.setdefault(label_fn(ex), []).append(ex)
per = k // len(by_label)
picks = [e for lst in by_label.values() for e in random.sample(lst, per)]
random.shuffle(picks)
return picksРежим с несколькими примерами и дообучение
Режим с несколькими примерами подходит, когда задача часто меняется, данных мало или вы не можете разместить дообученную модель. Дообучение выигрывает, если у вас есть тысячи примеров, нужна минимальная задержка каждого вызова или вы хотите встроить формат в модель, чтобы запросы оставались короткими.
Распространённый путь для рабочей среды: сначала создайте прототип с несколькими примерами, соберите удачные трассировки, а затем перенесите их в дообученную модель, чтобы полностью убрать токены примеров.
# Decision heuristic
if num_labeled < 500 or task_volatility == 'high':
strategy = 'few-shot ICL'
elif latency_budget_ms < 200 or prompt_token_cost_dominant:
strategy = 'fine-tune + zero-shot'
else:
strategy = 'few-shot now, distill later'Для задач на рассуждение нужно больше, чем примеры
Для многоэтапного рассуждения простые пары «ответ на запрос» с несколькими примерами могут навредить: модель учится сразу переходить к ответу, который не может обосновать. Дополняйте режим с несколькими примерами примерами с цепочкой рассуждений, показывающими ход рассуждений, а не только итоговую метку.
Количество примеров взаимодействует с глубиной рассуждения; часто два качественных примера с цепочкой рассуждений превосходят восемь примеров только с ответами на тестах по арифметике и логике.
COT_SHOT = (
'Q: A shop had 23 apples, used 20, bought 6 more. How many now?\n'
'A: Start 23, minus 20 leaves 3, plus 6 is 9. Answer: 9\n\n'
'Q: ' + question + '\nA:'
)Оценочный harness для k
Рассматривайте выбор количества примеров как эмпирический поиск при поддержке harness. Отложите проверочную выборку, контролируйте порядок примеров с помощью нескольких начальных значений и сообщайте среднее и дисперсию, поскольку точность режима с несколькими примерами может измениться на несколько пунктов только из-за порядка.
Записывайте для каждого значения k количество токенов и задержку, чтобы итоговый выбор оптимизировал всю целевую функцию, а не только точность.
def harness(pool, val, ks, seeds=5):
report = {}
for k in ks:
accs = []
for s in range(seeds):
demos = balanced_demos(pool, k, label_fn)
accs.append(evaluate(build_prompt(demos), val))
report[k] = (mean(accs), stdev(accs))
return reportБыстрая проверка
Проверьте, насколько хорошо вы понимаете выбор количества примеров и смещения ICL.
Итоги
Основные выводы:
k— настраиваемый гиперпараметр; перебирайте его значения и отслеживайте кривую роста, плато и снижения.- Режим без примеров подходит для хорошо известных задач; режим с одним примером задаёт строгий формат; режим с несколькими примерами учитывает распределение задач.
- ICL работает благодаря поиску задачи, усвоенной при предварительном обучении, поэтому формат и пространство меток важнее правильности меток.
- Противодействуйте смещениям к преобладающей метке, к недавним примерам и к часто встречающимся токенам с помощью балансировки, перемешивания и контекстной калибровки.
- Оптимизируйте точность на доллар, дополняйте задачи на рассуждение примерами с цепочкой рассуждений и переносите стабильные запросы с несколькими примерами в дообученные модели.
Часто задаваемые вопросы
Урок «Нулевой, одно- и малообразцовый режим» бесплатный?
Да — полный текст урока «Нулевой, одно- и малообразцовый режим» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс AI Prompt Engineering, подпишись на CoddyKit PRO. Курс AI Prompt Engineering содержит 4 уроков всего.
Чему я научусь в уроке «Нулевой, одно- и малообразцовый режим»?
Выбор количества примеров Ты практикуешь AI Prompt Engineering с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать AI Prompt Engineering?
Предыдущий опыт не требуется. AI Prompt Engineering на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 4.
Сколько времени занимает урок «Нулевой, одно- и малообразцовый режим»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке AI Prompt Engineering?
Да. Каждый урок AI Prompt Engineering включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Нулевой, одно- и малообразцовый режим
- Проектирование эффективных примеров
- Порядок примеров и их актуальность
- Динамический выбор примеров для малообразцового режима