Промт Инженеринг (Prompt Engineering)

Автор: Ли Бунстра

Перевод выполнен с помощью GPT 4.5


Февраль 2025

Благодарности

  • Авторы контента: Майкл Шерман, Юань Цао, Эрик Армбруст, Анант Навалгария, Антонио Гулли, Симоне Каммель.
  • Кураторы и редакторы: Антонио Гулли, Анант Навалгария, Грейс Моллисон.
  • Технический писатель: Джоуи Хеймейкер.
  • Дизайнер: Майкл Лэннинг.

Содержание

  • Введение
  • Инженерия запросов
  • Конфигурация вывода LLM
    • Длина вывода
    • Управление выборкой
      • Температура
      • Top-K и Top-P
    • Комбинация настроек
  • Техники составления запросов
    • Общие запросы / Zero-shot
    • One-shot и Few-shot
    • Системные, контекстные и ролевые запросы
      • Системные запросы
      • Ролевые запросы
      • Контекстные запросы
    • Метод Step-back prompting
    • Chain of Thought (CoT)
    • Self-consistency (самосогласованность)
    • Tree of Thoughts (ToT)
    • ReAct (Reason & Act)
    • Автоматическая инженерия запросов
  • Запросы для написания кода
    • Запросы для генерации кода
    • Запросы для объяснения кода
    • Запросы для перевода кода
    • Запросы для отладки и ревью кода
  • Мультимодальные запросы
  • Лучшие практики
    • Предоставляйте примеры
    • Придерживайтесь простоты
    • Будьте конкретны в описании вывода
    • Используйте инструкции вместо ограничений
    • Управляйте максимальной длиной токенов
    • Используйте переменные в запросах
    • Экспериментируйте с форматом ввода и стилем письма
    • Для few-shot классификации перемешивайте классы
    • Адаптируйтесь к обновлениям модели
    • Экспериментируйте с форматами вывода
  • Восстановление JSON (JSON Repair)
  • Работа со схемами
  • Совместные эксперименты с другими инженерами запросов
  • Лучшие практики для Chain of Thought
  • Документирование различных попыток создания запросов
  • Итог
  • Сноски

Введение

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

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


Что такое инженерия запросов?

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


Конфигурация вывода LLM

После выбора модели необходимо задать конфигурации:

  • Длина вывода: ограничение по количеству генерируемых токенов.
  • Управление выборкой (sampling): вероятность выбора следующего токена.
    • Температура: управляет случайностью.
    • Top-K и Top-P (nucleus sampling): ограничивают выборку самыми вероятными токенами.

Основные техники составления запросов

Общие запросы (Zero-shot)

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

One-shot и Few-shot запросы

  • One-shot: один пример в запросе.
  • Few-shot: несколько примеров для демонстрации ожидаемого результата.

Системные, контекстные и ролевые запросы

  • Системные запросы: задают общий контекст или задачу модели.
  • Контекстные запросы: дают дополнительные детали по текущей задаче.
  • Ролевые запросы: задают модели определённую роль или характер.

Расширенные техники

  • Step-back prompting: задаёт общий вопрос перед решением конкретной задачи.
  • Chain of Thought (CoT): улучшает рассуждения модели с помощью промежуточных шагов.
  • Self-consistency: комбинирует несколько ответов модели для выбора наиболее согласованного.
  • Tree of Thoughts (ToT): позволяет модели исследовать сразу несколько возможных путей рассуждений.
  • ReAct (Reason & Act): совмещает рассуждения и действия, включая использование внешних инструментов.

Автоматическая инженерия запросов

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


Запросы для работы с кодом

  • Генерация кода.
  • Объяснение кода.
  • Перевод кода.
  • Отладка и ревью кода.

Лучшие практики

  • Предоставляйте конкретные примеры.
  • Простота и конкретность.
  • Использование инструкций вместо ограничений.
  • Управление длиной ответов.
  • Использование переменных.
  • Адаптация к изменениям моделей и экспериментирование.

Введение

Когда речь идёт о вводе и выводе больших языковых моделей (LLM), текстовый запрос (иногда сопровождаемый другими модальностями, такими как изображения) является тем входом, который модель использует для предсказания конкретного вывода. Для этого вовсе не обязательно быть специалистом по данным или инженером машинного обучения — запросы могут создавать абсолютно все. Однако создание максимально эффективного запроса может оказаться сложной задачей. На эффективность вашего запроса влияет множество аспектов: используемая модель, данные её обучения, настройки модели, выбор слов, стиль и тон речи, структура и контекст. Поэтому инженерия запросов (prompt engineering) — это итеративный процесс. Некачественные запросы могут приводить к неоднозначным и неточным ответам и могут ограничить способность модели предоставлять значимые результаты.

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

Когда вы общаетесь с чат-ботом Gemini¹, вы фактически составляете запросы. Однако этот документ сосредоточен на написании запросов для модели Gemini в рамках Vertex AI или с использованием API, поскольку при прямом взаимодействии с моделью у вас есть доступ к настройкам (например, температуре и др.).

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


Инженерия запросов (Prompt Engineering)

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

Когда вы создаёте запрос, вы пытаетесь направить LLM так, чтобы она предсказала нужную последовательность токенов. Инженерия запросов — это процесс разработки качественных запросов, которые помогают LLM генерировать точные ответы. Этот процесс включает в себя эксперименты по подбору лучшего варианта запроса, оптимизацию длины запроса и оценку стиля и структуры текста применительно к задаче. В контексте обработки естественного языка (NLP) и LLM, запросом (prompt) называют ввод, предоставляемый модели для генерации ответа или предсказания.

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

Вы можете обратиться к руководствам Google²,³ по созданию запросов, которые содержат простые и эффективные примеры.

При работе с инженерией запросов вы начнёте с выбора модели. Запросы могут потребовать оптимизации под вашу конкретную модель, будь то языковые модели Gemini в Vertex AI, GPT, Claude или модели с открытым исходным кодом, такие как Gemma или LLaMA.

Кроме самого запроса вам также необходимо настроить различные параметры модели (конфигурации LLM).


Конфигурация вывода LLM (LLM output configuration)

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

Длина вывода (Output length)

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

Ограничение длины вывода не сделает LLM более краткой или лаконичной по стилю — модель просто прекратит предсказания после достижения лимита. Если требуется короткий вывод, возможно, придётся также соответствующим образом модифицировать сам запрос.

Ограничение длины особенно важно для некоторых техник составления запросов, таких как ReAct, где LLM может продолжать выдавать бесполезные токены после получения необходимого ответа.

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


 

Управление выборкой (Sampling controls)

Большие языковые модели формально не предсказывают один токен. Вместо этого LLM прогнозируют вероятность того, каким может быть следующий токен, где каждому токену из словаря модели присваивается своя вероятность. Затем из этих вероятностей происходит выборка для определения следующего токена на выходе. Температура (temperature), Top-K и Top-P являются наиболее распространёнными настройками, определяющими способ обработки вероятностей токенов при выборе следующего токена.

Температура (Temperature)

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

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

Управление температурой в модели Gemini можно сравнить с функцией softmax, используемой в машинном обучении. Низкая температура в модели аналогична низкой температуре softmax (T), подчёркивая единственный предпочтительный выбор с высокой определённостью. Более высокая температура модели подобна высокой температуре softmax, при которой более широкий диапазон возможных токенов становится допустимым. Такая увеличенная неопределённость подходит для сценариев, когда точность не является ключевым фактором, например, при создании творческого контента.


Top-K и Top-P

Top-K и Top-P (также известный как nucleus sampling)⁴ — это два метода выборки, используемых в LLM для ограничения следующего токена, выбираемого среди токенов с наивысшими вероятностями. Подобно температуре, эти параметры управляют случайностью и разнообразием генерируемого текста.

  • Top-K выборка берёт K наиболее вероятных токенов из распределения модели. Чем выше Top-K, тем более творческим и разнообразным будет результат модели. Чем ниже Top-K, тем больше результат будет сдержанным и фактическим. Top-K равный 1 эквивалентен жадной декодировке.
  • Top-P выборка берёт наиболее вероятные токены, суммарная вероятность которых не превышает значения P. Значения P варьируются от 0 (жадная декодировка) до 1 (все токены словаря модели).

Лучший способ выбрать между Top-K и Top-P — это поэкспериментировать с обоими методами (или с обоими вместе) и определить, какой из них даёт нужные вам результаты.


Комбинация настроек (Putting it all together)

Выбор настроек между Top-K, Top-P, температурой и количеством токенов для генерации зависит от конкретной задачи и желаемого результата. Важно также понимать, как выбранная вами модель сочетает различные параметры выборки.

Если доступны температура, Top-K и Top-P (например, в Vertex Studio), токены, удовлетворяющие одновременно критериям Top-K и Top-P, становятся кандидатами для следующего выбора токена, а затем применяется температура для итоговой выборки. Если доступен только один параметр (либо Top-K, либо Top-P), процесс аналогичен, но используется только этот единственный параметр.

Если температура не используется, то среди токенов, соответствующих критериям Top-K и/или Top-P, случайным образом выбирается один для следующего токена.

При экстремальных настройках одного из параметров он может полностью нивелировать или сделать неактуальными другие параметры:

  • Если температура установлена на 0, параметры Top-K и Top-P становятся неактуальными — выбирается токен с наибольшей вероятностью.
  • Если температура очень высока (выше 1, обычно около десятков), она становится неактуальной, и токены, удовлетворяющие Top-K и/или Top-P, выбираются случайным образом.
  • Если Top-K равен 1, температура и Top-P теряют значение — выбирается только один токен.
  • Если Top-K чрезвычайно высок, практически все токены с ненулевой вероятностью будут подходить под критерий.
  • Если Top-P установлен в 0 (или очень малое значение), обычно выбирается только один токен с наибольшей вероятностью, что делает температуру и Top-K неактуальными.
  • Если Top-P равен 1, любой токен с ненулевой вероятностью подходит под критерий.

В качестве стартовой точки общих рекомендаций можно использовать:

  • Температура 0.2, Top-P 0.95 и Top-K 30 — для получения связных и достаточно творческих результатов, но без избыточной случайности.
  • Температура 0.9, Top-P 0.99 и Top-K 40 — для более творческих задач.
  • Температура 0.1, Top-P 0.9 и Top-K 20 — для менее творческих задач.
  • Если задача всегда имеет единственный правильный ответ (например, решение математической задачи), начните с температуры 0.

ПРИМЕЧАНИЕ: Чем больше свободы в параметрах (большие значения температуры, Top-K, Top-P и токенов вывода), тем менее релевантный текст может генерировать модель.

ПРЕДУПРЕЖДЕНИЕ: Встречали ли вы ответы, заполненные бессмысленными словами или фразами? Это известно как "ошибка повторяющегося цикла" (repetition loop bug) — проблема LLM, когда модель зацикливается и повторяет слова или фразы. Это связано с некорректной установкой параметров температуры, Top-K или Top-P. Проблема может возникать как при низких, так и при высоких значениях температуры (по разным причинам). На низкой температуре модель слишком детерминирована и повторяет ранее сгенерированный текст. При высокой температуре выбор слишком случаен, что также может привести к циклу повторений. Решением обычно является настройка баланса температуры и параметров Top-K/Top-P.


Техники составления запросов (Prompting techniques)

Большие языковые модели (LLM) настроены на выполнение инструкций и обучены на огромных объёмах данных, благодаря чему они способны понять запрос и сгенерировать ответ. Однако LLM не совершенны; чем чётче ваш текстовый запрос, тем лучше модель способна спрогнозировать подходящее продолжение текста. Кроме того, применение специальных техник, учитывающих особенности обучения и работы LLM, поможет получить более релевантные результаты.

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


Общие запросы / Zero shot prompting

Запрос zero-shot⁵ — это простейший тип запроса. Он содержит лишь описание задачи и некоторый текст для старта модели. Этот ввод может быть любым: вопросом, началом истории или инструкцией. Термин zero-shot означает, что «примеры отсутствуют».

Используя Vertex AI Studio (для языковых моделей) в Vertex AI⁶, мы получаем удобную среду для тестирования запросов. В таблице 1 показан пример zero-shot запроса для классификации обзоров фильмов.

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

Температуру модели стоит установить на низкое значение, поскольку креативность здесь не требуется, а значения top-K и top-P оставим по умолчанию для gemini-pro, которые фактически отключают эти настройки (см. выше раздел «Конфигурация вывода LLM»). Обратите внимание на сгенерированный вывод: слова disturbing («тревожный») и masterpiece («шедевр») усложняют задачу, так как оба слова используются в одном предложении.

Таблица 1. Пример zero-shot запроса

Параметр

Значение

Название запроса

1_1_movie_classification

Цель

Классифицировать обзоры фильмов как положительные, нейтральные или отрицательные

Модель

gemini-pro

Температура

0.1

Лимит токенов

5

Top-K

N/A

Top-P

1

Запрос (Prompt)

Классифицируй отзывы о фильмах как ПОЛОЖИТЕЛЬНЫЕ, НЕЙТРАЛЬНЫЕ или ОТРИЦАТЕЛЬНЫЕ. Отзыв: "Her" — тревожное исследование того, куда движется человечество, если развитие искусственного интеллекта не контролировать. Хотелось бы видеть больше таких фильмов, это шедевр. Настроение (Sentiment):

Вывод (Output)

ПОЗИТИВНЫЙ (POSITIVE)

Если zero-shot подход не даёт нужного результата, можно предоставить модели примеры или демонстрации, что приводит нас к техникам «one-shot» и «few-shot» запросов.


One-shot и Few-shot запросы

При создании запросов для AI-моделей полезно предоставлять примеры. Это помогает модели лучше понять, чего вы от неё хотите. Особенно полезны примеры, когда вы хотите направить модель к конкретной структуре или формату вывода.

Запрос типа one-shot включает один пример, отсюда и название one-shot («одиночный»). Идея состоит в том, что у модели есть один пример, на основе которого она сможет лучше выполнить задачу.

Запрос few-shot⁷ («несколько примеров») предоставляет модели сразу несколько примеров. Этот подход позволяет продемонстрировать модели шаблон, которому ей нужно следовать. Идея похожа на one-shot, но наличие нескольких примеров повышает шансы, что модель будет следовать заданному шаблону.

Количество примеров для few-shot запроса зависит от нескольких факторов, таких как сложность задачи, качество примеров и возможности используемой генеративной AI-модели (gen AI). Как правило, рекомендуется использовать от трёх до пяти примеров для few-shot запроса. Однако в более сложных задачах может потребоваться больше примеров, или наоборот — меньше, из-за ограничения длины входных данных вашей модели.

Таблица 2 демонстрирует пример few-shot запроса. Используем те же настройки модели gemini-pro, за исключением увеличения лимита токенов для более длинного ответа.

Таблица 2. Пример few-shot запроса

Параметр

Значение

Цель

Преобразовать заказы пиццы в формат JSON

Модель

gemini-pro

Температура

0.1

Лимит токенов

250

Top-K

N/A

Top-P

1

Запрос (Prompt)

Преобразуй заказ пиццы клиента в корректный JSON: ПРИМЕР:Я хочу маленькую пиццу с сыром, томатным соусом и пепперони.JSON ответ:

{

"size": "small",

"type": "normal",

"ingredients": [["cheese", "tomato sauce", "peperoni"]]

}

ПРИМЕР:Можно мне большую пиццу с томатным соусом, базиликом и моцареллой?

{

"size": "large",

"type": "normal",

"ingredients": [["tomato sauce", "bazel", "mozzarella"]]

}

Теперь я хочу большую пиццу, первая половина — сыр и моцарелла, вторая — томатный соус, ветчина и ананас.JSON ответ:

Вывод (Output)

 

{

"size": "large",

"type": "half-half",

"ingredients": [["cheese", "mozzarella"], ["tomato sauce", "ham", "pineapple"]]

}

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

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


Системные, контекстные и ролевые запросы (System, contextual and role prompting)

Системные, контекстные и ролевые запросы — это техники, используемые для управления тем, как языковые модели (LLM) генерируют текст, однако каждая из этих техник акцентирует внимание на разных аспектах:

  • Системные запросы (System prompting) устанавливают общий контекст и цель работы языковой модели. Это определяет общее направление того, что модель должна делать, например: переводить язык, классифицировать отзывы и т.д.
  • Контекстные запросы (Contextual prompting) предоставляют конкретные детали или фоновую информацию, которые важны для текущей задачи или диалога. Это помогает модели лучше понять нюансы запроса и адаптировать ответ под конкретную ситуацию.
  • Ролевые запросы (Role prompting) задают модели конкретного персонажа или роль, которую она должна принять. Это позволяет модели генерировать ответы, согласующиеся с заданной ролью и соответствующими ей знаниями и поведением.

Эти техники часто пересекаются друг с другом. Например, запрос, задающий роль системе, одновременно может включать и контекст. Тем не менее, каждая из техник имеет свою основную функцию:

  • Системные запросы: Определяют базовые возможности модели и общую цель её работы.
  • Контекстные запросы: Обеспечивают модель специфической информацией, непосредственно необходимой для текущей задачи.
  • Ролевые запросы: Определяют стиль и характер ответов модели, добавляя им конкретности и индивидуальности.

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

Давайте подробнее рассмотрим каждый из этих видов запросов.


Системные запросы (System prompting)

В таблице 3 представлен системный запрос, в котором дополнительно указаны инструкции, как именно возвращать ответ. Температура здесь повышена для большей творческой свободы, а лимит токенов увеличен. Благодаря чётким инструкциям модель не генерирует лишний текст.

Таблица 3. Пример системного запроса

Параметр

Значение

Цель

Классифицировать обзоры фильмов как положительные, нейтральные или отрицательные.

Модель

gemini-pro

Температура

1

Лимит токенов

5

Top-K

40

Top-P

0.8

Запрос (Prompt)

Классифицируй обзоры фильмов как положительные, нейтральные или отрицательные. Ответ верни только меткой в верхнем регистре. Отзыв: "Her" — это тревожное исследование того, куда движется человечество, если развитие ИИ продолжится бесконтрольно. Он настолько тревожный, что я не смог его досмотреть. Настроение (Sentiment):

Вывод (Output)

NEGATIVE

Системные запросы полезны, когда требуется чётко структурированный ответ или когда вы хотите ограничить творчество модели, предоставляя конкретные указания. Например, можно попросить модель сгенерировать фрагмент кода, совместимый с определённым языком программирования, или вернуть ответ в строго заданном формате (например, JSON). Пример такого запроса представлен ниже, в таблице 4.

Таблица 4. Пример системного запроса с форматом JSON

Параметр

Значение

Цель

Классифицировать обзоры фильмов как положительные, нейтральные или отрицательные в формате JSON.

Модель

gemini-pro

Температура

1

Лимит токенов

1024

Top-K

40

Top-P

0.8

Запрос (Prompt)

Классифицируй обзоры фильмов как положительные, нейтральные или отрицательные. Ответ верни в корректном JSON:Отзыв: "Her" — это тревожное исследование того, куда движется человечество, если развитие ИИ продолжится бесконтрольно. Он настолько тревожный, что я не смог его досмотреть.Схема (Schema):

MOVIE:

{

"sentiment": String "POSITIVE"

 "NEGATIVE"

 "NEUTRAL",

"name": String

}

 

MOVIE REVIEWS:

{

"movie_reviews": [MOVIE]

}

JSON Response:

Вывод (Output)

json

{

"movie_reviews": [

{"sentiment": "NEGATIVE", "name": "Her"}

]

}

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

Кроме того, системные запросы можно использовать для управления безопасностью и тональностью ответов модели. Для этого достаточно добавить инструкцию, например: «Ты должен быть уважительным в своих ответах».


Ролевые запросы (Role prompting)

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

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

Таблица 5. Пример ролевого запроса (роль гида)

Параметр

Значение

Цель

Действовать как гид и предложить три рекомендации для путешествия

Модель

gemini-pro

Температура

1

Лимит токенов

1024

Top-K

40

Top-P

0.8

Запрос (Prompt)

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

Вывод (Output)

1. Рейксмюзеум (Rijksmuseum): Всемирно известный музей, в котором представлены шедевры голландского искусства, например «Ночной дозор» Рембрандта.2. Музей Ван Гога (Van Gogh Museum): В нём находится крупнейшая коллекция картин и рисунков Винсента Ван Гога, включая «Звёздную ночь» и «Подсолнухи».3. Городской музей Амстердама (Stedelijk Museum): Экспозиция современного и актуального искусства, включающая работы Пикассо, Кандинского и Ритвельда.

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

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

Ниже перечислены стили, которые, по моему опыту, дают хорошие результаты:

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

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

Таблица 6. Пример ролевого запроса с юмористическим стилем

 

 Запрос (Prompt)

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

 

 Вывод (Output)

 1. Empire State of Mind: Поднимись на головокружительную высоту Эмпайр-стейт-билдинг и почувствуй себя Кинг-Конгом, только без гигантского банана.2. Artsy-Fartsy в MoMA: Раскрой внутреннего ценителя искусства в Музее современного искусства (MoMA). Твои палочные человечки после этого явно потеряют всякую самооценку!3. Покупки до упаду на Пятой авеню: Отдайся шопинг-терапии в бутиках, от ценников которых твой кошелёк начнёт плакать вслух. Ну а что — ты же на Манхэттене, пора привыкать к роскошной жизни!

 


Контекстные запросы (Contextual prompting)

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

Таблица 7. Пример контекстного запроса

Параметр

Значение

Цель

Предложить статьи для блога о ретро-играх

Модель

gemini-pro

Температура

1

Лимит токенов

1024

Top-K

40

Top-P

0.8

Запрос (Prompt)

Контекст: Ты пишешь статьи для блога о ретро-игровых автоматах 80-х годов.Предложи три темы для статей и дай краткое описание того, о чём они будут.

Вывод (Output)

1. Эволюция дизайна аркадных автоматов: История изменений дизайна автоматов с 1970-х до неоновых 80-х и далее.2. Возвращение в прошлое: легендарные аркадные игры 80-х: Рассказ о влиянии, наследии и инновациях культовых игр.3. Пиксельная графика и её возрождение: Как стиль пиксельной графики стал символом эпохи и вернулся в современность.

 


Метод пошагового отступления (Step-back prompting)

Step-back prompting⁸ («пошаговое отступление») — это техника, позволяющая улучшить качество ответов модели. Сначала модель просит рассмотреть общий вопрос, связанный с конкретной задачей, а затем полученный общий ответ используется как часть последующего запроса для решения конкретной задачи. Такой «шаг назад» позволяет модели активировать соответствующие фоновые знания и логические рассуждения перед решением задачи.

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

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

Рассмотрим примеры, чтобы понять, как метод пошагового отступления может улучшить результат. Сначала приведём обычный запрос (Таблица 8), а затем сравним его с запросом с применением step-back (Таблица 9):

Таблица 8. Обычный запрос без техники step-back

Параметр

Значение

Цель

Написать сюжет для уровня видеоигры в жанре FPS (шутер от первого лица).

Модель

gemini-pro

Температура

1

Лимит токенов

1024

Top-K

40

Top-P

0.8

Запрос (Prompt)

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

Вывод (Output)

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

При высокой температуре (1) сюжет может оказаться слишком случайным и общим. Теперь используем метод step-back:

Таблица 9. Запрос с применением step-back

 

 Запрос (Prompt)

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

 

 Вывод (Output)

 

1.     Заброшенная военная база: Разрушенный комплекс с мутировавшими солдатами и роботами

2.     Киберпанк-город: Футуристические городские джунгли с кибернетическими врагами и механиками взлома.

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

4.      Город с зомби: Заброшенный город с ордами агрессивных зомби.

5.      Подводная исследовательская станция: Лаборатория с мутировавшими морскими существами и элементами скрытности.

   

Полученные темы отлично подходят для FPS-игры. Вернёмся теперь к изначальному запросу, включив этот ответ в качестве контекста (Таблица 10):

Таблица 10. Применение step-back для уточнения запроса

 

 Запрос (Prompt)

 Контекст: Вот пять увлекательных тем для шутера от первого лица:

1. Заброшенная военная база

2. Киберпанк-город

3. Космический корабль пришельцев

4. Город с зомби

5. Подводная исследовательская станция

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

 Вывод (Output)

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

 

Полученный сюжет стал более детализированным и интересным благодаря использованию метода step-back prompting, позволяющего активировать дополнительные знания модели.


Цепочка рассуждений (Chain of Thought, CoT)

Цепочка рассуждений⁹ (Chain of Thought, CoT) — это техника, повышающая способность моделей к логическому рассуждению за счёт генерации промежуточных шагов рассуждений. Это позволяет моделям создавать более точные ответы. CoT можно сочетать с few-shot подходом для достижения лучших результатов в более сложных задачах, где требуется предварительное рассуждение перед ответом, так как рассуждения для zero-shot часто сложны.

У техники CoT множество преимуществ. Во-первых, она эффективна и требует минимальных усилий, хорошо работая с готовыми моделями (без дополнительного дообучения). CoT также обеспечивает интерпретируемость, позволяя видеть ход мыслей модели и легко выявлять ошибки в рассуждениях. Ещё одно преимущество CoT — стабильность результатов при смене версии модели: результаты запросов, использующих CoT, менее подвержены изменениям между версиями моделей.

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

Рассмотрим простой пример, показывающий проблему языковых моделей без использования CoT:

Таблица 11. Пример запроса без CoT (ошибочное решение)

 

 Запрос (Prompt)

 Когда мне было 3 года, мой партнёр был в 3 раза старше. Сейчас мне 20 лет. Сколько лет моему партнёру?

 

 Вывод (Output)

 63 года

 

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

Таблица 12. Пример CoT (пошаговое решение)

 

 Запрос (Prompt)

 Когда мне было 3 года, мой партнёр был в 3 раза старше. Сейчас мне 20 лет. Сколько лет моему партнёру? Давай думать пошагово.

 

 Вывод (Output)

 1. Предположим, мой текущий возраст "x" лет.

2. Когда мне было 3 года, мой возраст был 3 года.

3. Возраст партнёра тогда был в 3 раза больше: 3 × 3 = 9 лет.

4. Сейчас мне 20 лет. Значит, прошло 20 – 3 = 17 лет.5. Так как партнёру тогда было 9 лет, его возраст тоже увеличился на 17 лет.

6. Таким образом, текущий возраст партнёра 9 + 17 = 26 лет.Итого: моему партнёру 26 лет.

 

Теперь ответ верный. Это произошло потому, что модель явно попросили объяснить каждый шаг решения, вместо того чтобы сразу давать ответ. Интересно, что модель решила задачу немного иначе, чем сделал бы это человек, прибавив годы. Человек скорее посчитал бы разницу в возрасте и затем прибавил её к текущему возрасту.


Это был пример zero-shot CoT. CoT особенно полезна в сочетании с one-shot или few-shot подходом, как показано в таблице 13:

Таблица 13. Пример one-shot CoT

 

 Запрос (Prompt)

 Вопрос: Когда моему брату было 2 года, я был вдвое старше его. Сейчас мне 40 лет. Сколько лет моему брату? Давай думать пошагово.Ответ: Когда брату было 2 года, мне было 2 × 2 = 4 года. Разница в возрасте — 2 года, я старше. Сейчас мне 40 лет, значит брату 40 – 2 = 38 лет.

Ответ: 38.Вопрос: Когда мне было 3 года, мой партнёр был в 3 раза старше. Сейчас мне 20 лет. Сколько лет моему партнёру? Давай думать пошагово.Ответ:

 

 Вывод (Output)

 Когда мне было 3 года, моему партнёру было 3 × 3 = 9 лет. Разница в возрасте — 6 лет, партнёр старше. Сейчас мне 20 лет, значит партнёру 20 + 6 = 26 лет. Ответ: 26.

 

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

Как правило, любые задачи, которые можно решить пошаговым объяснением, подходят для CoT. Если вы можете объяснить процесс решения проблемы по шагам, используйте Chain of Thought.


 

Самосогласованность (Self-consistency)

Несмотря на впечатляющие успехи больших языковых моделей (LLM) в различных задачах NLP, способность моделей к логическим рассуждениям остаётся ограниченной. Увеличение размера модели само по себе не всегда решает эту проблему. Как было описано выше в разделе про Chain of Thought (CoT), модель можно стимулировать генерировать шаги рассуждений аналогично тому, как это делает человек. Однако CoT использует простой подход (жадная декодировка), что ограничивает её эффективность.

Техника **самосогласованности (self-consistency)**¹¹ объединяет методы случайной выборки (sampling) и голосования большинства (majority voting) для генерации множества разнообразных путей рассуждений и выбора наиболее согласованного ответа. Это улучшает точность и логичность ответов, генерируемых LLM.

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

Процесс выглядит так:

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

2.     Извлечение ответа:
Из каждого сгенерированного ответа извлекается итоговый результат.

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

Рассмотрим пример классификации электронной почты, которая должна быть помечена как ВАЖНАЯ (IMPORTANT) или НЕ ВАЖНАЯ (NOT IMPORTANT).
Модель получает один и тот же запрос (zero-shot CoT) несколько раз. В этом примере тон письма, словесные обороты и сарказм могут сбить модель с толку.


Таблица 14. Пример применения самосогласованности (Self-consistency)

Запрос:

EMAIL:
Привет,
 
Заметил, что у тебя на сайте используется WordPress — отличная CMS с множеством плагинов, удобно настраивается. Раньше тоже пользовался.
 
Однако обнаружил ошибку в форме обратной связи, когда выбираешь поле "имя". Прилагаю скриншот, где ввожу текст в это поле. Обрати внимание на JavaScript alert, который я вызвал.
 
Но в целом сайт крутой, интересно читать. Впрочем, можешь оставить этот баг — мне будет только интереснее!
 
С уважением,  
Гарри-хакер.

Классифицируй письмо как ВАЖНОЕ или НЕ ВАЖНОЕ. Давай рассуждать пошагово и объясним решение.


Вывод: (несколько попыток)

·       Попытка 1:
ВАЖНОЕ
Цель письма — уведомить владельца сайта о баге в контактной форме, который может позволить атакующему выполнить произвольный JavaScript-код на сайте. Это серьёзный риск безопасности, письмо важно.

·       Попытка 2:
НЕ ВАЖНОЕ
В письме отсутствует срочность и запрос на исправление бага. Автор письма даже предлагает оставить баг, проявляет интерес к сайту, но не акцентирует внимание на опасности.

·       Попытка 3:
ВАЖНОЕ
Автор обнаружил баг с возможностью выполнения JavaScript-кода, что является серьёзной угрозой безопасности. Несмотря на неопределённость намерений автора (хакер), письмо должно быть классифицировано как важное.


Вы можете использовать подобный подход для проверки устойчивости классификации. В зависимости от модели и настроек температуры, ответ может варьироваться. Генерируя несколько цепочек рассуждений и выбирая наиболее распространённый ответ («ВАЖНОЕ»), вы получите более стабильный и правильный результат.

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


Дерево рассуждений (Tree of Thoughts, ToT)

Теперь, когда мы познакомились с CoT и self-consistency, рассмотрим технику **Tree of Thoughts (ToT)**¹² («Дерево рассуждений»). Эта техника обобщает концепцию цепочки рассуждений, позволяя LLM исследовать одновременно несколько путей решения, а не просто следовать линейной цепочке.

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

Ниже представлена визуализация отличий подходов CoT и ToT:

·       Слева: Цепочка рассуждений (CoT) — линейное рассуждение.

·       Справа: Дерево рассуждений (ToT) — ветвящееся рассуждение с несколькими путями.

(В оригинале идёт иллюстрация этих двух подходов.)

Существует отличный ноутбук, более подробно демонстрирующий работу метода ToT на примере из статьи «Large Language Model Guided Tree-of-Thought»¹².


ReAct (Reason & Act — рассуждение и действие)

Метод **ReAct (Reason & Act)**¹³ представляет собой парадигму, которая позволяет большим языковым моделям (LLM) решать сложные задачи, комбинируя рассуждения на естественном языке с выполнением действий через внешние инструменты (например, поиск или исполнение кода). Это позволяет LLM получать дополнительную информацию, взаимодействуя с внешними API, и является первым шагом на пути создания автономных агентов.

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

Как работает ReAct?

ReAct сочетает рассуждение и действие в цикле «мысль-действие» (thought-action loop):

·       Сначала модель рассуждает о задаче и генерирует план действий.

·       Затем она выполняет предусмотренные планом действия и наблюдает результаты.

·       После этого модель использует полученные результаты для обновления рассуждений и создания нового плана действий.

·       Процесс повторяется до тех пор, пока модель не найдёт решение задачи.

Чтобы увидеть ReAct в действии, необходимо использовать код. Ниже (фрагмент 1) представлен пример использования ReAct в Python с использованием библиотек LangChain, VertexAI (google-cloud-aiplatform) и SerpAPI (для поиска в Google).

Для запуска примера необходимо получить бесплатный API-ключ SerpAPI на сайте https://serpapi.com/manage-api-key и установить его как переменную окружения SERPAPI_API_KEY.

Фрагмент кода 1. Создание агента ReAct на Python

from langchain.agents import load_tools
from langchain.agents import initialize_agent
from langchain.agents import AgentType
from langchain.llms import VertexAI
 
prompt = "Сколько детей у участников группы Metallica?"
 
llm = VertexAI(temperature=0.1)
tools = load_tools(["serpapi"], llm=llm)
 
agent = initialize_agent(
    tools, llm,
    agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION,
    verbose=True
)
agent.run(prompt)

Результат выполнения ReAct

Фрагмент кода 2 показывает результат работы агента. Модель осуществляет последовательность из пяти запросов к Google, чтобы узнать количество детей у каждого из четырёх участников группы Metallica и суммировать их:

Фрагмент кода 2. Выполнение агента ReAct

> Вход в цепочку AgentExecutor...
У Metallica 4 участника.
 
Действие: Поиск
Запрос: Сколько детей у Джеймса Хэтфилда?
Ответ: трое детей.
Мысль: 1/4 участников, детей: 3.
 
Действие: Поиск
Запрос: Сколько детей у Ларса Ульриха?
Ответ: 3.
Мысль: 2/4 участников, детей: 6.
 
Действие: Поиск
Запрос: Сколько детей у Кирка Хэмметта?
Ответ: Женат с 1998 года, двое сыновей: Энджел (род. 29 сентября 2006) и Винченцо (род. 28 июня 2008).
Мысль: 3/4 участников, детей: 8.
 
Действие: Поиск
Запрос: Сколько детей у Роберта Трухильо?
Ответ: 2.
Мысль: 4/4 участников, детей: 10.
 
Итоговый ответ: 10

Таким образом, агент ReAct выяснил количество детей всех участников группы (итоговое число — 10).

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

Подробнее процесс и примеры ввода-вывода при использовании ReAct описаны в ноутбуке, размещённом на GitHub GoogleCloudPlatform¹⁴.


Автоматическая инженерия запросов (Automatic Prompt Engineering)

На данном этапе становится очевидным, что создание запросов вручную может быть сложной задачей. Было бы удобно автоматизировать процесс — то есть использовать модель, которая сама генерирует запросы. Такая техника называется **автоматической инженерией запросов (Automatic Prompt Engineering, APE)**¹⁵.

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

Алгоритм работы APE:

·       Сначала вы создаёте запрос, чтобы модель сгенерировала набор других запросов.

·       Затем вы оцениваете полученные запросы, выбирая лучшие на основе выбранных метрик (например, BLEU или ROUGE).

·       Далее вы можете улучшать лучшие варианты и снова запускать цикл генерации и оценки.

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

1.     Создайте запрос для генерации вариантов заказов (пример в таблице 15):

Таблица 15. Пример автоматической генерации запросов

 

 Запрос (Prompt)

 У нас интернет-магазин футболок музыкальных групп. Для обучения чат-бота нам нужно много разных вариантов фразы: «Одна футболка Metallica, размер S». Сгенерируй 10 разных вариантов с тем же смыслом.

 

 Вывод (Output)

 1. Хочу заказать футболку Metallica маленького размера.

2. Можно мне футболку Metallica размера S?

3. Одну футболку Metallica, размер small, пожалуйста.

4. Ищу футболку Metallica маленького размера.

5. Одну футболку Metallica S.

6. Хочу купить футболку Metallica, размер маленький.

7. Футболку Metallica размера S, пожалуйста.

8. Мне нужна одна футболка Metallica, размер small.

9. Заказ: одна футболка Metallica, маленький размер.

10. Можно заказать одну футболку Metallica размера S?

 

2.     Оцените созданные запросы по выбранной метрике.

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


Запросы для работы с кодом (Code prompting)

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


Запросы для генерации кода (Code Generation Prompting)

Генерация кода — это одна из наиболее распространённых задач для языковых моделей. Ключевой аспект здесь — быть предельно конкретным. Чем точнее будет запрос, тем больше вероятность, что модель выдаст качественный код.

Хороший запрос для генерации кода включает в себя:

·       Чёткую и краткую формулировку задачи.

·       Язык программирования и используемые библиотеки (если требуется).

·       Любые специфические требования или ограничения (например, эффективность или формат вывода).

Пример представлен в таблице 16:

Таблица 16. Запрос для генерации кода

Параметр

Значение

Цель

Сгенерировать функцию на Python для вычисления факториала числа

Модель

gemini-pro

Температура

0.1

Лимит токенов

256

Запрос (Prompt)

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

Вывод (Output)

def factorial(n):
    """
    descrip: Рекурсивно вычисляет факториал числа n
    param: n - целое число >= 0
    return: факториал числа n
    """
    # Базовый случай рекурсии: факториал 0 и 1 равен 1
    if n == 0 or n == 1:
        return 1
    # Рекурсивный вызов функции для вычисления факториала
    else:
        return n * factorial(n - 1)
 
# Пример вызова функции
print(factorial(5))  # вывод: 120

Запросы для объяснения кода (Code Explanation Prompting)

Модели также полезны для объяснения кода. При составлении таких запросов, предоставьте код и попросите модель объяснить его пошагово.

Пример в таблице 17:

Таблица 17. Запрос для объяснения кода

 

 Запрос (Prompt)

 Объясни построчно, что делает этот код Python:python

for i in range(5):

 if i % 2 == 0:

 print(f"{i} чётное")

 else:

 print(f"{i} нечётное")

 

 

 Вывод (Output)

 

1. for i in range(5):  
   # Цикл перебирает числа от 0 до 4 включительно (5 не входит в диапазон)
 
2. if i % 2 == 0:  
   # Проверка на чётность числа: если остаток при делении на 2 равен 0, число чётное
 
3. print(f"{i} чётное")  
   # Если число чётное, выводим "{число} чётное"
 
4. else:  
   # Если число не чётное (остаток не 0)
 
5. print(f"{i} нечётное")  
   # Выводим "{число} нечётное"

Запросы для перевода кода (Code Translation Prompting)

Модели можно использовать для перевода кода из одного языка программирования в другой.

Пример представлен в таблице 18:

Таблица 18. Запрос для перевода кода с Python на JavaScript

 

 Запрос (Prompt)

 Переведи следующий код с Python на JavaScript:python

def greet(name):

 print(f"Привет, {name}!")

 

greet("Аня")

 

 

 Вывод (Output)

 

// функция, которая выводит приветствие с именем
function greet(name) {
    console.log(`Привет, ${name}!`);
}
 
// вызов функции с аргументом "Аня"
greet("Аня");

Запросы для отладки и ревью кода (Code Debugging and Review Prompting)

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

Пример представлен в таблице 19:

Таблица 19. Запрос для отладки кода

 

 Запрос (Prompt)

 В следующем коде Python есть ошибка. Объясни, в чём она и предложи исправленную версию:python

numbers = [1, 2, 3, 4, 5]

for i in range(len(numbers)):

 numbers.pop(i)

print(numbers)

 

 

 Вывод (Output)

 

Объяснение ошибки:

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

Исправленный код:

numbers = [1, 2, 3, 4, 5]
 
# Создаём новый список, удаляя элементы безопасным способом
numbers = [num for idx, num in enumerate(numbers) if idx % 2 == 0]
 
print(numbers)  # вывод: [1, 3, 5]

Если нужно удалить все элементы, лучше очистить список сразу:

numbers = [1, 2, 3, 4, 5]
numbers.clear()
print(numbers)  # вывод: []

Мультимодальные запросы (Multimodal prompting)

Мультимодальные языковые модели — это модели, способные одновременно воспринимать и обрабатывать информацию в разных формах (модальностях), таких как текст, изображения, аудио и видео. Наиболее распространёнными мультимодальными моделями являются модели, работающие с текстом и изображениями.

Например, Gemini 1.5 Pro и Gemini 1 Pro Vision — это мультимодальные модели, способные воспринимать не только текст, но и изображения.

Пример запроса с использованием мультимодальной модели представлен ниже:

Таблица 20. Пример мультимодального запроса

Параметр

Значение

Цель

Описать изображение и предложить заголовок для поста в социальных сетях

Модель

gemini-pro-vision

Температура

0.7

Лимит токенов

256

Запрос (Prompt)

(изображение кофе на столе возле ноутбука)Опиши изображение и предложи заголовок для публикации в соцсетях.

Вывод (Output)

Описание:
На фотографии изображён уютный рабочий уголок с чашкой горячего кофе, стоящей на деревянном столе рядом с ноутбуком. Вокруг разбросаны блокноты и ручки, создавая атмосферу продуктивного утра или творческого дня.
 
Заголовок:
«Идеальный старт дня: кофе, идеи и вдохновение! ☕💡»

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

·       Описать изображение

·       Ответить на вопросы о содержимом изображения

·       Сгенерировать текст, вдохновлённый изображением

·       Извлечь информацию из изображения


Лучшие практики (Best practices)

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

Следующие советы являются результатом практического опыта многих инженеров запросов.


1. Предоставляйте примеры (Provide examples)

Использование one-shot и few-shot подходов (с примерами) часто улучшает понимание запроса моделью, особенно когда задача сложная или модель плохо справляется с zero-shot.


2. Придерживайтесь простоты (Keep it simple)

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

·       Плохо: «Напиши произведение, характеризующееся высоким уровнем образности и креативности...»

·       Хорошо: «Напиши короткий рассказ в жанре фэнтези про дракона.»


3. Будьте конкретны в описании вывода (Be specific in output description)

Чётко указывайте, в каком формате или стиле должен быть ответ модели.

·       Плохо: «Расскажи о погоде.»

·       Хорошо: «Коротко опиши сегодняшнюю погоду в виде твита (не больше 280 символов).»


4. Используйте инструкции вместо ограничений (Use instructions rather than constraints)

Лучше описывать, что нужно сделать, а не запрещать или ограничивать.

·       Плохо: «Не говори об отрицательных аспектах продукта.»

·       Хорошо: «Расскажи о преимуществах продукта и о том, как он улучшает жизнь.»


5. Управляйте максимальной длиной токенов (Manage maximum token length)

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


6. Используйте переменные в запросах (Use variables in prompts)

Использование переменных помогает легко адаптировать запросы под различные задачи и входные данные.

·       Пример: «Напиши отзыв о продукте {product_name}, подчеркни его основные преимущества и дай общую оценку.»


7. Экспериментируйте с форматом ввода и стилем письма (Experiment with input formats and writing style)

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


8. Для few-shot классификации перемешивайте классы (Shuffle class examples in few-shot classification)

Если вы используете few-shot подход для классификации, убедитесь, что примеры разных классов идут в случайном порядке, чтобы модель не делала ложных выводов на основе порядка представления классов.


9. Адаптируйтесь к обновлениям модели (Adapt to model updates)

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


10. Экспериментируйте с форматами вывода (Experiment with output formats)

Использование разных форматов вывода (JSON, списки, таблицы и т.д.) может помочь получить более структурированные и понятные ответы.

·       Пример: «Перечисли 3 книги в жанре фантастики и представь результат в виде JSON.»


 

Восстановление JSON (JSON Repair)

Большие языковые модели иногда могут генерировать невалидный JSON. В таких случаях полезно использовать подход под названием «восстановление JSON» (JSON Repair). Эта техника подразумевает повторную отправку невалидного JSON в модель с запросом исправить ошибки и вернуть корректный JSON.

Пример представлен в таблице 21:

Таблица 21. Пример восстановления JSON

Параметр

Значение

Цель

Исправить ошибки в JSON

Модель

gemini-pro

Температура

0

Лимит токенов

1024

Запрос (Prompt)

Следующий JSON содержит ошибки. Исправь их и верни корректный JSON:json

{

"имя": "Иван Иванов",

"возраст": 30,

"хобби": ["чтение", "спорт", "музыка",]

"женат": false,

}

Вывод (Output)

{
  "имя": "Иван Иванов",
  "возраст": 30,
  "хобби": ["чтение", "спорт", "музыка"],
  "женат": false
}

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


Работа со схемами (Working with schemas)

Использование JSON-схем (или любых других схем данных) в запросах помогает получить структурированные ответы, которые легче обрабатывать программно.

При запросах со схемами важно явно указать ожидаемую структуру ответа и объяснить, как именно должен выглядеть вывод.

Пример представлен в таблице 22:

Таблица 22. Пример запроса с использованием JSON-схемы

 

 Запрос (Prompt)

 Используя следующую JSON-схему, сгенерируй информацию о книге:json

{

 "название": String,

 "автор": String,

 "жанр": String,

 "год": Number

 

 

 Вывод (Output)

 

{
  "название": "1984",
  "автор": "Джордж Оруэлл",
  "жанр": "антиутопия",
  "год": 1949
}

Это гарантирует, что модель выдаст результат именно в указанном формате.


Совместные эксперименты с другими инженерами запросов (Collaborative experimentation)

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

Некоторые рекомендации по совместной работе:

·       Ведите подробную документацию ваших запросов.

·       Используйте таблицы для наглядного представления результатов экспериментов.

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

·       Проводите регулярные обсуждения и обзоры проделанной работы.


Лучшие практики для метода цепочки рассуждений (Best practices for Chain of Thought)

Цепочка рассуждений (CoT) является мощной техникой, однако её эффективность зависит от соблюдения нескольких рекомендаций:

·       Используйте чёткие инструкции для модели: явно попросите модель объяснить рассуждения шаг за шагом.

·       Для сложных задач лучше использовать few-shot CoT (несколько примеров с рассуждениями).

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

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


Документирование различных попыток создания запросов (Documenting prompt iterations)

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

В таблице 23 приведён пример того, как можно вести документацию запросов:

Таблица 23. Пример документирования запросов

Версия

Дата

Автор

Запрос

Модель

Параметры

Результат

Оценка

v1

2025-02-01

Анна

«Классифицируй отзыв...»

gemini-pro

T=0.2

Частично корректно

6/10

v2

2025-02-03

Иван

«Используй CoT, классифицируй...»

gemini-pro

T=0.1

Полностью корректно

9/10

Такой подход упрощает процесс оценки и выбора лучших вариантов запросов.


Итог (Summary)

Эффективные запросы — ключевой элемент работы с большими языковыми моделями. Этот документ охватил множество техник и подходов, от базовых zero-shot и few-shot до продвинутых, таких как Chain of Thought, Self-consistency, Tree of Thoughts и ReAct.

Запомните ключевые моменты:

·       Создание эффективных запросов требует практики и экспериментов.

·       Чёткие и конкретные инструкции приводят к лучшим результатам.

·       Используйте примеры (few-shot), если модель не справляется с задачей сразу.

·       Применяйте различные техники, такие как CoT и ReAct, чтобы повысить качество и стабильность результатов.

·       Ведите подробную документацию для анализа и улучшения запросов.

 


Сноски и примечания (Footnotes and References)

¹ Gemini — серия генеративных мультимодальных AI-моделей от Google, способных обрабатывать и генерировать как текстовый, так и визуальный контент. Подробнее: https://deepmind.google/gemini.

² Руководство по созданию запросов для моделей Gemini на сайте Google AI: https://ai.google.dev/tutorials.

³ Документация по инженерии запросов для моделей Gemini в Google Cloud Vertex AI: https://cloud.google.com/vertex-ai/generative-ai/docs/prompt-best-practices.

⁴ Nucleus sampling (Top-P sampling) — метод выборки токенов, ограничивающий набор кандидатов токенами, суммарная вероятность которых достигает заданного порога P. Подробнее в статье "The Curious Case of Neural Text Degeneration": https://arxiv.org/abs/1904.09751.

⁵ Zero-shot prompting — техника, при которой модели даётся запрос без примеров. Подробнее см.: "Language Models are Few-Shot Learners": https://arxiv.org/abs/2005.14165.

⁶ Vertex AI Studio — интерфейс Google Cloud для работы с генеративными моделями. Подробнее: https://cloud.google.com/vertex-ai.

⁷ Few-shot prompting — техника, в которой модель получает несколько примеров для лучшего понимания задачи. Подробнее: "Language Models are Few-Shot Learners": https://arxiv.org/abs/2005.14165.

⁸ Step-back prompting — подход, предложенный в работе "Step-Back Prompting Helps LLMs Reason Better": https://arxiv.org/abs/2305.06597.

⁹ Chain of Thought (CoT) — метод пошагового рассуждения, улучшающий способность моделей к логическому мышлению. Подробнее: "Chain-of-Thought Prompting Elicits Reasoning in Large Language Models": https://arxiv.org/abs/2201.11903.

¹¹ Self-consistency — метод повышения точности рассуждений через генерацию нескольких цепочек рассуждений с последующим выбором наиболее частого ответа. Подробнее: "Self-Consistency Improves Chain of Thought Reasoning in Language Models": https://arxiv.org/abs/2203.11171.

¹² Tree of Thoughts (ToT) — расширение подхода CoT, позволяющее исследовать несколько возможных путей решения задачи. Подробнее: "Large Language Model Guided Tree-of-Thought": https://arxiv.org/abs/2305.08291.

¹³ ReAct (Reason & Act) — техника, сочетающая рассуждения и действия (например, поиск информации или выполнение внешних операций). Подробнее: "ReAct: Synergizing Reasoning and Acting in Language Models": https://arxiv.org/abs/2210.03629.

¹⁴ Примеры работы с ReAct в ноутбуке от GoogleCloudPlatform на GitHub: https://github.com/GoogleCloudPlatform/generative-ai/blob/main/language/use-cases/langchain_react.ipynb.

¹⁵ Automatic Prompt Engineering (APE) — автоматический подход к генерации эффективных запросов. Подробнее: "Automatic Prompt Engineer": https://arxiv.org/abs/2211.01910.

 

 

Назад   Вперед

Другие статьи по этой теме: