Назад в блог

AI для новичковИнструкция

Системный промпт и temperature: что это и как задать

Что делают системное сообщение и temperature в OpenAI-совместимом запросе — с примерами на Python и curl для модели CheapTokens.

Автор: CheapTokens TeamОпубликовано Обновлено 5 мин чтения

Схема запроса к чату: системное сообщение с правилами, сообщение пользователя с задачей и регулятор temperature
Содержание
  1. Что такое системный промпт
  2. Как написать полезный системный промпт
  3. Что делает temperature
  4. Отправьте запрос с обоими параметрами
  5. Посмотрите, как работает temperature
  6. На какой модели попробовать
  7. Если не работает
  8. Следующий шаг

Системный промпт — это сообщение с ролью system, которое говорит модели, как вести себя в каждом ответе: кто она, в каком формате отвечать, чего избегать. Temperature (температура) — число, обычно от 0 до 2 (диапазон зависит от модели), которое задаёт, насколько может меняться формулировка: низкие значения дают сфокусированные, повторяемые ответы, высокие — более разнообразные. Оба параметра идут в один запрос Chat Completions к https://api.cheaptokens.dev/v1.

Ниже: что это такое, с каких значений начать и запрос, который можно запустить на Python или curl. Если вы ещё не отправляли запрос, начните с первого API-запроса к CheapTokens.

Что такое системный промпт#

Запрос к чату — это список сообщений, и у каждого есть роль. В справке Chat Completions их четыре: system, user, assistant и tool (справка DeepSeek API, проверено 22 октября 2026 года). Для первого запроса нужны три:

  • system — постоянные инструкции от вас, разработчика. Модель воспринимает их как правила разговора.
  • user — то, что человек спрашивает или передаёт в этой реплике.
  • assistant — прошлые ответы модели. Вы добавляете их сами, когда продолжаете диалог.

У системного сообщения role равна system, а content — строка. Поле name необязательное.

json
"messages": [
  {"role": "system", "content": "You are an editor. Rewrite the user's text to be shorter and friendlier. Return only the rewritten text."},
  {"role": "user", "content": "Send me the report by tonight or I will be upset."}
]

Системное сообщение идёт первым. Сообщение пользователя — это сама задача.

Как написать полезный системный промпт#

  • Скажите, чем занята модель, одной фразой: «Ты редактор», «Ты сортируешь обращения в поддержку».
  • Укажите формат ответа: «Верни только переписанный текст», «Ответь в двух предложениях», «Ответь валидным JSON».
  • Пишите правила короткими прямыми предложениями. Несколько ясных строк работают лучше одного длинного абзаца.
  • Не раздувайте. Системный промпт отправляется с каждым запросом и считается входными токенами, поэтому длинный оплачивается каждый раз. Как считаются вход и выход — в статье входные и выходные токены.

Что делает temperature#

Модель выбирает каждый следующий токен из набора вероятных кандидатов. Temperature определяет, насколько строго она держится самого вероятного. По справке DeepSeek API (проверено 22 октября 2026 года) temperature принимает значения от 0 до 2, по умолчанию 1: чем выше значение, тем случайнее вывод, чем ниже — тем он сфокусированнее и детерминированнее. Диапазоны у моделей разные: DeepSeek указывает от 0 до 2, Z.ai — от 0 до 1 для GLM-5.3 (оба проверены 22 октября 2026 года), поэтому значения от 0 до 1 безопасны для обеих. Диапазон для своей модели смотрите в документации.

Отправные точки, которые подходят для большинства задач. Это практические ориентиры, а не гарантии:

Задача С чего начать
Извлечение данных, классификация, код, строгие форматы от 0 до 0.3
Вопросы и ответы, краткие пересказы, переписывание от 0.3 до 0.7
Мозговой штурм, названия, творческий текст от 0.8 до 1

Три вещи, которые стоит знать:

  1. Низкая temperature — это повторяемость, а не идентичность. Не рассчитывайте на побайтно одинаковые ответы.
  2. Меняйте temperature или top_p, но не оба сразу. Это рекомендация DeepSeek; top_p — второй параметр выбора токенов, по умолчанию 1. Пока вы учитесь, не трогайте его.
  3. Некоторые режимы игнорируют temperature. В справке DeepSeek сказано, что в режиме thinking temperature не действует, а в режиме без thinking top_p фиксирован на 1.0. Если вы изменили значение, а разницы нет, сначала проверьте режим модели.

Отправьте запрос с обоими параметрами#

Задайте ключ переменной окружения, чтобы он не попал в код (см. что такое API-ключ и как его хранить). Точный id модели берите из документации CheapTokens: у разных провайдеров одна и та же модель называется по-разному. В примере — MiniMax-M2.7.

python
import os
from openai import OpenAI

client = OpenAI(
    base_url="https://api.cheaptokens.dev/v1",
    api_key=os.environ["CHEAPTOKENS_API_KEY"],
)

response = client.chat.completions.create(
    model="MiniMaxAI/MiniMax-M2.7",
    messages=[
        {"role": "system", "content": "You are an editor. Rewrite the user's text to be shorter and friendlier. Return only the rewritten text."},
        {"role": "user", "content": "Send me the report by tonight or I will be upset."},
    ],
    temperature=0.3,
    max_tokens=1000,
)

print(response.choices[0].message.content)
print(response.choices[0].finish_reason)

Тот же запрос через curl:

bash
curl https://api.cheaptokens.dev/v1/chat/completions \
  -H "Authorization: Bearer $CHEAPTOKENS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "MiniMaxAI/MiniMax-M2.7",
    "messages": [
      {"role": "system", "content": "You are an editor. Rewrite the user'\''s text to be shorter and friendlier. Return only the rewritten text."},
      {"role": "user", "content": "Send me the report by tonight or I will be upset."}
    ],
    "temperature": 0.3,
    "max_tokens": 1000
  }'

Что вы должны увидеть: короткую, более дружелюбную версию фразы и stop в finish_reason. Если finish_reason равен length, ответ упёрся в лимит max_tokens; см. почему ответ ИИ обрывается на полуслове.

Посмотрите, как работает temperature#

Лучший способ понять temperature — задать один и тот же вопрос несколько раз. Этот цикл отправляет один короткий запрос по три раза при 0 и при 1, используя client из примера выше:

python
for temp in (0, 1):
    print("temperature", temp)
    for _ in range(3):
        r = client.chat.completions.create(
            model="MiniMaxAI/MiniMax-M2.7",
            messages=[
                {"role": "system", "content": "Answer with one word."},
                {"role": "user", "content": "Name a fruit."},
            ],
            temperature=temp,
            max_tokens=500,
        )
        print(" ", r.choices[0].message.content)

При 0 три строки обычно содержат одно и то же слово; при 1 слова чаще отличаются. Модели, которые рассуждают перед ответом, могут потратить часть max_tokens на рассуждение, поэтому оставляйте лимит с запасом даже для ответа в одно слово. Затем поменяйте только системный промпт (например, «Answer with one word, in French») и запустите снова: правила из системного сообщения действуют при любой temperature.

Такие опыты маленькие. Для оценки — стоимость 100 запросов примерно по 120 входных и 80 выходных токенов (примерная нагрузка; число токенов зависит от ваших промптов):

Модель За запрос 100 запросов OpenRouter, 100 запросов
GLM-5.3-Flash $0.0000056 $0.00056 $0.0011
DeepSeek-V4-Flash $0.0000098 $0.00098 $0.0018
MiniMax-M2.7 $0.000018 $0.0018 $0.0132

120 входных и 80 выходных токенов на запрос. Цены за 1M токенов актуальны и меняются вместе с нашими тарифами; столбец OpenRouter показывает справочные цены для той же нагрузки.

На какой модели попробовать#

  • MiniMax-M2.7 — хороший первый выбор для множества коротких тестовых запросов, на ней же можно прогнать тот же системный промпт и сравнить ответы: контекст 180K, до 8 192 токенов в ответе, дешевле референсной цены OpenRouter и по входу, и по выходу. Текущая цена: вход $0.05, выход $0.15 за 1M токенов.

Один баланс работает для всех моделей, так что смена модели — это правка одной строки model. Все актуальные цены — на странице цен.

Если не работает#

  • 401 или ошибка аутентификации: ключа нет, он набран с опечаткой или переменная окружения не задана в этом терминале. Проверьте echo $CHEAPTOKENS_API_KEY.
  • Модель не найдена: скопируйте id модели из документации точно, вместе с префиксом.
  • Ошибка про неверный параметр: держите temperature в пределах, которые поддерживает ваша модель (от 0 до 1 безопасно), и передавайте число, а не строку.
  • Модель игнорирует правило: сформулируйте его одним коротким прямым предложением, поставьте в начало системного сообщения и повторите точный формат, который нужен.
  • Изменение temperature ничего не меняет: возможно, вы используете режим, который её игнорирует (см. выше), либо ответ так жёстко ограничен («одно слово», «валидный JSON»), что вариантов почти нет.
  • Ответ обрезается: увеличьте max_tokens; как это сделать — в статье про max_tokens.

Следующий шаг#

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