Перейти к основному содержимому

Параметры генерации LLM — напоминалка

Разработчику

После обучения модель на каждом шаге выдаёт распределение вероятностей по словарю токенов. Параметры ниже задают, как из этого распределения выбирать следующий токен и когда остановиться. Они не меняют веса модели — только стратегию декодирования (inference). Теория авторегрессии — в больших языковых моделях; локальный запуск и примеры кода — в локальных моделях и Ollama. В полном LLM-стеке эти настройки относятся к слою 5 — инференс (обзор семи слоёв).


Сводная таблица

ПараметрЗа что отвечаетТипичный диапазон
max_tokensВерхняя граница длины ответа (число генерируемых токенов)256–4096 и выше, по задаче
temperature«Острота» распределения — случайность и креативность0–2 (часто 0.1–1.0)
top_pNucleus sampling — пул токенов с суммарной вероятностью ≥ p0–1 (часто 0.9–0.95)
top_kОграничение пула k самых вероятных токенов1 … размер словаря
frequency_penaltyШтраф за повторное появление токена (чем чаще в тексте, тем сильнее)−2 … 2
presence_penaltyШтраф, если токен уже встречался хотя бы раз−2 … 2
stopСтроки (или токены), при которых генерация обрываетсясписок по задаче

Практика
Для кода, фактов и RAG обычно хватает низкой temperature (0.1–0.3), умеренного top_p (0.9) и явного max_tokens. Для идей и черновиков температуру поднимают; frequency_penalty / presence_penalty помогают убрать зацикливание на одних словах.


max_tokens

max_tokens — лимит на количество токенов, которые модель дописывает в ответ за один вызов (не путать с размером всего контекста окна).

  • Слишком маленькое значение обрежет ответ посередине мысли.
  • Слишком большое увеличит время и стоимость API без пользы.

Ориентиры: короткий ответ в чате — 256–512; развёрнутое объяснение или фрагмент кода — 1024–2048; длинный отчёт — по лимиту модели и бюджету.

В OpenAI-совместимых API поле часто называется max_tokens или max_completion_tokens (зависит от версии API и модели).


temperature

temperature масштабирует логиты перед softmax: чем выше значение, тем ровнее распределение и тем чаще выбираются маловероятные токены.

ЗначениеПоведениеКогда уместно
0–0.3Почти детерминированно, опора на самые вероятные вариантыКод, SQL, JSON, ответы по документам (RAG)
0.4–0.7Баланс точности и вариативностиОбъяснения, перефразирование
0.8–1.0+Больше разнообразия, выше риск «ухода» от фактовИдеи, сторителлинг, мозговой штурм

При temperature = 0 (или эквиваленте «жёсткого» режима у провайдера) повторные запросы с тем же промптом дают максимально стабильный вывод — но не гарантируют идентичность между версиями модели или сервера.


top_p (nucleus sampling)

top_p отсекает «хвост» маловероятных токенов: в пул попадает минимальное множество самых вероятных токенов, у которых сумма вероятностей ≥ p.

Пример: при top_p = 0.9 модель сначала сортирует кандидатов по убыванию вероятности и набирает их, пока сумма не достигнет 90%; остальные токены в выборку не попадают.

  • 0.9–0.95 — распространённый компромисс.
  • Значение ближе к 1.0 расширяет пул и добавляет вариативность.

top_p и top_k решают похожую задачу разными способами; в одном запросе обычно задают один из них или комбинируют осторожно — смотрите документацию конкретного API.


top_k

top_k оставляет только k токенов с наибольшей вероятностью на текущем шаге, независимо от их суммарной доли.

  • top_k = 1 близко к жадному выбору (argmax) на шаге.
  • Большие k смягчают отсечение.

Удобен, когда нужно жёстко ограничить «бредовые» хвосты распределения без подбора top_p под каждую модель.


frequency_penalty и presence_penalty

Оба параметра (в API OpenAI) уменьшают логит токена, который уже встречался в сгенерированной части ответа. Разница в учёте повторов:

frequency_penaltypresence_penalty
ЛогикаШтраф растёт с числом появлений токенаШтраф один раз, если токен уже был
ЭффектСильнее бьёт по словам вроде «и», «также», «кроме того» при зацикливанииПодталкивает к новым словам и темам
Диапазонобычно −2 … 2обычно −2 … 2

Положительные значения (например 0.3–0.8) снижают повторы. Отрицательные усиливают склонность к повторению — на практике почти не используют.

В экосистеме llama.cpp / Ollama близкий эффект даёт repeat_penalty (множитель, часто 1.0–1.2), а не отдельные поля frequency/presence — имена полей зависят от сервера.


stop

stop — список строк (иногда отдельных токенов), при появлении которых в потоке генерации модель сразу прекращает вывод.

Типичные случаи:

  • обрезать ответ до конца JSON или блока кода;
  • запретить модели «дописывать» диалог за пользователя (стоп-последовательности вроде \nUser:);
  • остановиться перед служебным маркером в шаблоне промпта.

Стоп-срабатывание зависит от токенизатора: одна и та же фраза в API и в локальной модели может разбиваться на токены по-разному. Почему так — в разделе от текста к числам.


Готовые профили

Задачаtemperaturetop_pmax_tokensШтрафы / прочее
Код, рефакторинг0.1–0.20.9по размеру патчаstop на закрывающий fence ``` при необходимости
RAG / поддержка по базе0.1–0.30.9512–1024низкая температура важнее штрафов
Черновик текста0.7–0.90.951024+presence 0.3–0.6 при «заезженных» формулировках
JSON по схеме0–0.20.9с запасомresponse_format / валидатор схемы у провайдера

Пример (OpenAI-совместимый API)

from openai import OpenAI

client = OpenAI()

response = client.chat.completions.create(
model="gpt-4o-mini",
messages=[{"role": "user", "content": "Кратко объясни TCP handshake."}],
temperature=0.2,
top_p=0.9,
max_tokens=400,
frequency_penalty=0.3,
presence_penalty=0.2,
stop=["\n\n---"],
)
print(response.choices[0].message.content)

Тот же набор идей для Ollama / llama.cpp передаётся в теле запроса или аргументах библиотеки (temperature, top_p, num_predict вместо max_tokens, repeat_penalty и т.д.) — см. локальные модели.


Что дальше

См. также

Другие статьи этого же раздела в боковом меню (как на странице "О разделе").