Порядок примеров и их актуальность
Как порядок примеров влияет на результат
«Порядок примеров и их актуальность» — бесплатный урок AI Prompt Engineering на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения AI Prompt Engineering, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс AI Prompt Engineering содержит 4 уроков всего.
Порядок — скрытый гиперпараметр
Порядок примеров с несколькими примерами может изменить точность на несколько процентных пунктов, иногда превращая почти случайный запрос в сильный и наоборот. Эта нестабильность сохраняется даже при неизменном наборе примеров.
Рассматривайте порядок как полноценный гиперпараметр для поиска, а не как второстепенную деталь. Сообщать результаты для режима с несколькими примерами без контроля порядка — научно некорректно.
import itertools
def order_search(demos, eval_set, build, max_perms=24):
perms = list(itertools.permutations(demos))[:max_perms]
scored = [(p, evaluate(build(p), eval_set)) for p in perms]
return max(scored, key=lambda x: x[1])Объяснение смещения к недавним примерам
Трансформеры только с декодером демонстрируют смещение к недавним примерам: токены, расположенные ближе к точке генерации, оказывают непропорционально сильное влияние. Последний пример перед запросом с наибольшей вероятностью задаёт формат, метку и тон.
Отчасти это следствие особенностей механизмов внимания и позиционного кодирования. Практический вывод таков: модель легче всего воспроизводит то, что вы помещаете последним.
# Position weight intuition (illustrative, not exact)
# influence(example_i) roughly increases with proximity to the query
# => the FINAL demo disproportionately anchors the next generation
weights = [0.1, 0.15, 0.25, 0.5] # earlier ... latestПотеря в середине контекста
Исследования длинного контекста выявляют U-образный профиль внимания: модели хорошо обращают внимание на начало и конец контекста, но недостаточно — на середину. Критически важные примеры, спрятанные в середине запроса, фактически получают меньший вес.
Размещайте самые важные или самые сложные примеры в начале или, с учётом смещения к недавним примерам, ближе к концу; никогда не оставляйте их затерянными в середине длинного блока примеров.
def place_key_demos(key, filler):
# U-shape aware: key items at the edges, filler in the middle
head = key[: len(key)//2]
tail = key[len(key)//2 :]
return head + filler + tailПреобладающая метка и последняя позиция
Смещение к недавним примерам и смещение к преобладающей метке усиливают друг друга. Если ваш последний пример относится к классу A, модель склоняется к предсказанию A. В сочетании с набором примеров, где преобладает A, априорное распределение становится сильно смещённым.
Для сбалансированной классификации чередуйте метки и следите, чтобы последний пример не относился к одному и тому же классу во всех вариантах запроса.
def alternate_labels(by_label, k):
labels = list(by_label)
out = []
i = 0
while len(out) < k:
lbl = labels[i % len(labels)]
if by_label[lbl]:
out.append(by_label[lbl].pop())
i += 1
return out # final element varies by constructionДемонстрации, упорядоченные по сходству (по возрастанию)
Надёжная эвристика для обучения по нескольким примерам с дополнением извлечённым контекстом: располагайте извлечённые примеры по возрастающему сходству с запросом, чтобы наиболее релевантная демонстрация находилась ближе всего к запросу и получала преимущество за счёт недавнего контекста.
Это сочетает динамический выбор с использованием эффекта недавности: релевантный контекст не только присутствует, но и расположен там, куда модель обращает наибольшее внимание.
def order_by_similarity(query_emb, retrieved):
scored = [(d, cos(query_emb, d.emb)) for d in retrieved]
scored.sort(key=lambda x: x[1]) # ascending
return [d for d, _ in scored] # most similar last (near query)Порядок curriculum
Для задач, требующих рассуждений или генерации, порядок curriculum (от простого к сложному) может помочь модели постепенно выстроить нужное поведение, завершаясь сложным примером, который демонстрирует всю глубину рассуждений непосредственно перед запросом.
Это зависит от задачи; проверяйте такой порядок на случайном порядке и порядке по сходству, а не предполагайте заранее, что он будет полезен.
def curriculum(demos, difficulty_fn):
return sorted(demos, key=difficulty_fn) # easiest first, hardest lastИзмерение чувствительности к порядку
Оцените хрупкость своего промпта, выбрав множество вариантов порядка и вычислив дисперсию точности. Высокая дисперсия указывает на нестабильный промпт, который в рабочей среде может непредсказуемо ухудшаться.
Используйте эту метрику для сравнения конструкций промптов: промпт, устойчивый к изменению порядка, безопаснее, чем немного более точный, но нестабильный вариант.
import random
def order_sensitivity(demos, eval_set, build, trials=20):
accs = []
for _ in range(trials):
perm = random.sample(demos, len(demos))
accs.append(evaluate(build(perm), eval_set))
return mean(accs), stdev(accs) # report both; low stdev = robustВыбор порядка без пробных запросов
Если у Вас нет меток для оценки вариантов порядка, можно выбрать порядок по энтропии предсказаний модели на наборе для проверки: варианты порядка, дающие уверенные предсказания с низкой энтропией, хорошо распределённые по классам, обычно лучше обобщаются (Lu и др., 2022).
Это позволяет выбрать удачную перестановку без размеченного проверочного набора.
def select_order_by_entropy(perms, probe_inputs, build):
def score(perm):
ents = [entropy(model_probs(build(perm), x)) for x in probe_inputs]
return -mean(ents) # prefer confident, low-entropy orderings
return max(perms, key=score)Стабилизация с помощью калибровки
Чувствительность к порядку и смещение в сторону недавнего контекста одинаково усиливают одни и те же метки. Контекстная калибровка уменьшает этот эффект: она оценивает априорное распределение модели на входе без содержательной информации и корректирует вероятности предсказаний, снижая влияние любого отдельного порядка.
Калибровка в сочетании с достаточно хорошим порядком даёт более стабильное поведение в рабочей среде, чем попытки найти единственную наилучшую перестановку.
p_prior = model_probs(build(perm), content_free='N/A')
def calibrate(probs):
return normalize(probs / p_prior) # cancels order-induced label skewКэширование и стабильность порядка
Если Вы используете кэширование промптов, префикс, включая блок демонстраций, должен оставаться побитово неизменным, чтобы сработало обращение к кэшу. Частое перемешивание примеров для каждого запроса уничтожает повторное использование кэша и повышает стоимость и задержку.
Решение: зафиксируйте один проверенный порядок для статического блока демонстраций и кэшируйте его; динамическую перестановку оставьте только для извлечённого хвоста, зависящего от запроса.
# Stable cached prefix + dynamic tail
prefix = render(FIXED_ORDERED_DEMOS) # cache_control on this block
tail = render(order_by_similarity(q_emb, retrieved))
prompt = prefix + tail + queryКонтрольный список стратегии упорядочивания
Практические настройки по умолчанию: обеспечивайте баланс меток и чередуйте их, размещайте ключевые и сложные примеры по краям, избегая середины, упорядочивайте извлечённые примеры по возрастающему сходству, чтобы лучший пример оказался рядом с запросом, измеряйте дисперсию для разных порядков и применяйте калибровку для ослабления остаточного перекоса.
Затем зафиксируйте порядок для кэширования и повторно проверяйте его при каждом изменении набора примеров.
def final_order(demos, q_emb):
demos = alternate_labels(group(demos), len(demos))
return order_by_similarity(q_emb, demos) # validated, then cachedБыстрая проверка
Определите, где следует разместить критически важную демонстрацию.
Итоги
Основные выводы:
- Порядок примеров — это гиперпараметр, который может изменить точность на несколько процентных пунктов; выполняйте search и сообщайте дисперсию.
- Смещение в сторону недавнего контекста делает последнюю демонстрацию наиболее влиятельной, а эффект «потерянного в середине» уменьшает вес центральных примеров.
- Обеспечивайте баланс меток и чередуйте их, упорядочивайте извлечённые демонстрации по возрастающему сходству и учитывайте порядок curriculum.
- При нехватке меток выбирайте порядок по энтропии и применяйте контекстную калибровку для ослабления перекоса.
- Зафиксируйте стабильный порядок для кэширования промпта; переставляйте только динамический извлечённый хвост.
Часто задаваемые вопросы
Урок «Порядок примеров и их актуальность» бесплатный?
Да — полный текст урока «Порядок примеров и их актуальность» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс AI Prompt Engineering, подпишись на CoddyKit PRO. Курс AI Prompt Engineering содержит 4 уроков всего.
Чему я научусь в уроке «Порядок примеров и их актуальность»?
Как порядок примеров влияет на результат Ты практикуешь AI Prompt Engineering с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать AI Prompt Engineering?
Предыдущий опыт не требуется. AI Prompt Engineering на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.
Сколько времени занимает урок «Порядок примеров и их актуальность»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке AI Prompt Engineering?
Да. Каждый урок AI Prompt Engineering включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Нулевой, одно- и малообразцовый режим
- Проектирование эффективных примеров
- Порядок примеров и их актуальность
- Динамический выбор примеров для малообразцового режима