Лучшие практики
Поиск правильного промпта требует экспериментов. Vertex AI Studio — идеальное место для отработки ваших промптов с возможностью тестирования на различных моделях.
Используйте следующие лучшие практики, чтобы стать профессионалом в промпт-инжиниринге.
Приводите примеры
Самая важная практика — предоставление примеров (one-shot / few-shot) внутри промпта. Это крайне эффективно, так как примеры служат мощным инструментом обучения для модели. Они показывают желаемый формат или тип ответа, позволяя модели учиться на них и адаптировать свою генерацию соответствующим образом. Это как дать модели точку отсчета или цель, в которую нужно попасть, что повышает точность, улучшает стиль и тон ответа.
Соблюдайте простоту в дизайне
Промпты должны быть лаконичными, четкими и понятными как для вас, так и для модели. Правило простое: если промпт запутан для вас, он, скорее всего, запутает и модель. Старайтесь не использовать перегруженный язык и не давайте лишней информации.
Примеры:
БЫЛО:
Я сейчас в Нью-Йорке и хотел бы узнать больше о классных местах. Со мной двое детей по 3 года. Куда нам стоит сходить во время отпуска?
СТАЛО ПОСЛЕ ПЕРЕРАБОТКИ:
Выступи в роли туристического гида. Опиши интересные места для посещения в Нью-Йорке (Манхэттен) с трехлетним ребенком.
Старайтесь использовать глаголы, описывающие конкретное действие. Вот список эффективных глаголов: Действуй, Анализируй, Категоризируй, Классифицируй, Сопоставь, Сравни, Создай, Опиши, Определи, Оцени, Извлеки, Найди, Сгенерируй, Идентифицируй, Перечисли, Измерь, Организуй, Распарси, Выбери, Предскажи, Предоставь, Ранжируй, Рекомендуй, Верни, Извлеки, Перепиши, Выбери, Покажи, Сортируй, Суммаризируй, Переведи, Напиши.
Будьте конкретны в требованиях к результату
Будьте предельно точны в описании желаемого результата. Слишком краткая инструкция может быть недостаточно ясной для LLM или слишком общей. Предоставление конкретных деталей (через системные или контекстные промпты) помогает модели сосредоточиться на релевантной информации, что повышает общую точность.
Примеры:
КАК НАДО:
Сгенерируй пост для блога из 3 абзацев о топ-5 игровых консолях. Пост должен быть информативным и увлекательным, написан в разговорном стиле.
КАК НЕ НАДО:
Напиши пост в блог об игровых консолях.
Используйте инструкции вместо ограничений
Инструкции и ограничения используются для управления выводом LLM.
- Инструкция дает явные указания по формату, стилю или содержанию ответа. Она говорит модели, что она должна сделать.
- Ограничение задает рамки и границы. Оно говорит модели, чего она не должна делать или чего следует избегать.
Исследования показывают, что фокусировка на позитивных инструкциях эффективнее, чем злоупотребление ограничениями. Это соответствует тому, как люди воспринимают информацию: мы предпочитаем четкие указания к действию спискам запретов.
Инструкции напрямую сообщают о желаемом результате, в то время как ограничения могут заставить модель «гадать», что же разрешено. Инструкции дают гибкость и стимулируют творчество в заданных рамках. Кроме того, большой список ограничений может противоречить сам себе.
Ограничения по-прежнему ценны, но в определенных ситуациях: например, чтобы предотвратить генерацию вредного контента или когда требуется строго определенный формат.
Если возможно, используйте позитивные формулировки: вместо того чтобы говорить модели, чего не делать, скажите ей, что сделать вместо этого. Это поможет избежать путаницы и повысит точность.
КАК НАДО:
Напиши пост из 1 абзаца о топ-5 игровых консолях. Упомяни только саму консоль, компанию-производителя, год выпуска и общий объем продаж.
КАК НЕ НАДО:
Напиши пост из 1 абзаца о топ-5 игровых консолях. Не перечисляй названия видеоигр.
Лучшая практика: сначала отдавайте приоритет инструкциям, четко заявляя, чего вы хотите от модели, и используйте ограничения только тогда, когда это необходимо для безопасности или соблюдения специфических требований. Экспериментируйте, пробуйте разные комбинации и документируйте результаты.
Контролируйте максимальную длину токенов
Для управления длиной ответа вы можете либо задать лимит max tokens в конфигурации, либо явно указать желаемую длину в самом промпте. Например:
"Объясни квантовую физику в сообщении длиной не более одного твита."
Используйте переменные в промптах
Чтобы сделать промпты динамичными и многоразовыми, используйте в них переменные для разных входных данных. Например, как показано в Таблице 20 (факты о городе), вместо того чтобы жестко прописывать название города, используйте переменную. Это экономит время и силы, избавляя от повторов. Если одна и та же информация нужна в нескольких промптах, сохраните ее в переменную. Это особенно важно при интеграции промптов в ваши приложения.
Промпт ПЕРЕМЕННЫЕ
{city} = "Амстердам"
ПРОМПТ
Ты — туристический гид. Расскажи мне факт о городе: {city}
Вывод: Амстердам — прекрасный город, полный каналов, мостов и узких улочек. Его стоит посетить из-за богатой истории, культуры и ночной жизни.
Таблица 20. Использование переменных в промптах.
Экспериментируйте с форматами ввода и стилями письма
Разные модели, настройки, форматы промптов и выбор слов могут давать разные результаты. Поэтому важно экспериментировать с атрибутами промпта: стилем, лексикой и типом (zero-shot, few-shot, системный промпт).
Например, промпт о революционной консоли Sega Dreamcast можно сформулировать как вопрос, утверждение или инструкцию, что приведет к разным результатам:
- Вопрос: Что такое Sega Dreamcast и почему она была такой революционной?
- Утверждение: Sega Dreamcast — это игровая консоль шестого поколения, выпущенная компанией Sega в 1999 году. Она…
- Инструкция: Напиши один абзац с описанием консоли Sega Dreamcast и объяснением ее революционности.
Для few-shot промптов в задачах классификации — перемешивайте классы Порядок примеров в few-shot обычно не имеет значения, но в задачах классификации обязательно перемешивайте классы ответов в примерах. Иначе модель может «переобучиться» на конкретный порядок. Перемешивание гарантирует, что модель учится определять ключевые признаки каждого класса, а не просто запоминает последовательность. Это сделает работу модели более стабильной на новых данных. Хорошее правило: начинайте с 6 примеров и проверяйте точность.
Адаптируйтесь к обновлениям моделей
Важно следить за изменениями в архитектуре моделей, обновлением данных и новыми возможностями. Пробуйте новые версии моделей и корректируйте промпты, чтобы задействовать их фишки. Vertex AI Studio отлично подходит для хранения, тестирования и документирования различных версий ваших промптов.
Экспериментируйте с форматами вывода
Помимо формата ввода, экспериментируйте с форматом вывода. Для нетворческих задач (извлечение данных, парсинг, ранжирование, категоризация) просите модель возвращать результат в структурированном виде, например JSON или XML.
Преимущества использования JSON для вывода:
- Всегда одинаковый стиль ответа.
- Фокус на нужных данных.
- Меньше риск галлюцинаций.
- Возможность задавать связи.
- Получение типов данных.
- Возможность сортировки.
Пример структурированного вывода был показан в Таблице 4.
Исправление JSON (JSON Repair)
Хотя формат JSON дает много преимуществ, у него есть и минусы. Структурированный JSON требует значительно больше токенов, чем обычный текст, что увеличивает время обработки и стоимость. Кроме того, из-за своей многословности JSON может быстро исчерпать окно вывода, что особенно критично, когда генерация обрывается на полуслове из-за лимита токенов. Такой «обрубок» становится невалидным (отсутствуют закрывающие скобки), что делает его бесполезным для приложения. К счастью, библиотека json-repair (доступна на PyPI) может стать незаменимым помощником. Она интеллектуально исправляет неполные или некорректные JSON-объекты.
Работа со схемами
Структурированный JSON хорош для вывода, но как насчет ввода? Использование JSON-схем для входных данных может быть невероятно полезным. Схема определяет ожидаемую структуру и типы данных. Предоставляя схему, вы даете модели четкий план того, какие данные ожидать, помогая ей сфокусировать внимание на релевантной информации и снижая риск неверной интерпретации.
Пример: если нужно генерировать описания товаров, вместо свободного текста укажите схему (Snippet 5) и данные в формате JSON (Snippet 6). Это значительно повышает вероятность получения точного и релевантного описания.
Экспериментируйте вместе с другими промпт-инженерами
Иногда полезно попросить несколько человек написать промпт для одной и той же задачи. Даже если все следуют лучшим практикам, вы увидите разницу в эффективности разных вариантов.
Лучшие практики для CoT (Цепочки рассуждений)
В CoT-промптах ответ обязательно должен идти после рассуждений, так как генерация текста рассуждения влияет на токены, которые модель получает при предсказании финального ответа. При использовании CoT и самосогласованности вы должны уметь извлекать финальный ответ из промпта отдельно от рассуждений.
Для CoT и задач с рассуждениями устанавливайте температуру на 0. Цепочка рассуждений основана на «жадном декодировании» (выборе наиболее вероятного слова). Поскольку в логических задачах обычно есть только один правильный ответ, температура должна быть нулевой.
Документируйте попытки
Мы не устанем повторять: документируйте ваши попытки составить промпт во всех деталях. Это позволит вам со временем понять, что работает, а что нет. Результаты могут отличаться в зависимости от модели, настроек сэмплирования и даже версий одной и той же модели. Даже при идентичных условиях могут возникнуть небольшие различия в формулировках (например, если два токена имеют одинаковую вероятность, выбор может быть сделан случайно).
Мы рекомендуем использовать шаблон в Google Таблицах (Таблица 21). Это поможет сохранить полную историю работы, протестировать производительность промпта на разных моделях и отлаживать ошибки в будущем. Вы удивитесь, как много можно забыть даже после короткого перерыва.
Помимо полей в таблице, полезно отслеживать версию итерации, помечать результат (OK/NOT OK/SOMETIMES OK) и записывать обратную связь.
При работе с системами RAG (Retrieval Augmented Generation) также фиксируйте параметры системы RAG, которые влияли на контент в промпте: запрос, настройки чанков, содержимое чанков и т.д.
Когда промпт станет близок к идеалу, перенесите его в кодовую базу проекта. Желательно сохранять промпты в отдельных от кода файлах для удобства поддержки. В идеале ваши промпты должны стать частью автоматизированной системы тестирования и оценки.
Промпт-инжиниринг — это итеративный процесс. Создавайте, тестируйте, анализируйте и документируйте. Уточняйте промпты на основе работы модели. Экспериментируйте до тех пор, пока не достигнете желаемого результата. При смене модели или ее конфигурации возвращайтесь к старым промптам и тестируйте их заново.
Название: [название и версия вашего промпта]
| Цель | [Краткое объяснение цели данной попытки] | ||
|---|---|---|---|
| Модель | [Название и версия используемой модели] | ||
| Температура | [Значение от 0 до 1] | Лимит токенов | [число] |
| Top-K | [число] | Top-P | [число] |
| Промпт | [Полный текст промпта] |
Вывод: text [Текст одного или нескольких вариантов вывода]
Таблица 21. Шаблон для документирования промптов.