В RetailCRM мы начинали с промптов в формате строки или f-string. Для простых промптов это ок.
Но вот ты написал первую версию промпта, запустил, увидел косяки или ненужное поведение LLM, дорабатываешь промпт. Потом добавляются какие-то данные, которые надо динамически подсовывать. Потом появляются куски промпта, которые нужно подставлять условно, исходя из контекста. В итоге у тебя получается какая-то лапша нечинаемой смеси кода и кусков текста.
Промпт в AI-агентах — это такая же часть бизнес-логики (на самом деле, одна из самых важных), как и код, поэтому важно, чтобы этот "код" на человеческом языке был наглядный, читаемый и с подсветкой синтаксиса.
Мы пришли к тому, что промпт наиболее удобно оформлять в jinja шаблонах (или любом другом шаблонизаторе) с markdown внутри. Покажу на примере.
Пример
Допустим мы решили сделать мини агента, который с помощью нашего сервиса Geohelper определит часовой пояс клиента по номеру телефона.
Сделали начальный промпт
Ты помощник, который определяет часовой пояс по номеру телефона.
Запустим
$ python get_timezone.py 89132342323
Номер +7 913 234-23-23
Информация о часовом поясе:
- Регион: Алтайский край
- Сдвиг от UTC: +07:00
Если нужно, могу показать текущее местное время для этого номера или конвертировать заданное время в этот часовой пояс.
Доработаем, чтобы выводил кратко и более содержательно:
Ты помощник, который определяет часовой пояс по номеру телефона.
{# Иначе выводит многословно #}
Выведи результат очень кратко и строго эти данные: часовой пояс, смещение UTC, регион и страну.
Запустим
$ python get_timezone.py 89132342323
Смещение UTC: +03:00
Регион: Алтайский край
Страна: Россия (RU)
Уже лучше. Представим, что мы хотим подсказывать смещение относительно нашего часового пояса.
Ты помощник, который определяет часовой пояс по номеру телефона.
Текущий часовой пояс пользователя: {{ server_timezone }} (UTC{{ "%+d" | format(server_offset) }})
Текущее время у пользователя: {{ current_time }}
{# Иначе выводит многословно #}
Выведи результат очень кратко и строго эти данные:
- Разница во времени + пример, сколько времени у пользователя и абонента
- Регион абонента
- Страна абонента
Глянем
python get_timezone.py 89132342323
- Разница во времени: +4 ч — у вас 17:37, у абонента 21:37
- Регион абонента: Алтайский край
- Страна абонента: Россия (RU)
Спустя время мы захотели добавить параметр --short в вызов скрипта, чтобы выводить информацию только о разнице во времени. Доработаем промпт:
Ты помощник, который определяет часовой пояс по номеру телефона.
Текущий часовой пояс пользователя: {{ server_timezone }} (UTC{{ "%+d" | format(server_offset) }})
Текущее время у пользователя: {{ current_time }}
{# Иначе выводит многословно #}
Выведи результат очень кратко и строго эти данные:
- Разница во времени + пример, сколько времени у пользователя и абонента
{% if not short %}
- Регион абонента
- Страна абонента
{% endif %}
Проверим:
$ python get_timezone.py 89132342323
Разница: +4 ч — у вас 17:43, у абонента 21:43
Регион: Алтайский край (Asia/Barnaul)
Страна: Россия (RU)
$ python get_timezone.py 89132342323 --short
Разница: +4 ч — у пользователя 17:44, у абонента 21:44
Как итог
* Промпт читаемый с подсветкой (как jinja, так и markdown)
* Работают проверки от IDE (в том числе на орфографию/пунктуацию)
* Промпт можно обогащать вкраплениями логики
* Одно из самых важных Фрагменты промпта можно дополнять комментариями
А как выглядит финальный промпт в IDE, можно увидеть на картинке к посту.
🔗 Инженерия и AI | Ilyas Salikhov
