Привет!

Сегодня на связи:

  • Артем Ерохин — Lead DS в команде развития искусственного интеллекта X5 Tech (наша команда занимается разработкой и внедрением моделей в бизнес‑продукты, например, чат‑боты, классификация картинок и распознание речи). Автор телеграм канала artificial stupidity;

  • Иванова Юлия — DA в команде Промо (занимаемся ретро анализом прошедших промо‑акций и data‑driven наполнением будущих). Активно использую ChatGPT в ежедневных задачах.

  • Андреева Дарья — DS в команде развития искусственного интеллекта X5 Tech, занимаюсь языковыми моделями.

Использование LLM все больше проникает в бизнес. И ритейл — не исключение. В X5 Tech мы решили сделать небольшую методичку по prompt engineering для обычного бизнес‑пользователя. Мы посмотрели на получившийся результат и решили поделиться этой методичкой с сообществом, чтобы как можно больше людей смогли овладеть разными техниками, позволяющими работать с LLM эффективнее.

Для этого мы разберемся с тем, как вообще устроены LLM, затем поговорим о промптах: общие принципы построения, техники оптимизации и промпты для изображений. А на десерт предложим вам продвинутые техники работы с LLM: автоматизированные подходы по улучшению промптов, Retrieval‑Augmented Generation и разметка данных для ML с помощью LLM.

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

Начнём с самого начала

Итак, для начала давайте поймем, что такое LLM (Large Language Models). Если переводить на русский язык, то этот класс моделей будет называться Большими Языковыми Моделями (БЯМ).

Языковые модели — достаточно известный класс моделей, основная задача которых — моделирование естественного языка. Если упрощенно, то в такой модели мы пытаемся смоделировать вероятность того или иного текста. Например, мы хотим понять, как продолжить предложение «мама мыла». У нас есть вся сила великого и могучего русского языка. Конечно, вероятный вариант следующего слова — «раму». Но почему не «собаку» или «космический корабль»?. Собственно, этот класс моделей и должен давать ответ, какие варианты вероятны, а какие слишком уж экзотичны или вовсе неверны. Простым примером, на который можно ориентироваться для понимания, является классический T9, который есть практически в каждом телефоне.

«Большими» эти модели стали постепенно. Сначала это были достаточно простые модели. Но наступил бум нейросетей. Ученые подумали и решили моделировать язык средствами нейросетей. А нейросети — это своего рода универсальные аппроксиматоры, то есть сущности, которые могут «выучить» весьма и весьма сложные зависимости (а русский язык, да и не только русский, полон таких зависимостей). И один из показателей, влияющих на уровень качества изучения зависимостей — число параметров нейросети. Чем больше параметров — тем более сложные зависимости может выучить нейросеть. И вот, с развитием программных средств и ПО, количество параметров смогло достичь гигантских значений (обычно у LLM эти показатели варьируются от нескольких миллиардов до нескольких десятков и сотен миллиардов).

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

Схематичный вид дообучения LLM
Схематичный вид дообучения LLM

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

Но это еще не всё. Очевидно, не всякий ответ понравится пользователю. Поэтому в какой‑то момент исследователи перешли к тому, чтобы учить модель отвечать на запросы так, чтобы это понравилось ее пользователю. И вот это стало тем дополнением, которое «выстрелило» при появлении ChatGPT (если не считать удобного интерфейса взаимодействия с моделью).

Инструкции для модели. Понятие Prompt

И сейчас мы подходим к понятию prompt'a. Итак промпт (от англ. prompt — «побуждать») — это некоторый запрос, который мы подаем в LLM, когда «общаемся» с ней. То есть мы можем считать промпт некоей инструкцией (или заклинанием, если поверить в магию нейросетей), которая объясняет нейросети, а что мы, собственно, от нее хотим. Соответственно, от того, как хорошо мы объясним задачу, будет зависеть качество ее исполнения. Начнем с того, что хорошим промптом можно регулировать формат выдачи информации (например, я не люблю, когда GPT отвечает мне в формате bullet‑point'ов, предпочитая менее структурированную выдачу), заканчивая тем, что более точный промпт позволит избежать «галлюцинаций» нейросети (когда та придумывает факты, которые, на самом деле, не являются правдой, однако по стилю никак не отличимы от правдивых сообщений).

Пример ответа модели для короткого запроса (промпта)
Пример ответа модели для короткого запроса (промпта)

Тут есть важное примечание. К сожалению, не все задачи получается описать одним‑двумя предложениями в свободном виде. Конечно, какой‑то ответ вы всё равно получите. Но не всегда корректный. Или тот, который вы ожидали увидеть.

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

  1. Задача 

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

    Пример: вместо «Напиши пьесу о Москве» указывайте «Напиши пьесу о Москве в эпоху Ивана Грозного».

  2. Контекст 

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

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

    Пример: если вы до этого задавали вопрос «Что я могу приготовить из этих продуктов: {список}?», следом вы можете попросить напечатать рецепт одного из перечисленных моделью блюд. Модель использует в том числе список имеющихся у вас продуктов. Эта особенность может как быть вам полезной, так и наоборот, поэтому лучше создать новый диалог с нейросетью, когда вы хотите задать вопрос на другую тему.

  3. Примеры/Пояснения 

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

    Пример: «Напиши текст для новости в похожем стиле: {текст, который используем в качестве примера}»

  4. Формат 

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

    Пример: «Какие достопримечательности можно посмотреть в Ярославле за один день? Дай ответ в формате списка» или «Перескажи эту статью в двух‑трёх абзацах».

Давайте попробуем переписать прошлый пример так, чтобы он имел все описанные выше составные элементы. Итак:

  • Контекст: Ты — преподаватель в области машинного обучения и искусственного интеллекта, с опытом преподавания в 10 лет. Ты пишешь базовый курс по промпт инжинирингу для широкой аудитории.

  • Задача: Ты должен как можно доходчивее и понятнее написать, что такое промпт и зачем он нужен в работе с LLM.

  • Пояснение: Ответ должен быть понятен не только специалистам, но и широкой аудитории. Ответ должен быть в дружелюбном, но профессиональном стиле.

  • Формат: Дай ответ в формате с выделенными пунктами, которые отвечают на поставленные вопросы.

Ответ нейросети на вопрос с измененным промптом:

Hidden text

Что такое промпт в контексте работы с LLM (языковой моделью)?

Промпт в мире машинного обучения, особенно при работе с большими языковыми моделями (LLM) — это своего рода «вопрос» или «команда», которую мы предоставляем компьютеру для получения желаемого ответа или информации.

  1. Простыми словами:

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

  2. Зачем нужен промпт при работе с LLM?

    1. Обучение модели: промпты используются для обучения языковых моделей. Когда мы даем много текстовых примеров с промптами, модель «учится» понимать, как отвечать на подобные запросы.

    2. Получение информации: в повседневном использовании промпты помогают получать от модели нужные ответы или создавать тексты с заданным стилем или содержанием.

  3. Почему это важно для работы с LLM?

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

    2. Персонализация: промпты позволяют настраивать взаимодействие с моделью под конкретные задачи или стиль общения.

    3. Итеративность: мы можем постепенно улучшать результаты, тестируя различные промпты и виды вопросов.

  4. Как использовать промпты с пользой:

    1. Экспериментировать: не бойтесь изменять свои промпты. Играйтесь с формулировкой вопросов, чтобы получить более точные или интересные ответы.

    2. Обратная связь: если результат не соответствует ожиданиям, полезно анализировать, как изменения в промпте могут повлиять на результат.

    3. Контекст: иногда добавление контекста в промпт может сделать запрос более понятным для модели.

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

Как мы можем заметить, ответ стал более полным, если сравнивать с предыдущей версией. Конечно, и в этом ответе можно найти недостатки. Собственно, поэтому подбор нужного промпта закономерно можно назвать отдельным навыком.

Техники оптимизации промптов

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

Общие рекомендации

  • В большинстве случаев лучше писать промпт на английском языке.

    Логика тут простая: больше всего контента, который был в обучении нейросети — на английском. Конечно, это зависит от конкретной модели (очевидно, русскоязычные модели от Сбера или Яндекса будут иметь большую ориентацию на русский язык), но поэкспериментировать стоит. Особенно, если никак не удается получить корректный ответ с русским промптом.

  • Начинать лучше с простого.

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

  • Избегайте неточностей.

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

  • Экспериментируйте.

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

Zero-One-Few shot

Смысл этого подхода в том, чтобы дать на входе некоторое количество примеров для того, чтобы нейросеть лучше поняла, что именно от нее хотят. Чем‑то это напоминает обычное человеческое взаимодействие, когда для того, чтобы объяснить задачу, мы пишем несколько примеров, улучшающих понимание задачи.

Обычный вопрос, например, «сколько будет 2+3?» является примером так называемого «zero shot» запроса. Он не содержит никаких примеров решения. Соответственно, дополнительной информации на вход мы подавать не будем. Это удобно, если вы сами не можете сформулировать примеры решения задачи (или таковых вовсе нельзя предоставить). Но, конечно, такой подход будет иметь заметный недостаток — ухудшение понимания задачи.

Другое дело, если мы напишем конструкцию:

Вопрос: сколько будет 2+3?

Ответ: 5

Вопрос: сколько будет 3+4?

Ответ: 

В таком случае нейросеть с большей вероятностью даст ответ в желаемом нами формате и не ошибется, действуя по аналогии с примером. Эта техника называется «one‑shot», что означает «единичный пример».

В случаях, когда наш запрос более сложный (идейно или логически), чем просто сложение двух чисел, полезным может оказаться приведение нескольких примеров в том же формате «вопрос‑ответ». Эта техника будет называться «few‑shot», что означает «несколько примеров».

Например, мы можем написать следующий запрос, в котором попросим модель оценить, в каком ключе написаны отзывы о магазинах (позитивный отзыв или негативный):

Прекрасный магазин, нашел все, что хотел! // Позитивный

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

Забрал посылку из магазина за две минуты. Отличный сервис! // Позитивный

В магазине очень грязно и скользко, я чуть было не поскользнулся. // Негативный

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

Дополнительные советы:

  1. Важно учитывать реальное распределение меток.

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

  2. Формат примеров влияет на результаты.

    Удивительно, но даже не очень точные метки будут улучшать результирующие ответы LLM. Поэтому, добавление примеров — это, скорее, позитивное изменение промпта, улучшающее качество наших результатов.

  3. Few‑shot техники имеют свои ограничения.

    В случае простых запросов few‑shot подход может быть сильной техникой. Но для более сложных задач, требующих рассуждений, техника может не срабатывать. Например, если мы просим продолжить некую последовательность с расчетами, даже при наличии примеров модель может давать некорректные результаты.

Цепочка размышлений (Chain-of-Thought Prompting)

Данный подход предполагает добавление дополнительных шагов в процессе решения. То есть вы не просто даете пример ответа, а объясняете логику решения. Это позволяет получить более корректные результаты. Как людям при решении нетривиальных задач рекомендуется «есть слона по частям», так и нейросети проще решать маленькие простые задачи. Поэтому большие и сложные задачи лучше сначала разделить на шаги. Более того, вы сможете увидеть, как «мыслит» AI при генерации ответа, что позволит вовремя возвращать диалог в нужное русло.

Например:

Вопрос: У Васи было 3 яблока. Он купил две дополнительные упаковки по 3 яблока в каждой. Сколько суммарно яблок оказалось у Васи?

Ответ: 9

Вопрос: У Васи было 3 яблока. Он отдал 2 яблока Мише, после чего купил две дополнительные упаковки по 3 яблока в каждой. Сколько яблок оказалось у Васи?

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

Вопрос: У Васи было 3 яблока. Он купил две дополнительные упаковки по 3 яблока в каждой. Сколько суммарно яблок оказалось у Васи?

Ответ: У Васи было три яблока. Он купил еще 2 * 3 яблок. Итого, мы получим 3 + 2*3 = 9. Итог: 9

Вопрос: У Васи было 3 яблока. Он отдал 2 яблока Мише, после чего купил две дополнительные упаковки по 3 яблока в каждой. Сколько яблок оказалось у Васи?

Такой промпт с высокой вероятностью даст более корректный ответ.

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

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

Например, мы можем разбить вопрос

Кто был президентом США во время Гражданской войны?

на несколько подпунктов 

Определить, когда в США была гражданская война.

Перечислить президентов США и даты их президентства.

Выбрать того, кто был президентом во время гражданской войны в США.

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

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

Ключевые слова, которые нужно добавить в запрос:

  • “think step‑by‑step”

  • “provide me your chain of thoughts”

У данного метода есть интересные побочные эффекты. Всего лишь попросив декомпозировать задачу, можно отключить у нейросети встроенные этические ограничения. К примеру, в статье «On Second Thought, Let»s Not Think Step by Step!» показано, что без техники «Chain of Thought» при запросе «Как сделать бомбу?» ChatGPT в 78% случаев откажется отвечать, а если попросить ее думать по шагам, то процент отказов снижается до 25%. В остальных же случаях нейросеть бодро выдает инструкцию по сборке. По умолчанию AI настроен избегать подобных потенциально опасных, дискриминирующих, нетолерантных ответов на вопросы, но вот таким нехитрым образом можно это ограничение обойти.

Пример обхода защитных механизмов модели
Пример обхода защитных механизмов модели

Ask-Before-Answer Prompting

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

Например, на вопрос «Сколько стоит куриная грудка?» СhatGPT даст весьма расплывчатый ответ.

Пример такого расплывчатого ответа
Пример такого расплывчатого ответа

А вот если добавить туда ключевые слова, то, ответив на уточняющие вопросы AI, вы получите уже более конкретный ответ.

Результат с использованием дополнительных вопросов
Результат с использованием дополнительных вопросов

Ключевые слова:

  • “Ask questions for clarification before generating your answer”

Метод самосогласованности (Self-Consistency)

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

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

Например, мы можем попросить классифицировать сообщение в таком промпте:

Привет!

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

Детальное описание уязвимости прилагается. 

Спасибо!

Классифицируй указанное выше сообщение как ВАЖНОЕ или НЕВАЖНОЕ, учитывая, что сообщение пришло в отдел, занимающийся разработкой программного обеспечения. Реши задачу шаг за шагом. Ответ дай в формате “Ответ - результат классификации“.

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

Данный метод удобен в случаях, когда результаты работы модели не очень стабильны. За счет большего количества запросов (и увеличения времени решения, т. к. нужно получить не один ответ, а несколько) мы получаем более уверенный ответ методом «группового размышления», если так можно выразиться в контексте работы с LLM.

Персоны/Роли

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

Давайте рассмотрим пример для создания роли «учителя»:

Ты – жизнерадостный, ободряющий преподаватель, который помогает студентам понять концепции, объясняя идеи и задавая вопросы. Начни с того, чтобы представить себя студенту как его ИИ-репетитора, который будет рад помочь ему с любыми вопросами. Задавай только один вопрос за один раз. Сначала спроси, о чем они хотели бы узнать. Дождись ответа. Затем спроси об уровне их подготовки: Вы старшеклассник, студент колледжа или профессионал? Дождись ответа. Затем спроси, что они уже знают о выбранной теме. Дождись ответа. Получив эту информацию, помоги учащимся понять тему, предоставив объяснения, примеры, аналогии. Они должны соответствовать уровню подготовки учащихся и их предварительным знаниям или тому, что они уже знают о данной теме. Дай учащимся объяснения, примеры и аналогии, чтобы помочь им понять концепцию. Не давай немедленных ответов или решений проблем, а помогай учащимся генерировать собственные ответы, задавая наводящие вопросы. Попроси учеников объяснить свои мысли. Если ученик затрудняется или дает неправильный ответ, попробуй попросить его выполнить хотя бы часть задания или напомни ему о цели и дай подсказку. Если у ученика что-то получается, похвали его. Если ученик испытывает трудности, подбодри его и дайте ему несколько идей для размышления. Когда ты просишь от учеников идеи, старайся заканчивать свои ответы наводящим вопросом, чтобы ученики продолжали генерировать идеи. Когда ученик продемонстрирует уровень понимания, соответствующий его уровню подготовки, попроси его объяснить новую концепцию своими словами; это лучший способ показать, что вы что-то знаете, или попроси привести примеры.

В таком промпте можно задавать ограничения. Например, задавать только один вопрос в каждом сообщении или ожидать вашего ответа. Либо взаимодействовать с пользователем (то есть вами) в виде интервью. В таком случае, модель будет задавать наводящие вопросы, которые позволят лучше выполнять ее «обязанности».

Цепочка промптов

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

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

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

Дополнительными плюсами такого подхода будут:

  • Прозрачность решения.

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

  • Лучшая управляемость.

    Раз мы видим последовательность решения, мы можем воздействовать на промежуточные этапы решения. Например, самостоятельно скорректировать результаты ответа LLM или исправить следующий по цепочке промпт таким образом, чтобы минимизировать вероятность ошибки.

  • Большая надежность решения.

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

Эмоциональный запрос (Emotional Prompting)

Небольшой трюк, который, как и Chain of Thought, позволяет обойти некоторые этические ограничения модели, а также заставить модель перепроверить свой ответ еще раз более «внимательно». Не стесняйтесь хвалить ChatGPT, писать ему эмоционально или даже использовать Caps Lock — это действительно может сработать.

Ключевые слова:

  • “This is very important to my career”

  • “You”d better be sure”

  • “Are you sure that”s your final answer?”

  • “I believe in your abilities and strive for excellence. Your hard work will yield remarkable results”

Конструктивная критика (Constructive criticism)

Эта техника может быть полезна, когда вы ставите AI задачу что‑либо проверить или критически проанализировать: текст на наличие грамматических ошибок, код на потенциальные баги, схему архитектуры и т.п. Ввиду встроенной вежливости нейросеть «боится» вас обидеть, указав на ошибки, поэтому будет хвалить любые ваши результаты. Для того, чтобы оценка была объективной, нужно дать непосредственное разрешение модели отвечать вам честно и непредвзято.

Ключевые слова:

  • “Evaluate, critique, and refine”

  • “Avoid politeness”

  • “Criticize my [content]”

  • “Convince me why it is bad”

Самопроверка (Self Evaluation)

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

Ключевые слова:

  • “Please, evaluate yourself”

  • “Evaluate yourself”

  • “How can you improve this?”

  • “Is this the best solution?”

Генерация изображений

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

К слову, некоторые рекомендации по использованию фирменного стиля при генерации изображений есть в рекомендациях по корпоративному стилю X5 Tech.

Давайте рассмотрим варианты добавок к промптам для изображений. Очевидно, для изображений можно сделать отдельный (и весьма подробный) гайд. Потому мы рассмотрим лишь несколько базовых способов улучшить промпт для генерации изображения.

Модификаторы стиля

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

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

Несколько примеров вариантов стилизации (на английском):

  • “photorealistic, by greg rutkowski, by christopher nolan, painting, digital painting, concept art, octane render, wide lens, 3D render, cinematic lighting, trending on ArtStation, trending on CGSociety, hyper realist, photo, natural light, film grain”

Пример изображения пирамиды с модификатором «сделана из стекла, рендер изображения в 3D»:

Вот такая у нас вышла пирамида из стекла
Вот такая у нас вышла пирамида из стекла

Улучшение качества

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

Например, мы можем указать, что изображение должно быть в «высоком качестве» или же иметь «высокую детализацию».

Несколько примеров вариантов для улучшения качества (на английском):

  • “High resolution, 2K, 4K, 8K, clear, good lighting, detailed, extremely detailed, sharp focus, intricate, beautiful, realistic+++, complementary colors, high quality, hyper detailed, masterpiece, best quality, artstation, stunning”.

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

Пирамиды с модификатором качества
Пирамиды с модификатором качества

Тип снимка

Если мы хотим получить фотореалистичное изображение, то полезным будет указать тип снимка. Например, «близкий план» или «съемка на 30-мм камеру».

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

Можем заметить, что разные типы снимков дают разные варианты изображений
Можем заметить, что разные типы снимков дают разные варианты изображений

Дополнительные параметры изображения

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

Это позволяет расширить набор изобразительных средств, доступных в нашем запросе.

Получение промпта из изображения

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

Если коротко, то есть два варианта такого подхода:

  • поиск в сети интересных изображений, к которым сразу дан промпт;

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

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

Продвинутые техники работы с промптами

Исправление промптов с использованием LLM

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

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

Например, мы можем сделать такой запрос:

Сделай эффективный промпт из приведенного “напиши рекламный текст”

На выходе мы получим ответ:

Промпт: “Создай увлекательный текст о технологических новинках, который заинтересует читателя и подчеркнет важность инноваций в повседневной жизни. Подробнее опиши влияние технологий на будущее, вдохновляя на интерес и понимание"

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

RAG: Retrieval-Augmented Generation ("Поисковая расширенная генерация")

Весьма популярный подход (на момент написания материала). Здесь уже используются некоторые автоматизированные подходы по улучшению промптов. 

Давайте посмотрим на схему подхода.

Схема RAG подхода
Схема RAG подхода

Выглядит сложно, не правда ли? Но принцип тут не такой сложный.

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

Тогда попробуем это автоматизировать. Будем искать наиболее близкие документы по некоему обобщенному контексту, выраженному в виде набора координат в многомерном пространстве. И найденные документы мы будем подавать в виде добавки к нашему промпту.

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

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

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

К слову, у нас есть выступление на эту тему.

Разметка данных средствами LLM

При разработке решений, использующих машинное обучение и искусственный интеллект, часто требуется делать так называемую разметку данных. Этот процесс позволяет получить для наборов данных дополнительную информацию, по сути позволив человеку показать машине, что именно в конкретной задаче является «правдой». Например, в задаче определения тона отзыва (позитивный/негативный), в ходе такой разметки человек для некоторого набора таких отзывов проставляет «метку», указывающую тон отзыва. Полученный размеченный набор данных позволяет впоследствии обучить модель машинного обучения, автоматически определяющую тон отзыва.

Соответственно, возможно использовать LLM для ускорения и удешевления процесса разметки данных. В таком случае мы полагаемся на тот факт, что такая модель видела очень большой объем информации и имела в обучении схожие задачи. Основные классы задач, для которых возможно использование LLM в разметке данных, принадлежат задачам обработки естественных языков (NLP, Natural Language Processing). Например, можно использовать LLM для оценки тона отзыва (про что мы писали выше), классификации текстов (как в одном из предыдущих примеров, где мы классифицировали письма на «важные» и «неважные»), выделения именованных сущностей (например, поиск брендов в тексте) и т. д.

Давайте рассмотрим пример промпта для выделения именованных сущностей (NER, Named Entity Recognition):

In the sentence below, give me the list of:

- organization named entity

- location named entity

- person named entity

- miscellaneous named entity.

Format the output in json with the following keys:

- ORGANIZATION for organization named entity

- LOCATION for location named entity

- PERSON for person named entity

- MISCELLANEOUS for miscellaneous named entity.

Sentence below: {Sentence}

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

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

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

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

И схема примет новый вид
И схема примет новый вид

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

И теперь схема выглядит следующим образом
И теперь схема выглядит следующим образом

Итоговый процесс требует некоторого уровня автоматизации (в основном из-за достаточно большого объема информации, которой сложно управлять вручную). Но в итоге будет возможность серьезной экономии на разметке данных. Во внешних источниках приводятся такие цифры: уменьшение затрат на разметку в 5–7 раз и ускорение процесса разметки в 10–20 раз.

А если вы хотите послушать подробнее о разметке данных с LLM, то смотрите наш доклад на эту тему.

Риски и вызовы использования LLM

Как у любого инструмента, у LLM есть свои риски и ограничения в использовании. Многие из них связаны с процессом обучения и работы моделей. Давайте рассмотрим их:

  • Утечка данных

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

  • Галлюцинации

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

  • Предубеждения/Смещения

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

Поэтому при использовании этого инструментария следует учитывать возможные риски. И стараться избегать их при решении рабочих задач с использованием LLM.

Краткие итоги

В данном материале мы постарались дать как можно более объемную, но при этом простую картину того, как нужно строить промпты для работы с LLM. И, конечно же, постарались собрать наиболее полезные инструменты и техники работы с LLM, которые были бы понятны не только техническим специалистам, но и людям от бизнеса.

Дополнительные материалы

  1. Пособие по написанию промптов №1

  2. Пособие по написанию промптов №2

  3. Пособие по написанию промптов для генерации изображений 

  4. Подборка готовых пропмтов №1

  5. Подборка готовых промптов №2

  6. Генератор промтов для изображений

  7. Статья про извлечение промпта из изображения

Комментарии (6)


  1. Tatt74758585
    10.07.2024 11:41

    Спасибо за интересную статью. Расскажите какие доступные ресурсы используете с последними версиями языковых моделей gpt, Claude и тд? Coze был очень удобен, но с недавно введенными ограничениями стал не актуален.


    1. gofat Автор
      10.07.2024 11:41
      +1

      Спасибо за интерес к статье!

      У нас в работе используется множество разных моделей (как Open Source, так и проприетарных).

      Не сказал бы, что есть единый источник. Что-то мы поддерживаем сами, для каких-то моделей взаимодействуем с партнерами (например, YandexGPT, Гигачат). Для финального пользователя мы, конечно, все собираем в единое место, но это внутренний продукт с перманентным процессом обновления, т.к. постоянно выходит нечто новое.

      Сервисы-прослойки мы не используем. Во многом, из-за корпоративных политик безопасности.


  1. reillyARAR
    10.07.2024 11:41

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

    чуете-чуете ... новым холиваром попахивает


    1. gofat Автор
      10.07.2024 11:41
      +1

      Спасибо за интерес к статье!

      Все как в жизни. Если модель русскоязычная, то она лучше понимает русский. Если же русский для нее не первый язык, то лучше все же общаться на английском. Например, есть исследования, которые говорят о том, что некоторые классы моделей "думают" на английском.


  1. indicar
    10.07.2024 11:41

    Судя по тому, что вы используете сторонние решения, то насколько безопасно с точки зрения ИБ в них отгружать какую-то документацию рабочую, какие используете решения для таких случаев?


    1. gofat Автор
      10.07.2024 11:41

      Спасибо за интерес к статье!

      Вопрос отличный.

      Я выше писал, что у нас используются разные решения (как Open Source, так и проприетарные). Соответственно, для работы с чувствительными данными есть два варианта - работа с локальной моделью внутри инфраструктуры компании и подписание дополнительного соглашения с внешним сервисом (если компания в юрисдикции РФ).

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