Большие языковые модели могут производить любую последовательность символов на каком угодно языке в любом формате данных (включая языки программирования, аудио и видео). Соответственно, качество этой последовательности может быть самым разным. Иногда мы получаем многословные запутанные объяснения с галлюцинациями и устаревшими знаниями, а иногда ― элегантную функцию на Python решающую сложную задачу, идеальное название для бренда, а скоро и первую серию будущего бестселлера. Более того, модель может надёжно и точно ответить на миллионы вопросов ваших клиентов, сопоставить запросы из сотен позиций с многотысячным каталогом, самостоятельно обработать заявки по страховым искам, обучить робота или перебрать новые патентные заявки в поисках конфликтов со старыми. Однако чтобы полностью реализовать потенциал LLM, необходимо научиться мастерски давать им подсказки. А как это делать, я расскажу в этой статье.
![](https://habrastorage.org/getpro/habr/upload_files/70b/c63/698/70bc6369823c1c133a1a4640dd5c7900.png)
Эта шпаргалка ― перевод оригинальной статьи на Medium, который я дополнил опытом RnD-команды Artezio. Сперва мы опубликовали ссылку на статью в нашем ТГ-канале, посвященном разработке софта при помощи LLM. По откликам оказалось, что есть потребность в переводе и отдельной публикации. Пока мы переводили и готовили публикацию стало понятно, что технолгии развиваются настолько быстро, что без комментария эта статья была бы неполной и устаревшей.
Disclaimer
1. В связи с невероятной скоростью развития технологий некоторые приемы и подходы которые находят и публикуют промпт инженеры могут устаревать буквально за несколько недель. У моделей меняются токенизаторы и архитектура и это конечно влияет на промптинг.
2. Различные модели требуют различных промптов. Для больших LLM с большим контекстным окном типа GPT4, Claude или Gemini сейчас часто пишут длинные промпты по несколько страниц, в то время как для маленьких LLM наоборот стоит задача сжать промпт. Все относительно.
3. Вообще говоря промпт в современном понимании это уже не только текст, но и картинки и звук и видео.
4. Иногда сейчас говорят уже не о prompt engineering, а о flow engineering. т.е. декомпозиция решаемой задачи на более мелкие, создание отдельных промптов для них и оптимизация этих промптов в процессе работы.
Тем не менее думаю, наша шпаргалка может пригодиться начинающим пользователям для повседневного общения с моделями и как чеклист для тех, кто разрабатывает свои приложения на основе LLM. Весьма вероятно, что большую часть из описанного ниже вы уже знаете, однако, каждый раз, когда я пишу важный промпт, я проверяю его на соответствие этим пунктам и бывает нахожу возможности для улучшения.
То, о чем часто не пишут в англоязычных статьях
Большинство моделей училось главным образом на английских текстах. По этой причине они гораздо лучше понимают английский, чем любой другой язык. Рекомендуем писать запросы именно на этом языке. Модели проще вас понять на английском. Если недостаточно хорошо владеете языком - переводите* с Google Translate ( UPD. см. комменты - переводите и доводите до ума запрос на английском), это может существенно повысить качество ответов. При этом вы можете попросить модель давать сами ответы на русском. С этим нет проблем.
Используйте последние модели, если это возможно. Вы можете потратить часы в поисках идеального промпта, но иногда лучше просто перейти на последнюю, более умную версию и она все сделает с самым примитивным промптом. Например GPT4o выдает мне одинаковые результаты, что с запросом "напиши мне код который делает то-то", что с запросом на страницу, в котором я расписываю какой она прекрасный python разработчик и как ей "строго-настрого думать только цепочкой мыслей". Да, у вас могут возникнуть проблемы со скоростью работы API, с приватностью, с оплатой, но весьма вероятно, что проще решить их, чем пользоваться устаревшей версией.
Можно скормить LLM эту статью и попросить оптимизировать ваш промпт в автоматическом режиме, и да, что-то подобное уже сделано - например вот в такой GPT.
Существуют базы промптов которые люди посчитали удачными и решили поделиться ими с миром, например https://www.thepromptindex.com/. Там далеко не все идеально, но можно ознакомиться.
AUTOMAT Framework
AUTOMAT Framework ― это акроним, описывающий ключевые составляющие идеального промпта.
![AUTOMAT framework Шпаргалка по промптам: AUTOMAT framework](https://habrastorage.org/getpro/habr/upload_files/439/6fc/37f/4396fc37f8f249785b5e7ac3cf7de5b8.png)
Act as a…
User Persona & Audience
Targeted Action
Output Definition
Mode / Tonality / Style
Atypical Cases
Topic Whitelisting
Подумав про каждый из этих элементов, вам будет проще направить LLM к желаемому результату. Но обо всем по порядку.
(А) Act as a … ― вы определяете роль LLM. Имеет смысл сказать модели, чтобы она действовала как профессионал в предметной области.
Act as a project manager… ― действуй как проджект-менеджер.
Act as a CEO of an IT company… ― как CEO ИТ-компании.
Act as an excellent senior software development analyst…
В некоторых статьях я читал рекомендации указывать модели, чтобы она действовала не просто как ведущий аналитик, но как превосходный ведущий аналитик. Это повышает качество ответов.
(U) User Persona & Audience ― с кем взаимодействует модель, аудитория, уровень ее подготовки:
Like to a 5-year-old child ― объясни, как пятилетнему ребенку,
студенту технического вуза,
фанату футбольного клуба.
(T) Targeted Action ― что необходимо сделать:
написать краткое содержание,
перечислить,
посчитать,
написать алгоритм.
(O) Output Definition ― определяем выходной формат:
таблица,
JSON,
число с плавающей точкой от 0.0 до 0.1,
код на Python.
Про выходной формат подробнее еще поговорим ниже. Кстати, у GPT4 в API есть галочка «возвращать ответ строго в JSON».
(M) Mode/Tonality/Style ― настроение, стиль. Объясните модели, как читатель должен воспринимать текст:
как деловое письмо,
в стиле Сергея Довлатова,
как пост на Habr,
с юмором и эмпатией.
(A) Atypical Cases ― обработка исключений. Этот раздел для промптов, работающих с разным набором данных. Например, в приложениях, где один и тот же промпт вызывается с разными пользовательскими запросами. Объясните модели, как реагировать, когда пользователь спросил что-то не то.
Если ответ на вопрос пользователя не в указанном контексте, говори, что ты можешь отвечать только на вопросы о раннем этрусском искусстве.
(T) Topic Whitelisting ― контекст, допустимые обсуждаемые темы. Это раздел также для промптов, работающих с разным набором данных. Думаю, создатели фреймворка разделили последние два пункта в таком порядке в основном ради того, чтобы получился красивый акроним. Указываем модели, о чем мы собираемся говорить.
Отвечай только в рамках стандарта ISO 9001. Мы говорим только о системах менеджмента качества на предприятиях.
![Пример AUTOMAT промпта Шпаргалка по промптам: Пример AUTOMAT промпта](https://habrastorage.org/getpro/habr/upload_files/81b/9f0/074/81b9f0074e34cdc867be4dc69ced7d1d.png)
CO-STAR Framework
По сути, тот же фреймворк, только в профиль. Поэтому долго останавливаться на нем не будем.
Context: Объясните модели, о чем речь, предоставьте подробности и контекст.
Objective: Какая цель? Чего вы хотите добиться? Четко опишите задачу.
Style & Tone: Аналогично AUTOMAT ― укажите эмоциональный тон ответа.
Audience: Ваша аудитория, кто будет это читать, на кого вы ориентируетесь, готовя ответ.
Response: Определите формат вывода (текст, код и т.д.).
Подробнее про CO-STAR можно прочесть в статье на Medium.
![CO-STAR FRAMEWORK Шпаргалка по промптам: CO-STAR FRAMEWORK](https://habrastorage.org/getpro/habr/upload_files/f34/8c7/f25/f348c7f25cb363ae5b010de2a836664a.png)
Формат выходных данных
Модели надо объяснить, в каком виде предоставить ответ. Тут лучше показать пример, чем описывать.
Модель может выдавать данные почти в любом из существующих форматов, а также формировать структуры, которые нужны вам для конкретной задачи. Логично, что предоставление ответа в формате, который легко распарсить (например, JSON), значительно упрощает создание приложений и автономных AI-агентов.
![Формат выходных данных Шпаргалка по промптам: Формат выходных данных](https://habrastorage.org/getpro/habr/upload_files/39f/d1e/ac9/39fd1eac94c5719c396b6a1d174b5bce.png)
Более детальные правила вывода с обозначением допустимых значений и диапазонов, а также указанием, что делать, если данные отсутствуют:
![Формат выходных данных Шпаргалка по промптам: Формат выходных данных](https://habrastorage.org/getpro/habr/upload_files/71f/d01/3c6/71fd013c6c0d58b2614926dc84d5f360.png)
Подход «Несколько примеров»
Few-shot learning в оригинальном названии. Это подход, когда мы показываем модели несколько примеров вида «задача->решение», а потом уже подаем свое. Тем самым прямо внутри промпта настраиваем ее на нужное решение. При этом имеет смысл продемонстрировать как стандартные ситуации, так и нештатные (если такие могут оказаться на входе).
![Few-shot learning Шпаргалка по промптам: Few-shot learning](https://habrastorage.org/getpro/habr/upload_files/b21/618/30e/b2161830ed46771ad8d4ba6aed6765b5.png)
Что интересно, мы об этом не так давно писали в канале AI4Dev. Есть исследование от инженеров Google, показывающее, что много примеров (десятки, сотни и даже тысячи) могут статистически значимо улучшить результаты на выходе. Разумеется, для этого у вас должно быть контекстное окно, в которое вы сможете положить это большое количество примеров. Подробнее об этом можно прочитать в посте. Так что за месяц, прошедший с момента публикации картинки, информация уже немного поменялась.
Подход «Цепочка мыслей»
Chain of thought в оригинале. Это подход, когда мы просим модель рассуждать вслух, собирая некоторые выводы по пути, перед тем как выдавать окончательный ответ. Этот подход может дать существенно более качественный результат на выходе. Собственно, поэтому большинство современных моделей переходят в такой режим для математических задач и не только, даже если вы явно их об этом не просили. Тем не менее в некоторых ситуациях может быть полезно указать модели, чтобы она решала задачу step by step.
![Chain of thought Шпаргалка по промптам: Chain of thought](https://habrastorage.org/getpro/habr/upload_files/65c/8e4/7b4/65c8e47b46fcfb714fe53ef76dbaea12.png)
Шаблон промпта
При разработке приложения вы, как правило, используете промпт, внутрь которого вставляете переменные ― данные из БД, запросы от пользователя и т.д.
![Шаблон промпта шаблон промпта](https://habrastorage.org/getpro/habr/upload_files/790/48b/290/79048b2903041d45b8ac8926ab269e2d.png)
При каждом вызове вы подставляете в переменные значения.
![Шаблон промпта шаблон промпта](https://habrastorage.org/getpro/habr/upload_files/67b/a0b/421/67ba0b42146308ee156407f143b43770.png)
Форматирование и разделители внутри промпта
Модель не будет перечитывать ваш запрос дважды. Либо она сразу поймет, какой цели служит часть текста (пример, инструкция, или это контекст), либо она не поймет. Тогда ответ, вероятно, будет неверным.
Так что убедитесь, что модель может разобрать структуру вашего запроса. В отличие от авторов на Habr, в контекстном окне вы ограничены только символами; вы не можете использовать заголовки, жирный шрифт или курсив. Так что при структурировании отдельных разделов подружитесь с решетками, кавычками и переносами строк.
![Форматирование промпта форматирование промпта](https://habrastorage.org/getpro/habr/upload_files/a0f/e1e/5ee/a0fe1e5ee36647b6867832541924376f.png)
Собираем все вышеизложенное в единый промпт
Вот реальный пример того, как всё это сочетается. Благодаря разделителям у промпта есть довольно четкая структура, состоящая из разных компонентов запроса: основная инструкция, затем примеры, данные, формат вывода и, наконец, история взаимодействия.
И да, запросы с примерами и контекстной информацией могут быть довольно длинными. Вот почему разработчики моделей увеличивают окна контекста для одного ввода и вывода. На языке LLM окно контекста ― это максимальная длина ввода для генерации одного ответа моделью.
![Все компоненты промпта в сборке Все компоненты промпта в сборке](https://habrastorage.org/getpro/habr/upload_files/f61/b35/468/f61b35468b0bd22e6530d6959fc7f97d.png)
Несколько промптов
При создании сложного приложения, например, как автономный AI-агент, обрабатывающий страховые запросы, одного промпта часто бывает недостаточно. Можно сделать единый запрос для категоризации страхового случая, проверки покрытия страховкой, учета страхового полиса клиента и расчета размера возмещения. Но это не лучший подход.
Удобнее, проще и точнее получится, если разделить промпт на несколько отдельных задач-промптов и строить из них цепочки запросов к модели. Обычно сначала категоризируют входные данные, а затем выбирают определенную цепочку, которая обрабатывает информацию с помощью моделей и заранее подготовленных функций.
![](https://habrastorage.org/getpro/habr/upload_files/e44/6b9/f1e/e446b9f1e089becb8af829ab4190a2b4.png)
Мой пример
Промпт
# SYSTEM PREAMBLE
1) You are an excellent Python software developer with over 10 years of experience. You have a strong understanding of Python related topics, data structures, libraries, frameworks, algorithms, best practices and optimization techniques.
2) You are here to help the user (the software developer) by breaking his request in ## TASK into logical steps and writing high-quality and efficient code to implement each step.
3) You have to return the entire code.
4) Follow "Answering rules" without exception.
## ANSWERING RULES
1) Repeat the question before answering it.
2) Always follow "CHAIN OF THOUGHTS" to execute the task.
## CHAIN OF THOUGHTS
1) **OBEY the EXECUTION MODE**
2) **TASK ANALYSIS:**
- Understand the user's request thoroughly.
- Identify the key components and requirements of the task.
3) **PLANNING: CODDING:**
- Break down the task into logical, sequential steps.
- Outline the strategy for implementing each step.
4) **CODING:**
- Explain your thought process before writing any code.
- Write the entire code for each step, ensuring it is clean, optimized, and well-commented.
- Handle edge cases and errors appropriately.
5) **VERIFICATION:**
- Review the complete code solution for accuracy and efficiency.
- Ensure the code meets all requirements and is free of errors.
## TASK
Write a python function that receives the following JSON as input and enters data from it into the Google Sheet.
{
'date': '31-05-2024',
'revenue': 90000,
'person' : 'User1',
'expensesList': [30000, 14000, 10000, 2000, 15000],
'expensesDescList': [ 'Ключи', 'Ключи2', 'Счет за такси', 'Клей, пластины', 'Провод 40м'],
'expensesTypeList': ['Закупки', 'Закупки', 'Расходы', 'Ремонт', 'Ремонт']
}
There is a date in JSON, you can use it to determine the month.
The data is entered into a list with the name of the month. If such a list does not exist yet, then you need to create a list with a new month inside the sheet.
The list should have the following columns (the first rows are used as headings):
A1: Дата расхода,
B1: сумма расхода,
C1: описание расхода,
D1: тип расхода,
E1: кто внес данные
G1: Дата выручки
H1: Сумма выручки
I1: Кто внес данные
Please separate expenses and profits with a blank column.
Please sort expenses by date, including those already listed in Google sheet list.
Please sort earnings by date, including those already listed in Google sheet list.
It is prohibited to use oauth2client as it is deprecated.
Выше пример промпта, который я использовал чтобы написать функцию на python. Как я уже писал, пока мы публиковали эту статью для написания кода с применением GPT4o судя по моим тестам этот промпт уже не дает преимущества относительно простого запроса. Т.е. в GPT4o можно оставить только раздел #TASK и получить такой же точно по качеству ответ. Тем не менее используемые тут приемы все еще показывают неплохие результаты в других задачах (и других LLM). Например, в задаче извлечения структурированных данных из текста пользователя длинный промпт с инструкциями по моим тестам на порядок повышает стабильность (вызов промпта десятки и сотни раз) качественных результатов по сравнению с простым запросом «достань такие-то данные из текста».
Напомню, что мы пытаемся ввести модель в такое состояние, из которого она будет наилучшим образом отвечать на наш вопрос. Для этого есть много (порой странных) подходов. Итак, что мы тут делаем:
# SYSTEM PREAMBLE
Мы объясняем LLM что она именно крутой специалист из предметной области запроса, не джун, не любитель. Затем мы пишем для кого весь этот банкет – надо помочь кожаному разработчику, мы просим декомпозировать задачу на подзадачи, а не пытаться отвечать сходу, просим сделать все на высшем уровне. Мы просим вернуть весь код целиком - некоторые версии GPT выдавали мне вместо полного кода пару строчек с примером использования библиотеки и фразой в духе, ну а дальше сам. Это возмутительно. Я не для того стесывал пальцы набирая промпт, чтобы еще и код потом писать самостоятельно. Кстати для этих же целей иногда LLM в промпте сообщают что-то в духе «Имей в виду, железяка, у меня нет пальцев» - сам я код не наберу, не думай даже.
## ANSWERING RULES
Здесь все правила ответа, сюда можно написать что у пользователя нет пальцев, пообещать пару сотен баксов чаевых за хороший ответ, упомянуть, что ответ очень важен для вашей карьеры и т.д. В общем попробовать простимулировать модель выдать лучшее, на что она способна. Люди проводили тесты со сбором статистики - все это работало на каком-то этапе, возможно, иногда работает и сейчас, надо проверять. Я же только прошу модель повторить вопрос перед тем как отвечать – это я проверял лично на десятках запросов к GPT4o.
Дальше я требую от модели следовать цепочке мыслей и подробно-подробно описываю задачу. В самом конце я пишу, что запрещено использовать depricated библиотеку. Любопытно, что если вместо "запрещено" - "prohibited" я писал не используй "don't use" то некоторые LLM стабильно игорировали это требование.
На сегодня у меня все. Спасибо за внимание! Мы сознательно удалили из статьи раздел про RAG, потому что это отдельная очень большая тема, о которой на Хабре уже есть довольно много хороших статей.
PDF версия шпаргалки из статьи.
Оригинальная статья на Medium - ссылка перестала работать, предположу, что автор переписывает статью
Что еще посмотреть
Промпт гайд от Google Gemini
Наш ТГ-канал, где можно следить за последними новостями в области применения LLM для разработки софта.
Youtube лекция нашего консультанта профессора Владимира Крылова о промптах. Владимир Владимирович, большое спасибо!