Few-shot промптинг: это когда вы показываете модели несколько готовых примеров задачи, каждый из которых: вход в паре с нужным ответом, прежде чем дать ей настоящие входные данные. Модель считывает схему и продолжает её. Примеры: самый быстрый способ зафиксировать то, что трудно выразить словами: где проходит граница между двумя категориями, точную форму результата или голос, которым пишет ваша команда.
Как работает few-shot промптинг
Brown et al. 2020, «Language Models are Few-Shot Learners», показали, что GPT-3 может освоить новую задачу по нескольким демонстрациям в промпте, без дообучения. Это называется обучением в контексте (in-context learning): в самой модели ничего не меняется, а примеры влияют только на ответ на этот конкретный промпт. В следующий раз примеры снова должны быть в промпте.
Названия идут от числа примеров. В zero-shot промпте их нет, в one-shot промпте один, а в few-shot промпте несколько, обычно от двух до пяти-шести.
Zero-shot и few-shot рядом
Обе вкладки ниже просят одно и то же одной и той же инструкцией. Единственная разница: вторая вкладка добавляет четыре размеченных примера перед настоящим обращением.
Категория: bug
Пользователь сбросил пароль, но при входе новый пароль отклоняется. Это указывает на проблему в процессе сброса пароля, так что, скорее всего, это баг в системе аутентификации.
Примеры изменили две вещи. Первая: формат. Zero-shot ответ добавил жирный заголовок и объяснение, а few-shot ответ повторил примеры и выдал одно слово, которое скрипт прочитает напрямую. Вторая: само решение. «Bug» разумное прочтение обращения, и большинство людей выбрали бы именно его. Но эта команда относит проблемы со входом к account, и третий пример говорит об этом без единого слова объяснения. Ни одна инструкция не упоминала это правило; его донесли примеры.
Сколько примеров использовать
Начните с двух-пяти. Этого хватает для большинства задач на форматирование и классификацию, и промпт остаётся коротким.
- Один пример показывает формат, но модель склонна копировать его слишком точно. Если единственный пример: пересказ изменения цен в 30 слов, следующий пересказ может тоже получиться в 30 слов и странно сосредоточенным на деньгах.
- Два-три разных примера позволяют модели увидеть, что у них общего (схема) и что меняется (детали).
- Для классификации включите хотя бы по одному примеру на каждую метку, а затем добавьте пограничные случаи, в которых без примеров были ошибки.
- Больше пяти-шести примеров обычно дают всё меньший выигрыш, а каждый запрос становится длиннее, что стоит токенов и времени. Если для правильного результата нужны десятки примеров, возможно, задаче нужна более ясная инструкция или вообще другой подход.
Как выбирать хорошие примеры
Модель учится на всём, что общего у ваших примеров, а не только на том, чему вы хотели научить.
- Покрывайте трудные случаи. Лёгкие примеры учат немногому. Самые полезные лежат на границе, как обращение про вход выше.
- Разнообразьте поверхность. Смешивайте короткие и длинные входы, разные темы и разные формулировки. Если все положительные отзывы в ваших примерах короткие, модель может принять длину за сигнал.
- Балансируйте метки и перемешивайте порядок. Модели склонны тяготеть к метке, которая чаще всего встречается в примерах, и к той, что стоит последней.
- Проверяйте каждый пример. Ошибка в примере: это инструкция совершить эту ошибку.
- Берите реальные входы. Примеры из ваших настоящих данных гораздо лучше совпадают с тем, что увидит модель, чем придуманные.
Сохраняйте формат одинаковым
Во всех примерах должны быть одинаковые метки, разделители и регистр, а настоящий вход должен выглядеть точно так же, как входы в примерах. В промпте с обращениями каждый пример: «Обращение:», затем «Метка:», а промпт заканчивается открытой строкой «Метка:», после которой естественно написать только одно.
Длинные примеры оборачивайте в чёткие маркеры, например теги <example>, чтобы модель видела, где заканчивается один и начинается следующий; см. разделители и XML-теги. В API примеры можно также передать как предыдущие реплики диалога: сообщение пользователя с входом из примера, затем сообщение ассистента с ответом, и так для каждого примера.
Few-shot промпты становятся хорошими шаблонами промптов для повторного использования: инструкция и примеры не меняются, меняется только вход. Блок ниже переписывает сообщение коммита в стиле команды. Впишите своё сообщение в поле и отключите часть с примерами, чтобы увидеть, какую долю стиля они несут.
feat(search): сделать поиск нечувствительным к регистру
Ни одно правило не записано словами: тип строчными буквами, область в скобках, глагол в неопределённой форме, без точки в конце. Примеры показывают все четыре, и ответ им следует. С отключёнными примерами модель всё равно улучшит сообщение, но стиль ей придётся угадывать, и ничто не заставит её догадку совпасть с вашим стилем.
Few-shot примеры могут демонстрировать и рассуждение, а не только ответы. Именно с готовых примеров с показанными шагами начинался chain of thought промптинг. С моделями, которые рассуждают внутри перед ответом, ограничивайте примеры входами, ответами и форматом: расписанные шаги рассуждения могут увести их с лучшего пути, и некоторые провайдеры советуют с такими моделями сначала пробовать zero-shot.
Часто задаваемые вопросы
Что такое few-shot промптинг?
Few-shot промптинг: это когда в промпт перед настоящими входными данными включают несколько примеров задачи, каждый из которых: вход в паре с правильным ответом. Модель продолжает схему, заданную примерами. Это особенно полезно для своих категорий, необычных форматов и принятого у вас стиля, которые проще показать, чем описать.
Сколько примеров должно быть в few-shot промпте?
Для большинства задач хорошая отправная точка: от двух до пяти. Для классификации включите хотя бы по одному примеру на каждую метку плюс пограничные случаи, в которых модель ошибалась без примеров. После нескольких штук каждый новый пример обычно помогает меньше, а каждый запрос становится длиннее.
Что такое one-shot промптинг?
One-shot промптинг даёт модели ровно один пример. Его хватает, чтобы показать формат, но модель склонна копировать этот единственный пример слишком точно, включая длину, формулировки и даже тему. Второй, непохожий пример показывает модели, какие черты составляют схему, а какие случайны.
Модель учится на моих примерах?
Только в рамках текущего запроса. Примеры влияют на ответ, потому что находятся в контексте; веса модели не меняются, и в следующем разговоре ничего не запоминается. Это называется обучением в контексте (in-context learning), и именно поэтому few-shot промпт должен каждый раз нести свои примеры с собой.
Могут ли плохие примеры ухудшить результат?
Да. Модель копирует всё общее, что есть у примеров, включая ошибки, длину и тон, которых вы не задумывали. Если у большинства примеров одна и та же метка, модель тоже склоняется к ней. Проверяйте, что ваши примеры правильные, разнообразные и сбалансированные.