Параметры генерации

Несколько чисел в запросе заметно меняют поведение модели. Разберём главные.

Параметры генерации управляют тем, насколько ответ случаен, как он длинен и когда обрывается.

temperature — случайность

Чем выше temperature (обычно 0–1), тем разнообразнее и креативнее ответы; чем ниже — тем более детерминированно и предсказуемо. Для извлечения данных, классификации, кода берут низкую температуру; для генерации текста, идей — выше.

Задачаtemperature
классификация, извлечение, факты0–0.3
обычные ответы ассистента0.3–0.7
творческий текст, варианты0.7–1.0

Важно: temperature = 0 снижает случайность, но не гарантирует побитово одинаковый ответ. Полной воспроизводимости у LLM нет.

max_tokens — потолок длины ответа

Ограничивает, сколько токенов модель может сгенерировать. Если ответ упёрся в потолок, он обрывается на полуслове, а stop_reason будет max_tokens. Ставьте с запасом под ожидаемую длину, но не гигантский — это влияет на латентность и стоимость.

top_p — отсечение по вероятности (nucleus sampling)

Альтернативный способ управлять случайностью: модель выбирает из самых вероятных токенов, чья суммарная вероятность не превышает top_p. Обычно крутят либо temperature, либо top_p, а не оба сразу.

stop — стоп-последовательности

Список строк, при появлении которых генерация немедленно прекращается (сама строка в ответ не попадает). Удобно, чтобы модель не вылезала за нужный формат: например, остановиться на "\n\n" или на маркере конца секции.

response = client.messages.create(
    model="claude-opus-4-8",
    max_tokens=200,
    temperature=0.2,           # мало случайности — для фактов
    stop_sequences=["END"],    # оборвать на слове END
    messages=[{"role": "user", "content": "Перечисли 3 факта о Луне, затем напиши END."}],
)

Сборка messages-массива с параметрами (запускаемо)

Параметры — это просто поля тела запроса. Соберём такое тело как dict и посмотрим на него (чистый Python):

import json

def build_request(user_text, temperature=0.7, max_tokens=512, stop=None):
    body = {
        "model": "claude-opus-4-8",
        "max_tokens": max_tokens,
        "temperature": temperature,
        "messages": [{"role": "user", "content": user_text}],
    }
    if stop:
        body["stop_sequences"] = stop
    return body

req = build_request("Придумай слоган", temperature=0.9, max_tokens=64, stop=["\n"])
print(json.dumps(req, ensure_ascii=False, indent=2))

Вывод:

{
  "model": "claude-opus-4-8",
  "max_tokens": 64,
  "temperature": 0.9,
  "messages": [
    {
      "role": "user",
      "content": "Придумай слоган"
    }
  ],
  "stop_sequences": [
    "\n"
  ]
}

Итог

  • temperature / top_p — случайность; для фактов низкая, для творчества высокая (крутят что-то одно).
  • max_tokens — потолок длины; упёрлись — ответ обрывается, stop_reason = max_tokens.
  • stop — строки, на которых генерация прекращается.
Проверьте себя
1. Какую temperature выбрать для задачи извлечения данных и классификации?
AВысокую (0.9–1.0) для разнообразия
BНизкую (0–0.3) для предсказуемости
CРовно 0.5 всегда
DТемпература не влияет на такие задачи
2. Что произойдёт, если ответ упрётся в max_tokens?
AЗапрос завершится ошибкой 400
BОтвет оборвётся, а stop_reason будет max_tokens
CМодель автоматически увеличит лимит
DОтвет станет короче, но завершённым
3. Зачем нужны stop-последовательности?
AЧтобы повторить запрос при ошибке
BЧтобы прервать генерацию при появлении заданной строки и удержать формат ответа
CЧтобы задать системную инструкцию
DЧтобы ограничить число запросов
4. Можно ли получить побитово одинаковый ответ, задав temperature = 0?
AДа, ответ всегда будет идентичным
BНет, случайность снижается, но полная воспроизводимость не гарантируется
CДа, но только для OpenAI
DНет, temperature = 0 запрещена
Поддержать проект