Читать нас в Telegram
Иллюстрация: Ксения Здоровец

Зачем это нужно?

История развития технологий часто повторяется. Первые алгоритмы поиска требовали от пользователей умения правильно формулировать запрос и использовать специальные операторы для фильтрации поисковой выдачи. Со временем поисковики подстроились под обычного пользователя и научились «угадывать», что он имел в виду, вводя текст «скачать бумер бесплатно» в поисковую строку. Технические уловки и операторы стали не нужны. 

Сегодня мы находимся на похожем этапе развития языковых моделей: качество их ответов напрямую зависит от того, как сформулирован запрос. Как и двадцать лет назад, мы используем специальные приемы для получения от машины оптимального ответа.

Новейшие LLM уже неплохо справляются с неточными формулировками, а некоторые техники промтинга (промптинг/промтинг — написание запросов, промпт/промт — запрос, затравка, от английского prompt), например chain-of-thought, встраиваются непосредственно в модели. Однако специальные методы все еще необходимы:

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

С первого выстрела: zero/one/few shot prompting

Базовые настройки и системные инструкции больших языковых моделей заточены под рядового пользователя и самые распространенные типы задач, которые он предположительно будет решать с их помощью. Поэтому стиль и формат ответа модели по умолчанию будут нормализованными и усредненными. Простые и короткие запросы к таким моделям вернут вам простые и стандартные ответы. Такие запросы называются zero-shot запросами (запросы без примеров).

Запрос без примеров (zero-shot prompting) — это обычный запрос (вопрос) к модели. Мы рассчитываем на качество модели, на ее системные установки. Такие запросы хорошо работают для популярных запросов, для которых обучали модель (например, суммаризация текста или предварительный анализ данных). Для них не требуется специальной подготовки материалов, но и результат будет, скорее всего, тоже стандартный.

Zero shot prompting. Пример использования для анализа данных (Claude 3.5 Sonnet)

Если вы хотите получить от модели более развернутый и глубокий ответ в определенном формате/стиле, то при помощи одного или нескольких примеров (подсказок) необходимо явно показать, чего вы от нее ждете. Такой метод формулирования запросов называется one/few shot prompting. 

Примеры подаются в формализованном виде типа «вопрос-ответ», «входные данные — ответ» или задаются в запросе фразами-маркерами: «Используй такой формат…», «По аналогии с…», «Следуй этому примеру…», «В таком же стиле, как…».

Количество примеров в запросе зависит от того, насколько сложна наша задача: иногда достаточно одного примера, чтобы модель смогла успешно ответить на запрос, в других случаях необходимы десятки или даже сотни (many-shot prompting). Например, возьмем простую задачу: написать письмо — и сравним результат обычного запроса без примера (zero shot) и такого же запроса с примерами (one/few shot). В качестве образца стиля предложим модели фрагменты рассказа А. Чехова «Письмо к ученому соседу»).

Сначала покажем, как модель отвечает при запросе без примеров.

Zero shot prompting. Письмо к профессору (модель ChatGPT-4o)

Запрос: Напиши моему профессору письмо с просьбой о встрече.

Ответ модели:

Тема: Запрос на встречу
Уважаемый(ая) [Имя Отчество профессора],
Меня зовут [Ваше имя], и я являюсь студентом(кой) [курс, программа или кафедра, если уместно]. Я хотел(а) бы попросить о встрече в удобное для вас время, чтобы обсудить [кратко опишите тему или цель встречи, например: «мой исследовательский проект», «учебные вопросы», «подготовку к экзамену» и т. д.].
Если возможно, пожалуйста, сообщите, в какие дни и время вам было бы удобно встретиться. Я готов(а) подстроиться под ваше расписание.
Спасибо за внимание и заранее благодарю за возможность.
С уважением,
[Ваше полное имя]
[Контактные данные: телефон, email]

Теперь посмотрим, что произойдет, если показать модели пример стиля.

One shot prompting. Письмо к профессору с примером стиля (модель ChatGPT-4o)

Запрос: Напиши моему профессору письмо с просьбой о встрече в этом стиле.
Пример:
[первые четыре предложения из рассказа Чехова «Письмо к ученому соседу»].

Ответ модели:

Тема: Запрос на встречу
Многоуважаемый и всечестнейший Профессор!
Дозвольте, смиренно склонив главу, обратиться к Вам с покорнейшей просьбой, столь ничтожной и простой, что едва ли она заслуживает драгоценного внимания Вашего высокого ума. Осмелюсь же просить Вас о встрече, дабы удостоиться счастья лицезреть Вас и, может быть, сколь-нибудь познать в Вашем присутствии светоч науки и мудрости, сияющий в Вашей благородной личности.
Стыдно мне, жалкому существу, беспокоить столь высокого человека своими бедными словами, однако жажда знания и стремление к совершенству гнали меня, как ветер гонит осенний лист. Позвольте же, о светлый профессор, назначить час, удобный Вам, для столь великого для меня события, как наша беседа.
С глубочайшим уважением,
Ваш преданный студент,
[Ваше имя]

Few shot prompting. Письмо к профессору с примерами стиля (модель ChatGPT-4o)

Запрос: Напиши письмо моему профессору с просьбой о встрече в заданном стиле. 

Пример стиля 1: [первые четыре предложения из рассказа Чехова «Письмо к ученому соседу»].

Пример стиля 2: [следующие четыре предложения из рассказа Чехова «Письмо к ученому соседу»].

Ответ модели:

Профессору (имя, отчество, фамилия)
Драгоценный светило науки, милостивейший наставник, позвольте мне, ничтожному червяку в океане ученых умов, дерзновенно обратиться к Вам с просьбой, за которую заранее прошу меня простить. Простите мне, профессоре, старческую слабость и простодушие, если мое смиренное письмо потревожит Вас, великого трубоносца знаний и властителя заграничных книг с заманчивыми рисунками.
Уже не первый год я, жалкий рифейский стручок, жажду познать Вашу ученую мудрость ближе, ибо пламенно люблю я учителей человечества, сияющих, как светила, в небосводе науки. Подобно паломнику, я мечтаю узреть Ваш умственный храм и услышать слова, исходящие из его глубин.
Посему, если Провидение и Ваша доброта позволят, осмелюсь просить о встрече с Вами в удобное для Вас время. Хотел бы я, малый и ничтожный умом, но горячий душой, обсудить некоторые вопросы, касающиеся нашего с Вами предмета — той самой священной области знания, что питает нас идеями, как солнце питает земные растения.
Будьте милосердны, профессор, и позволите мне явиться к Вам, дабы принять от Вас искры научного света, которые так щедро излучает Ваш умственный горизонт. Я останусь в ожидании Вашего ответа, как скромный подсолнух в ожидании утреннего солнца.
С почтением и трепетом,
Ваш преданный слушатель,
(Ваше имя)

Что происходит при использовании примеров?

Добавление второго примера провоцирует модель не просто генерировать более длинный текст. Пример актуализирует в ее контексте более глубокие смысловые связи, которые были построены ею в процессе обучения. Да, модель буквально заимствует из показанного ей чеховского текста «заграничные книги с заманчивыми рисунками», однако ни «скромного подсолнуха», ни «рифейских стручков» у Чехова не было: они нашлись в ее векторной картине мира. 

Для более сложных запросов, где возможны варианты ответа, лучше использовать несколько примеров, чтобы продемонстрировать модели ожидаемую вариативность, и тщательно подобрать эти примеры. Этот способ отлично работает для извлечения данных из текста. 

Zero shot prompting. Извлечение данных (модель ChatGPT-4o mini)

Запрос:

Какие люди упоминаются в этом тексте?
20 марта 2006 г. 17:00 День Кривулина в «Платформе». Конференция «Поэзия Виктора Кривулина». В программе: Людмила Зубова «Письма и письменность в стихах Виктора Кривулина», Сергей Завьялов (Хельсинки) «Цикл Кривулина «Слабые стихи» (1986)», Михаил Шейнкер (Москва) «Виктор Кривулин: поэтика и хронология», Борис Иванов с воспоминаниями о Викторе Кривулине.

Ответ модели:

В тексте упоминаются следующие люди:

  1. Виктор Кривулин — центральная фигура конференции, поэт, чье творчество обсуждается.
  2. Людмила Зубова — участница программы с докладом «Письма и письменность в стихах Виктора Кривулина».
  3. Сергей Завьялов (из Хельсинки) — участник программы с докладом «Цикл Кривулина «Слабые стихи» (1986)».
  4. Михаил Шейнкер (из Москвы) — участник программы с докладом «Виктор Кривулин: поэтика и хронология».
  5. Борис Иванов — участник программы, делится воспоминаниями о Викторе Кривулине.

В ответ на такой запрос мы получаем ответ от модели в свободной форме: в примере выше модель не просто перечисляет упоминаемых персонажей, но и дает краткую справку о каждом. Если же нам нужен ответ в виде списка имен, полезно показать это на примере.

One shot prompting. Извлечение данных с примером (модель ChatGPT-4o mini)

Запрос:

Какие люди упоминаются в этом тексте?

20 марта 2006 г. 17:00 День Кривулина в «Платформе». Конференция «Поэзия Виктора Кривулина». В программе: Людмила Зубова «Письма и письменность в стихах Виктора Кривулина», Сергей Завьялов (Хельсинки) «Цикл Кривулина «Слабые стихи» (1986)», Михаил Шейнкер (Москва) «Виктор Кривулин: поэтика и хронология», Борис Иванов с воспоминаниями о Викторе Кривулине.
Верни ответ в заданном формате:
Пример. 16 марта 2015 г. 17:30 Центр Андрея Белого и Музей Ахматовой представляют вечер памяти Бориса Иванова и Виктора Кривулина. [соб. инф.]
Ответ: Борис Иванов, Виктор Кривулин.

Ответ модели:

Людмила Зубова, Сергей Завьялов, Михаил Шейнкер, Борис Иванов, Виктор Кривулин.

Одного примера хватило, чтобы модель ответила четко и по существу, без генерации лишнего текста.

В более сложных случаях может потребоваться несколько примеров, которые представят вариативность ожидаемого ответа: например, мы хотим получить несколько списков, списки могут быть пустыми (если в тексте не упоминаются нужные нам персонажи). Чтобы модель не растерялась и не начала фантазировать, выискивая запрошенных, но не существующих в тексте персонажей, мы показываем, что в ответе допустимы вариации.

Few shot prompting. Извлечение данных с примерами (модель ChatGPT-4o mini)

Запрос:
Какие люди участвуют в событии, а какие только упоминаются?

10 декабря 2014 г. 16:00 В рамках IV Международного фестиваля театрального искусства «Terra Incognita». Из цикла «Петербургский Элизиум». Вечер памяти поэтов-лауреатов премии А.Белого (В. Кривулина и Арк. Драгомощенко), «Романтический театр Томошевского» (г. Санкт-Петербург). [соб. инф.] Верни ответ в заданном формате. 

Пример 1:
20 марта 2006 г. 17:00 День Кривулина в «Платформе». Конференция «Поэзия Виктора Кривулина». В программе: Людмила Зубова «Письма и письменность в стихах Виктора Кривулина», Сергей Завьялов (Хельсинки) «Цикл Кривулина «Слабые стихи» (1986)», Михаил Шейнкер (Москва) «Виктор Кривулин: поэтика и хронология», Борис Иванов с воспоминаниями о Викторе Кривулине. 

Ответ:
Упоминания: Виктор Кривулин
Участники: Людмила Зубова, Сергей Завьялов, Михаил Шейнкер, Борис Иванов
 

Пример 2:
20 марта 2006 г. 19:00 День Кривулина в «Платформе». Вечер стихов и воспоминаний. По завершении литературного вечера будет показан фильм о Викторе Кривулине.
 

Упоминания: Виктор Кривулин 
Участники: —

Ответ модели:

Упоминания: Виктор Кривулин, Аркадий Драгомощенко
Участники: —

В качестве упрощенного и более короткого варианта техники few shot prompting используется прямая инструкция (instruction prompting) с перечислением возможных вариантов ответа без подробных примеров. 

Прямая инструкция (instruction prompting). Пример с извлечением данных (модель ChatGPT-4o)

Запрос:

Какие люди участвуют в описанном событии, а какие только упоминаются? Верни два списка людей: «Участники» и «Упоминания». Если один или оба списка пустые, верни пустые списки. Включай в списки только людей.

Описание события: 20 марта 2006 г. 17:00 День Кривулина в «Платформе». Конференция «Поэзия Виктора Кривулина». В программе: Людмила Зубова «Письма и письменность в стихах Виктора Кривулина», Сергей Завьялов (Хельсинки) «Цикл Кривулина «Слабые стихи» (1986)», Михаил Шейнкер (Москва) «Виктор Кривулин: поэтика и хронология», Борис Иванов с воспоминаниями о Викторе Кривулине.

Ответ модели:

Участники:

  • Людмила Зубова
  • Сергей Завьялов
  • Михаил Шейнкер
  • Борис Иванов

Участники:

  • Виктор Кривулин

Цепочка рассуждений: Chain-of-Thought

Для решения сложных логических или математических задач используется техника chain-of-thought, или цепочка рассуждений. Принцип ее действия уже описывался в «Системном Блоке», и суть ее сводится к тому, чтобы побудить модель рассуждать и действовать последовательно в процессе решения вместо того, чтобы давать ближайший, наиболее очевидный ответ. 

«Давай подумаем» / zero shot chain-of-thought

Простейший способ задействовать эту технику — прямо обозначить ее в запросе, используя выражения-маркеры вроде: «Давай думать шаг за шагом», «Рассуждай логически», «Объясни свой ход мыслей», «Разбей решение на этапы», «Покажи промежуточные вычисления».

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

В последних моделях, которые предназначены для решения научных задач, эта техника уже включена в системные инструкции. Например, GPT-4o сама переключается на пошаговое размышление, если предложить ей логическую задачу, а в описании модели GPT-о1 компания OpenAI не рекомендует пользователю задавать алгоритм решения, чтобы не дублировать инструкции и не сбивать модель с толку. Вы можете проверить, заложена ли эта техника в базовых настройках модели. Если вы получаете ответы, где пронумерованы логически связанные шаги рассуждения, встречаются маркеры типа «Сначала…», «Затем…», «Наконец…» и промежуточные результаты, то, скорее всего, модель уже настроена на цепочку рассуждений.

Цепочка рассуждений. Пример самостоятельного использования техники моделью GPT-4o

Вопрос:

В секции борьбы сумо 12 юношей. 8 из них любят пельмени. 7 сумоистов любят котлеты. 5 спортсменов любят и котлеты, и пельмени. Сколько в команде тех, кто не любит ни пельмени, ни котлеты?

Ответ модели:

Дано: Запрос на встречу

  • Всего юношей: 12.
  • ∣A∣ = 8 — любят пельмени.
  • ∣B∣ = 7 — любят котлеты.
  • ∣A ∩ B∣ = 5 — любят и пельмени, и котлеты.

Нужно найти количество юношей, которые не любят ни пельмени, ни котлеты.
Шаг 1. Найдем количество юношей, которые любят пельмени или котлеты (∣A∪B∣):
∣A∪B∣ = ∣A∣ + ∣B∣ − ∣A∩B∣.
Подставим значения:
∣A∪B∣ = 8 + 7 − 5 = 10.
Шаг 2. Найдем тех, кто не любит ни пельмени, ни котлеты:
Количество юношей, которые не любят ни пельмени, ни котлеты, равно разнице между общим числом юношей и теми, кто любит пельмени или котлеты:
Не любят ни пельмени, ни котлеты = 12 − ∣A∪B∣
Подставим:
Не любят ни пельмени, ни котлеты = 12 – 10 = 2.
Ответ:В команде 2 юноши, которые не любят ни пельмени, ни котлеты.

Менее продвинутую модель мы можем подтолкнуть к рассуждениям фразами-маркерами:
Запрос: В секции борьбы сумо 12 юношей. 8 из них любят пельмени. 7 сумоистов любят котлеты. 5 спортсменов любят и котлеты, и пельмени. Сколько в команде тех, кто не любит ни пельмени, ни котлеты? Рассуждай логически и описывай свой ход мыслей.

Сводная таблица про промт-инжинирингу

Полезные ссылки для того, чтобы улучшить промтинг

  • Как писать код на Python, SQL, переводить с одного языка на другой,  решать научные задачи с помощью ChatGPT
  • еще ряд рекомендаций, как работать с ChatGPT
  • статья от Яндекса о видах промтов,
  • еще гайд от Яндекса по промтингу,
  • база знаний от Сбера, как работать с GigaChat,
  • какие возможности промтинга есть для Mistral.