Перейти к содержимому
ПереводыИсследователи и авторы

Lil’Log: промпт-инжиниринг

Конспект обзора Лилиан Венг (март 2023): zero-shot и few-shot, как выбирать и упорядочивать примеры, промпты-инструкции, самосогласованность, цепочки рассуждений и их варианты, автоматический подбор промптов, поиск, код и внешние API (TALM, Toolformer) — и что из этого работает с моделями 2026 года.

  • Промпт-инжиниринг (промпт-инжинирингпромпт-инжинирингEN prompt engineering) — способы управлять поведением LLM, не меняя весов. Венг называет его эмпирической наукой: эффект приёма сильно зависит от модели, поэтому нужны эксперименты.
  • Базовые режимы — zero-shot и few-shot (few-shotfew-shot (примеры в промпте)EN few-shot promptingНесколько пар «вход → выход» прямо в промпте; модель подхватывает формат без дообучения (in-context learning). Zero-shot — без примеров.). Качество few-shot сильно зависит от формата, выбора и порядка примеров — от уровня случайного угадывания до лучших результатов.
  • Для моделей, дообученных следовать инструкциям, лучше прямо и конкретно описать задачу: что делать (а не чего не делать), для кого, в каком формате.
  • Самосогласованность (самосогласованностьсамосогласованность (голосование большинством)EN self-consistency (majority voting)Сгенерировать N ответов и выбрать самый частый итоговый. В отчётах — maj@k или cons@k.) — сгенерировать несколько ответов с температурой больше нуля и выбрать большинством голосов или проверкой (юнит-тестами).
  • Цепочка рассуждений (цепочка рассужденийцепочка рассужденийEN chain of thought (CoT)) помогает на сложных задачах и больших моделях; у неё десятки вариантов: few-shot и zero-shot CoT, STaR, выбор «сложных» примеров, Self-Ask, Tree of Thoughts.
  • Промпт можно подбирать автоматически (APE, кластеризация примеров) и дополнять модель поиском, исполнением кода и вызовом API (Toolformer).

Пост — обзор литературы к уроку 8.1.2 «Промптинг». Читайте после него: в уроке — практика с локальной моделью, здесь — откуда взялись приёмы и что о них известно из статей. Раздел «Поиск» — предыстория RAG (8.2.1), разделы о самосогласованности и CoT — предыстория вычислений во время ответа (вычисления во время инференсавычисления во время инференса (test-time compute)EN test-time computeБольше вычислений на ответ вместо большей модели: длинное рассуждение, много сэмплов с голосованием, поиск с проверщиком., ступень 6.4 и конспект «Why We Think»), раздел о внешних API — к агентам (конспект «LLM Powered Autonomous Agents»).

Помните о дате — март 2023 года. Многие приёмы тех лет придумывали для моделей, которые плохо следовали инструкциям. С рассуждающими моделями 2025–2026 годов часть советов работает иначе: например, «думай по шагам» не нужно модели, которая и так рассуждает, а подробные пошаговые инструкции иногда даже мешают. Мнение автора поста тоже стоит знать: по её словам, многие статьи о промптах можно было бы уложить в пару предложений, а остальное в них — замеры на бенчмарках; сообществу больше помогла бы общая инфраструктура для сравнения.

Zero-shot — дать модели только задачу. Few-shot — сначала несколько примеров «вход → правильный выход». Модель лучше понимает, чего от неё хотят, но тратится больше токенов, и длинные примеры упираются в окно контекста.

Пример few-shot для классификации тональности (наш, по образцу поста, где используются отзывы из набора SST-2):

Отзыв: Актёры играют так, что забываешь, что это кино.
Тональность: положительная
Отзыв: Два часа жизни, которые мне никто не вернёт.
Тональность: отрицательная
Отзыв: Игра по мотивам фильма наверняка веселее самого фильма.
Тональность:

Почему few-shot нестабилен. Венг пересказывает работу Zhao и др. (2021) о трёх смещениях GPT-3:

СмещениеЧто происходит
смещение к большинству метокесли среди примеров больше «положительных», модель чаще отвечает «положительная»
смещение к недавнемумодель склонна повторить метку последнего примера
смещение к частым токенамчастые слова выдаются охотнее редких

Авторы предложили калибровку: подать «пустой» вход вроде N/A, посмотреть, какие вероятности меток модель выдаёт без всякой информации, и выровнять их.

Как выбирать примеры (сводка советов из поста):

  • брать примеры, близкие к текущему входу по эмбеддингам (поиск kk ближайших соседей);
  • для разнообразия — графовый отбор: строить граф ближайших соседей и выбирать представительные вершины;
  • обучить эмбеддинги специально под отбор примеров (контрастивным обучением; «хороший» пример — тот, с которым модель даёт правильному ответу высокую вероятность);
  • активное обучение: размечать вручную те вопросы, на которых несколько попыток модели расходятся сильнее всего.

Как упорядочивать: примеры разнообразные, близкие к задаче и в случайном порядке. Рост модели и числа примеров не уменьшает разброс качества между перестановками; порядок, хороший для одной модели, бывает плохим для другой. Если валидационных данных мало, выбирайте порядок, при котором ответы модели не слишком однобоки и не слишком самоуверенны (Lu и др., 2022).

Модели, дообученные на тройках «инструкция, вход, правильный выход» (InstructGPT, наборы natural instructions, часто с RLHF), понимают задачу без примеров — и это дешевле few-shot. Советы Венг:

  • описывать задачу конкретно и точно;
  • говорить, что делать, а не только чего не делать;
  • указывать аудиторию: «объясни квантовую физику шестилетнему ребёнку», «языком, безопасным для работы».

In-context instruction learning (Ye и др., 2023) совмещает оба подхода: в промпте несколько примеров разных задач, каждый со своей инструкцией, входом и выходом, а в конце — инструкция и вход вашей задачи.

Сгенерировать несколько ответов с температурой больше нуля и выбрать лучший (Wang и др., 2022). Общий способ — голосование большинством; если ответ легко проверить (код с юнит-тестами), — просто запустить проверку. Почему это работает, видно в разделе «Что сделать руками».

CoT (Wei и др., 2022) — модель пишет короткие шаги рассуждения перед ответом. Польза заметна на сложных задачах рассуждения и у больших моделей (по данным поста — больше примерно 50 млрд параметров); на простых задачах выигрыш небольшой.

Два вида. Few-shot CoT — примеры с выписанными решениями (в посте — задачи из GSM8k). Zero-shot CoT (Kojima и др., 2022) — фраза вроде «Давай рассуждать по шагам», а потом «Итак, ответ:».

Приёмы и расширения, которые собрала Венг:

  • самосогласованность поверх CoT: несколько цепочек — голосование по ответам;
  • ансамбли: менять порядок примеров или подставлять порождённые моделью решения вместо написанных людьми;
  • STaR (Zelikman и др., 2022): модель пишет решения, оставляем только приведшие к правильному ответу, дообучаем на них и повторяем. (Это предок отбора с отклонением и RL с проверяемой наградой из ступени 6.4.)
  • примеры с более сложными рассуждениями (больше шагов) дают лучший результат; шаги лучше разделять переводом строки, чем «шаг i», точкой или точкой с запятой; «Question:» работает лучше, чем «Q:» (Fu и др., 2023);
  • голосование по сложности: голосовать только среди kk самых длинных цепочек; но только сложные примеры ухудшают ответы на простые вопросы (Shum и др., 2023);
  • объяснения в промпте для задач понимания текста помогают слабо или умеренно, и ложные объяснения чаще ведут к неверному ответу (Ye и Durrett, 2022);
  • Self-Ask, IRCoT и ReAct: модель задаёт себе уточняющие вопросы и отвечает на них поиском;
  • Tree of Thoughts: дерево вариантов мысли с поиском в ширину или глубину.
  • Промпт можно считать обучаемыми параметрами и оптимизировать градиентом в пространстве эмбеддингов: AutoPrompt, Prefix-Tuning, P-tuning. (Это уже ближе к PEFT, ступень 6.2.)
  • APE (Zhou и др., 2022): модель предлагает варианты инструкции по примерам «вход → выход», каждый оценивается на данных (точность или логарифм вероятности правильного ответа), лучшие перефразируются и снова оцениваются. Так нашлась формулировка zero-shot CoT лучше классической: «Давай разберём это по шагам, чтобы быть уверенными, что ответ правильный».
  • Augment–prune–select (Shum и др., 2023): породить псевдоцепочки, отбросить те, что дают неверный ответ, и выбрать набор примеров методом градиента политики с точностью на валидации как наградой.
  • Кластеризация (Zhang и др., 2023): ошибки модели похожи друг на друга, поэтому вопросы кластеризуют k-means и берут по одному примеру из кластера — так в промпт не попадёт много примеров с одной и той же ошибкой.

Поиск. Модель не знает фактов после даты среза знаний и закрытых данных компании. Lazaridou и др. (2022) брали 20 результатов Google, резали тексты на абзацы по 6 предложений, ранжировали по TF-IDF и вставляли лучший абзац в промпт в формате «Свидетельство → Вопрос → Ответ» (если поменять местами вопрос и свидетельство, становится хуже). Любопытные наблюдения: даже с доступом к поиску модель хуже отвечает на вопросы о событиях после своего среза знаний — контекст конфликтует с «внутренним» знанием; а «внутренний поиск» — попросить модель сначала выписать относящиеся к вопросу знания — тоже помогает (Liu и др., 2022).

Код. PAL и Program of Thoughts просят модель написать программу на Python, а вычисления выполняет интерпретатор: рассуждение отделено от арифметики.

Внешние API.

  • TALM (Parisi и др., 2022): модель пишет вызов инструмента и его вход, система вставляет результат, модель продолжает. Набор примеров расширяют итеративно — «самоигрой»: оставляют вызовы, которые улучшили ответ.
  • Toolformer (Schick и др., 2023): калькулятор, система вопросов-ответов, поиск, переводчик, календарь. Обучение самоконтролируемое: (1) модель по нескольким примерам расставляет в тексте кандидатов-вызовов API; (2) вызовы выполняются, и вызов оставляют, только если с его результатом модели заметно легче предсказывать следующие токены (потеря падает больше порога); (3) модель дообучают на тексте с оставленными вызовами. Ограничения на момент поста: нет цепочек вызовов и интерактивного использования.

Почему самосогласованность работает? Пусть модель на задаче отвечает правильно с вероятностью 0,4, а три неправильных ответа встречаются по 0,2. Один ответ верен в 40 % случаев. Голосование среди NN ответов выбирает правильный всё чаще — потому что неправильные ответы «расходятся» по разным вариантам, а правильный один. Если же есть идеальная проверка (юнит-тесты), достаточно, чтобы правильный ответ встретился хотя бы раз: 1−0,6N1 - 0{,}6^N.

import numpy as np
rng = np.random.default_rng(0)
probs = np.array([0.4, 0.2, 0.2, 0.2]) # ответ 0 правильный; три неправильных по 20%
def majority_acc(n, trials=100_000):
samples = rng.choice(4, size=(trials, n), p=probs)
counts = np.stack([(samples == k).sum(axis=1) for k in range(4)], axis=1)
counts = counts + rng.random(counts.shape) * 0.1 # случайно разбиваем ничьи
winners = counts.argmax(axis=1)
return (winners == 0).mean()
for n in [1, 5, 15, 45]:
best_of_n = 1 - (1 - probs[0]) ** n # если есть идеальный проверяющий (юнит-тесты)
print(f"N={n:3}: голосование {majority_acc(n):.3f}, best-of-N с идеальным проверяющим {best_of_n:.4f}")

Ожидаемый вывод:

N= 1: голосование 0.399, best-of-N с идеальным проверяющим 0.4000
N= 5: голосование 0.509, best-of-N с идеальным проверяющим 0.9222
N= 15: голосование 0.693, best-of-N с идеальным проверяющим 0.9995
N= 45: голосование 0.910, best-of-N с идеальным проверяющим 1.0000

Голосование растёт медленно, а с проверяющим — почти сразу. Отсюда практический вывод поста: для задач, которые легко проверить, выбирайте ответ проверкой, а не большинством.

Дальше — с локальной моделью из урока 8.1.1:

  1. Возьмите 20 задач в стиле GSM8k на русском и сравните zero-shot, zero-shot CoT («Давай рассуждать по шагам») и самосогласованность по 5 ответам. Для рассуждающей модели сравните ещё с выключенным «мышлением».
  2. Проверьте смещение к недавнему: в few-shot для тональности поставьте в конец три «положительных» примера подряд и посмотрите, как изменится доля «положительных» ответов на нейтральных отзывах.
  3. Повторите «внутренний поиск»: попросите модель сначала выписать факты, относящиеся к вопросу, и только потом ответить; сравните точность на 20 фактических вопросах.
ENRU
prompt engineering, in-context promptingпромпт-инжиниринг, управление через контекст
zero-shot / few-shotбез примеров / с несколькими примерами
demonstration, in-context exampleпример в промпте
majority label bias, recency bias, common token biasсмещение к большинству меток, к недавнему, к частым токенам
instruction prompting, instructed LMпромпт-инструкция, модель, дообученная следовать инструкциям
self-consistency, majority voteсамосогласованность, голосование большинством
chain-of-thought, rationaleцепочка рассуждений, обоснование
automatic prompt engineer (APE)автоматический подбор промпта
augmented language modelдополненная языковая модель
retrieval, open-domain QAпоиск (извлечение), ответы на вопросы в открытой области
program-aided LMмодель, решающая задачу через программу
tool-augmented LM, API callмодель с инструментами, вызов API