Промпт-инжиниринг для LLM: основы, которые работают с любой моделью
Хороший промпт — это не заклинание, а шесть конкретных частей. Показываем их на одном примере, где меняется и ответ, и цена запроса.
5 мин · · разработка · экономия
Промпт-инжиниринг для LLM звучит громко, но по сути это умение сформулировать задачу так, чтобы модели не пришлось угадывать. Часто плохой ответ объясняется не слабой моделью, а недосказанным запросом: не указан формат, не дан контекст, не обозначены границы. Ниже шесть частей хорошего промпта, пример до и после и расчёт того, как структура влияет на цену. Цены даны на 18 октября 2026.
Что такое промпт-инжиниринг и что он не делает
Промпт-инжиниринг — это проектирование входного текста модели: инструкций, данных и примеров. Он не требует секретных фраз. Заклинания вроде «ты лучший эксперт в мире» без конкретики мало что дают, это легко проверить на своих задачах. Работают конкретные вещи: чёткая цель, нужные данные, понятный формат ответа.
Также он не отменяет проверку. Даже идеальный промпт не гарантирует правильных фактов, поэтому ответы нужно проверять. О системной части запроса подробнее в статье Как писать системные промпты. Основы можно освоить за вечер, но настраивать промпт под конкретную модель и задачу придётся итерациями.
Шесть частей структуры
Не все части нужны в каждом промпте, но чек-лист удобно держать перед глазами.
- Роль. Одной строкой: кто отвечает и для кого. «Ты оператор поддержки интернет-магазина, пишешь клиентам». Роль задаёт лексику и уровень детализации.
- Задача. Что именно сделать, одним глаголом. «Подготовь ответ на письмо». Одна задача на запрос; сложную разбейте на шаги.
- Контекст. Факты, которых нет у модели: политика компании, детали заказа, терминология. Всё, что нужно для ответа, должно быть в запросе: модель не знает ваших внутренних правил.
- Формат. Длина, структура, язык, обращение, поля JSON. «Письмо до 80 слов, на „вы“, в конце следующий шаг и срок».
- Примеры. Один-три образца желаемого результата работают лучше длинных описаний. Подробнее — в статье про few-shot промптинг.
- Ограничения. Чего не делать: «не обещай того, чего нет в политике», «не выдумывай номера и даты», «если данных не хватает, напиши, каких именно».
Отдельно про разметку. Данные пользователя (письмо, документ, код) отделяйте от инструкций разделителями, например тегами <письмо>...</письмо>. Так модель не примет текст письма за указания, а вам проще подставлять данные программно.
Пример: промпт до и после
Условный магазин. Клиент пишет: «Заказ 4521 не пришёл, верните деньги».
Версия 1: короткий запрос.
Ответь клиенту на письмо: Заказ 4521 не пришёл, верните деньгиМодель вынуждена гадать. Скорее всего, вы получите длинное письмо с общими извинениями, обещаниями вернуть деньги в неизвестный срок и просьбой «уточнить детали», а возможно, и выдуманные условия возврата.
Версия 2: структурированный запрос.
Роль: ты оператор поддержки интернет-магазина.
Задача: подготовь ответ на письмо клиента.
Контекст: возврат денег делаем в течение 5 рабочих дней после подтверждения
недоставки. Заказ 4521 отправлен 3 октября, трек не обновляется 10 дней.
Формат: письмо до 80 слов, обращение на «вы», одно извинение, в конце следующий
шаг и срок.
Ограничения: не обещай того, чего нет в политике. Не выдумывай номера и даты.
Если данных не хватает, напиши, каких именно.
<письмо>
Заказ 4521 не пришёл, верните деньги
</письмо>Теперь у модели есть факты, границы и формат. Ответ становится короче, предсказуемее и пригоден к отправке после беглой проверки. Версию 2 удобно хранить как шаблон, подставляя письмо и факты кодом.
Как это выглядит в коде
Через OpenAI-формат (pip install openai):
from openai import OpenAI
client = OpenAI(base_url="https://api.zukko.pro/v1", api_key="fetch_ваш_ключ")
SYSTEM = """Роль: ты оператор поддержки интернет-магазина.
Формат: письмо до 80 слов, обращение на «вы», одно извинение, в конце следующий шаг и срок.
Ограничения: не обещай того, чего нет в политике. Не выдумывай номера и даты.
Если данных не хватает, напиши, каких именно."""
def reply(letter, facts):
user = f"Подготовь ответ на письмо.\nКонтекст: {facts}\n\n<письмо>\n{letter}\n</письмо>"
r = client.chat.completions.create(
model="gpt-6.1-sol",
messages=[Через Anthropic-формат системная инструкция передаётся отдельным параметром system (адрес без /v1):
import anthropic
a = anthropic.Anthropic(base_url="https://api.zukko.pro", api_key="fetch_ваш_ключ")
m = a.messages.create(
model="claude-sonnet-5-5",
max_tokens=300,
system=SYSTEM,
messages=[{"role": "user", "content": "Подготовь ответ на письмо.\n\n<письмо>\nЗаказ 4521 не пришёл, верните деньги\n</письмо>"}],
)
print(m.content[0].text)Обратите внимание на max_tokens=300: в Anthropic-формате параметр обязателен, и он же ограничивает длину ответа.
Как структура влияет на цену
Выходные токены стоят дороже входных: у claude-sonnet-5-5 вход 0.4, выход 2 доллара за 1M токенов, то есть выход в пять раз дороже. Поэтому лишние слова в ответе обходятся дороже лишних слов в запросе.
Допущения для расчёта (не замеры, ориентир): версия 1 — 30 токенов запроса и 600 токенов ответа; версия 2 — 300 токенов запроса и 150 токенов ответа.
- Версия 1: 30 × 0.4 / 1M + 600 × 2 / 1M = 0.000012 + 0.0012 = $0.001212.
- Версия 2: 300 × 0.4 / 1M + 150 × 2 / 1M = 0.00012 + 0.0003 = $0.00042.
На 10 000 писем: версия 1 даёт 10 000 × 0.001212 = $12.12, версия 2 — 10 000 × 0.00042 = $4.20. Запрос стал в десять раз длиннее, а стоимость ниже, потому что ответ сократился. Реальные числа у вас будут другими, поэтому измеряйте поле usage на своих данных. Если системная часть длинная и не меняется, её стоит ставить в начало запроса: так срабатывает кэш (см. как считаются чтение и запись кэша). Актуальные цены — GET https://api.zukko.pro/v1/models.
Итерации и проверка
Промпт редко получается с первой попытки. Рабочий цикл:
- Соберите 10–20 реальных примеров входов, включая неудобные.
- Запускайте промпт на всех сразу, смотрите ответы целиком.
- Меняйте одну вещь за раз и сравнивайте. Меняя три параметра сразу, вы не узнаете, что помогло.
- Зафиксируйте проверки кодом: длина, наличие обязательных слов, валидный JSON.
- После смены модели прогоните набор заново: один и тот же промпт может вести себя иначе.
Как автоматизировать такой прогон, показано в статье Как тестировать промпты. Начать можно, создав ключ в кабинете; оплата из России — СБП (платёжная страница добавляет 8,5% сверху), карта MasterCard или криптовалюта.
Частые вопросы
Что такое промпт-инжиниринг простыми словами?
Это умение составить запрос к модели так, чтобы она получила цель, нужные данные и требования к ответу и не гадала. Основа — структура: роль, задача, контекст, формат, примеры и ограничения.
Нужно ли писать длинные промпты?
Не обязательно длинные, но достаточно конкретные. Лишние слова вредят так же, как нехватка фактов. Ориентир: в запросе есть всё, что нужно для ответа, и нет ничего, что не влияет на результат.
Один промпт подойдёт для всех моделей?
Базовые принципы общие, но поведение моделей отличается, и точные формулировки лучше проверять на выбранной модели. После смены модели повторите прогон на своих примерах.
Как сократить расход токенов на промптах?
Просите конкретный формат и длину ответа, ограничивайте max_tokens, не повторяйте длинный контекст без нужды, а неизменную часть ставьте в начало запроса, чтобы работал кэш.
zukko
Платите в 25×
меньше
за Claude Code & ChatGPT
Один ключ fetch_* и base URL api.zukko.pro — в Cursor, Claude Code, Codex и любом SDK.
Похожие статьи
- Память чат-бота: как хранить историю диалога и не платить за неё дваждыМодель не помнит предыдущих реплик: историю отправляете вы при каждом запросе. Разбираем, как растёт цена диалога и чем её сдерживать.
- LangChain text splitters: как резать текст на чанки правильноКак подобрать размер чанка и перекрытие в RecursiveCharacterTextSplitter, почему считать нужно в токенах и как сверить подсчёт с точным количеством от шлюза.
- LangChain RAG: рабочий пример с моделью через шлюзСтроим простой RAG на LangChain: документы, чанки, векторный поиск и ответ модели через шлюз. Считаем, из чего складывается цена вопроса, и режем лишние токены.
- Агенты opencode: как настроить роли, модели и инструментыСвой агент в opencode — это роль, модель и список разрешений. Показываем конфиг и пример, где рутину делает дешёвая модель, а код правит сильная.