Промпт-инжиниринг. Принципы написания хороших промптов

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

Я буду опираться главным образом на публикацию «Principled Instructions Are All You Need for Questioning LLaMA-1/2, GPT-3.5/4», в которой изложено 26 руководящих принципов, призванных помочь повысить эффективность работы с большими языковыми моделями.

Как и прежде, этот текст продуман и написан от и до человеком, но вдохновлен искусственным интеллектом. Описание собственного опыта относится к взаимодействию с ChatGPT-4/4o.

Промпт – это инструкция, написанная человеком для большой языковой модели с целью решить конкретную задачу (сгенерировать код, составить краткий пересказ большого текста, написать деловое письмо и пр.). Чтобы получить качественное решение, нужно написать качественную инструкцию (работает не только с ИИ).

Авторы упомянутой выше статьи свои руководящие принципы объединили в пять групп:

  • Принципы, относящиеся к структуре и ясности;
  • Принципы, относящиеся к описанию задачи («Specificity and Information» в оригинале);
  • Принципы, относящиеся к взаимодействию с пользователем;
  • Принципы, относящиеся к стилю («Content and Language Style»);
  • Принципы, относящиеся к сложным задачам, в том числе написанию кода.

Рассмотрим все группы по очереди.

Структура и ясность

К этой группе авторы отнесли следующие принципы:

  • включайте в промпт описание аудитории (например, «опиши круговорот воды в природе пятилетнему ребенку» или «ты научный руководитель (это роль модели), а я студент магистратуры (аудитория) и т.д.);
  • используйте позитивные конструкции и избегайте негативных (то есть, «опиши» / «объясни» и т.п. вместо «не упоминай», «не учитывай» и т.д.);
  • описывайте процесс движения к результату («опиши ход своих мыслей пошагово» / «сделай краткое описание и обозначь ключевые пункты»);
  • пишите начало предполагаемого ответа и предлагайте модели продолжить вашу мысль («Автор этой книги уделяет много внимания…»);
  • используйте разделители в тексте;
  • форматируйте свой запрос: начните текст с заголовка ###Инструкция###, для примеров используйте ###Пример###, вопрос предварите заголовком ###Вопрос### (### – это форматирование заголовков), используйте перевод строки, чтобы отделить смысловые части друг от друга.

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

Описание аудитории помогает модели подобрать подходящие формулировки, использовать более простую или специальную лексику. Я иногда пишу что-то вроде «объясни неспециалисту в области» или «объясни простыми словами». Если работаю с какой-то новой или сложной для себя темой, обычно даю модели роль преподавателя по этой теме (например, по большим языковым моделям), а себе – роль студента на лекции.

Здесь важно отметить, что языковые модели могут ошибаться и страдают «галлюцинациями» – то есть, могут сгенерировать очень убедительную на вид, но неверную информацию. Поэтому я не советую идти к ним без предварительной подготовки и без поисковика, в котором вы по мере общения будете аккуратно проверять все факты. «Галлюцинации» языковых моделей – большая и сложная проблема, по которой надо писать отдельный текст, поэтому пока просто имейте в виду, если вдруг не знали.

Описание задачи

К описанию задачи относятся следующие принципы:

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

Вы можете предложить модели создать для вас тест по новой теме и проверить свои знания (например, так: «Объясни мне [тему] и в конце дай мне тест с несколькими вариантами ответов. Не сообщай мне правильные ответы до тех пор, пока я не пришлю свое решение»).

Надо сказать, здесь авторы противоречат себе, используя негативную формулировку «не давай мне ответов», в то время как в предыдущем пункте советовали их избегать. Моя собственная практика показывает, что ИИ прекрасно справляется с негативными конструкциями и фразы типа «не делай» / «не рассказывай» понимает точно, так что можно ими спокойно пользоваться. Вы можете поэкспериментировать самостоятельно и поделиться опытом в комментариях.

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

Взаимодействие с пользователем

В этом разделе авторы предлагают использовать конструкцию «С этого момента задавай мне вопросы о [теме обсуждения]», чтобы модель получила от вас достаточно подробные инструкции для генерирования наиболее точного ответа.

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

Стиль

В этом разделе собраны рекомендации по работе со стилем как запросов (чтобы сделать их эффективнее), так и ответов (чтобы они соответствовали вашей цели):

  • вы можете попросить внести исправления в текст, сохраняя стиль автора неизменным (например, попросить поправить грамматические ошибки в письме или дополнить его текст так, чтобы никто не заподозрил, что писали не вы);
  • вы также можете назначить стиль для создания текста с нуля;
  • а еще вы можете попросить модель добавить в текст ошибок и опечаток, чтобы он выглядел убедительно;
  • добавляйте фразы типа «Твоя задача – …» или «Тебе нужно…», чтобы обозначить начало выполняемых инструкций;
  • попробуйте предлагать бонусы и штрафы («За самое эффективное решение ты получишь премию в 5 000 рублей» / «За ошибки в решении ты получишь штраф»);
  • повторяйте ключевые фразы несколько раз;
  • переходите сразу к делу, не используя форм вежливости.

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

«Напиши код для обхода графа в ширину*. Он должен включать в себя вывод каждой пройденной вершины в консоль».

«Напиши код для обхода графа в ширину. Код должен включать в себя вывод в консоль каждой вершины, для которой завершен обход соседей».

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

Что касается вежливости, то здесь мнения расходятся. Например, в статье «Should We Respect LLMs? A Cross-Lingual Study on the Influence of Prompt Politeness on LLM Performance» («Должны ли мы уважать большие языковые модели? Кросс-лингвистическое исследование влияния вежливости промптов на результативность больших языковых моделей»). Если коротко, авторы этого исследования показали, что грубое обращение приводит к снижению эффективности модели (однако чрезмерная вежливость не обязательно улучшит результат). «Оптимальный» уровень вежливости зависит от языка, на котором ведется беседа (авторы исследовали японский, китайский и английский языки).

<i>(Например, вот шаблоны запросов различного уровня вежливости на английском языке; Ranked Score – это оценка, которую дали шаблонам люди)</i>
(Например, вот шаблоны запросов различного уровня вежливости на английском языке; Ranked Score – это оценка, которую дали шаблонам люди)

Мой собственный опыт показывает, что вежливое общение и выражение благодарности, кажется, улучшает результаты со временем: ответы становятся более точными, развернутыми и включают в себя больше нюансов. Возможно, это определенное искажение – всё-таки личный опыт субъективен, – однако, продолжаем наблюдение.

Сложные задачи и код

В группу руководящих принципов, относящихся к сложным задачам, авторы относят следующие:

  • разбивайте сложные запросы на последовательность простых;
  • если предполагается написание большого объема кода, попросите разбить его на несколько файлов;
  • используйте Chain-of-Thought Prompting (Подсказка по цепочке рассуждений) и приводите примеры.

Идея подсказать модели рассуждать по цепочке последовательных шагов описана в статье «Chain-of-Thought Prompting Elicits Reasoning in Large Language Models». Сама статья небольшая, но в приложении можно обнаружить множество интересных примеров работы с промптами, поэтому рекомендую ее к прочтению.

<i>(Красноречивый пример из статьи)</i>
(Красноречивый пример из статьи)

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

Заключение

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

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

*Я имею в виду Breadth-First Search.

44
6 комментариев

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

1
Ответить

The Prompt Report: A Systematic Survey of Prompting Techniques очень рекомендуют вроде как почитать по промт-инженерингу, но чёт сложная

1
Ответить

Спасибо за материал. Хотелось бы более развернуто с примерами по каждому из пунктов, но и в целом приятный набор к размышлению

1
Ответить