Суть
Трансформер (Transformer) выдаёт вероятности по всему словарю. Дальше токен выбирается не всегда самый вероятный — параметры задают, насколько случайным и разнообразным будет выбор.
Зачем это нужно
Под разные задачи нужен разный режим: для классификации/факта — детерминированный ответ (всегда один и тот же), для креатива — разнообразие. Без понимания этих параметров получаешь либо «скучную» однообразность, либо непредсказуемость и галлюцинации. max_tokens напрямую влияет на стоимость (см. Context Window, Reasoning Effort).
Как работает
- Temperature — сглаживает/заостряет распределение.
0≈ детерминированно (всегда самый вероятный токен), выше — более творческий/разнообразный текст. - Top-k — выбираем только из k самых вероятных токенов; top-p (nucleus) — из минимального набора, чья суммарная вероятность ≥ p. Оба отсекают маловероятный «хвост». На практике сначала настраивают temperature, а
top-p/top-k— вторичный рычаг (трогают редко). - max_tokens — потолок длины генерации (чтобы «не генерить бесконечно» и не переплачивать).
- stop / EOS — генерация заканчивается по специальному токену конца (EOS) или по лимиту длины. Набор стоп-причин зависит от провайдера (
stop,length,content_filter,tool_calls). - seed — фиксация случайности для воспроизводимости.
- Greedy vs sampling: greedy всегда берёт самый вероятный токен (детерминированно, но скучно/повторы); sampling выбирает случайно пропорционально вероятностям.
T=0формально невозможен (деление на 0), на практике = argmax (полный детерминизм — для кода/математики/воспроизводимости). - Откуда берётся распределение: финальный вектор последнего токена × output-матрица (
d_model × vocab_size) → логиты → softmax → вероятности. Иногда output-матрица — та же, что матрица эмбеддингов (tied embeddings, экономит ~500M параметров). - Практические значения T: 0 — детерминизм; 0.1–0.3 — код/математика; 0.7–1.0 — диалог; 1.0–1.5 — творчество.
- Дефолт для агентных tool-calls — детерминизм
temperature=0: одинаковые входы → одинаковые аргументы инструментов и воспроизводимость (см. LangGraph Reliability).
Пример
resp = client.chat(
model="gpt-...",
messages=[...],
temperature=0, # детерминированный ответ (классификация)
top_p=1,
max_tokens=500, # лимит длины и стоимости
)
Авторегрессивная генерация
LLM генерирует авторегрессивно: каждый следующий токен зависит от всех предыдущих. На каждом шаге вся последовательность (промпт + уже сгенерированное) прогоняется через все блоки, выбирается один токен (по правилам выше), добавляется ко входу — и цикл повторяется до EOS или лимита. Это не рекуррентность (цикл внутри одного прохода, как в RNN), а внешний цикл по проходам; пересчёт прошлого устраняется через KV Cache.
Связано с
- Transformer — откуда берутся вероятности
- Reasoning Effort —
max_tokensна thinking-блок как рычаг усилия - Context Window — длина вывода добавляется к стоимости контекста
- KV Cache — ускоряет авторегрессивную генерацию (кэш K/V)
- LangGraph Reliability — детерминизм tool-calls (
temperature=0) для воспроизводимости