Тонкая настройка параметров: Temperature, Top-K, Top-P и Seed

30 минут Урок 4

Введение: От алхимии к инженерии

Добро пожаловать на урок, который отделяет новичков от профессиональных архитекторов ИИ-решений. Когда вы только начинаете работать с LLM, генерация текста часто кажется магией или лотереей. Вы отправляете промпт, модель выдает ответ, и иногда он блестящий, а иногда — странный.

Как архитектор, вы не можете полагаться на удачу. В продакшене (production) нужна предсказуемость, воспроизводимость и контроль. Именно здесь в игру вступают параметры выборки (sampling parameters): Temperature, Top-K, Top-P и Seed.

Давайте разберемся, что происходит «под капотом» Gemini 3. Модель не просто выбирает готовые предложения. В каждый момент времени она предсказывает следующий токен. Она генерирует вероятностное распределение по всему своему словарю (десятков тысяч токенов). Параметры, которые мы сегодня изучим, — это фильтры и модификаторы, определяющие, как именно модель выбирает один токен из этого огромного списка вероятностей.

Temperature: Управление хаосом

Temperature (Температура) — это самый известный, но часто неправильно понимаемый параметр. Технически, это скалярная величина, на которую делятся логиты (logits) перед применением функции Softmax.

Проще говоря, температура контролирует «уверенность» модели в выборе наиболее вероятных токенов.

  • Низкая температура (0.0 - 0.3): Распределение вероятностей обостряется. Вероятные токены становятся еще более вероятными, а маловероятные — стремятся к нулю. Модель становится консервативной, детерминированной и фактической. Идеально для задач классификации, извлечения данных и генерации кода.
  • Высокая температура (0.7 - 1.0+): Распределение сглаживается. Разница между самым вероятным токеном и его соседями уменьшается. Модель начинает «рисковать», выбирая менее очевидные слова. Это повышает креативность, но увеличивает риск галлюцинаций.

Аналогия: Представьте, что вы выбираете маршрут домой. При температуре 0 вы всегда идете самой короткой дорогой. При температуре 0.9 вы можете решить срезать через парк, просто чтобы посмотреть на уток, даже если это дольше.

python
import google.generativeai as genai
import os

# Базовая настройка API
genai.configure(api_key=os.environ["GEMINI_API_KEY"])

# Инициализация модели Gemini 3 (пример названия модели)
model = genai.GenerativeModel('gemini-1.5-pro-latest') # Используем актуальную версию

# Сценарий 1: Строгий аналитик (Низкая температура)
# Используем для JSON, кода или фактов
response_strict = model.generate_content(
    "Объясни принцип работы квантовой запутанности в одном предложении.",
    generation_config=genai.types.GenerationConfig(
        temperature=0.1
    )
)
print(f"Strict: {response_strict.text}")

# Сценарий 2: Креативный писатель (Высокая температура)
# Используем для брейншторминга или стихов
response_creative = model.generate_content(
    "Придумай название для нового бренда кибер-кроссовок.",
    generation_config=genai.types.GenerationConfig(
        temperature=0.9
    )
)
print(f"Creative: {response_creative.text}")

Top-K: Жесткая фильтрация

Если Температура меняет форму распределения вероятностей, то Top-K просто обрезает «хвост» этого распределения.

Параметр top_k указывает модели рассматривать только K самых вероятных токенов на каждом шаге. Все остальные токены, какими бы интересными они ни были, полностью исключаются из выборки.

  • Top-K = 1: Это называется «Жадное декодирование» (Greedy Decoding). Модель всегда выбирает только самый вероятный токен. Результат будет очень монотонным и может зацикливаться.
  • Top-K = 40 (стандартное значение): Модель выбирает следующий токен из 40 лучших кандидатов. Это отсекает откровенный бред (токены с мизерной вероятностью), но оставляет пространство для маневра.

Проблема Top-K: Этот метод жесткий. Иногда распределение вероятностей «плоское» (много хороших вариантов), а иногда «острое» (только один верный вариант). Top-K всегда режет по фиксированному числу, что может либо отсечь хорошие варианты, либо включить плохие.

Top-P (Nucleus Sampling): Динамический бюджет

Top-P (или Nucleus Sampling) — это более умный подход. Вместо того чтобы выбирать фиксированное количество токенов (как в Top-K), мы выбираем токены, чья сумма вероятностей достигает значения P.

Допустим, top_p = 0.95.
Модель сортирует токены по убыванию вероятности и начинает суммировать их:
1. Токен А (60%) -> Сумма 0.6
2. Токен Б (20%) -> Сумма 0.8
3. Токен В (14%) -> Сумма 0.94
4. Токен Г (2%) -> Сумма 0.96 (СТОП)

В пул выбора попадают только токены А, Б, В и Г.

Почему это круто для архитектора?
Top-P динамически адаптируется к контексту. Если модель уверена в ответе (например, после слова «Нью» почти наверняка идет «Йорк»), пул кандидатов будет маленьким. Если контекст неоднозначен, пул расширится. Это создает баланс между связностью текста и разнообразием словарного запаса.

python
# Пример комбинированной конфигурации для чат-бота
# Мы хотим живой диалог, но без бреда.

chat_config = genai.types.GenerationConfig(
    temperature=0.7,  # Достаточно живо, но не хаотично
    top_p=0.95,       # Nucleus sampling: охватываем 95% вероятностной массы
    top_k=40          # Дополнительный предохранитель, убираем длинный хвост
)

chat = model.start_chat(history=[])
response = chat.send_message(
    "Как мне объяснить бабушке, что такое API?",
    generation_config=chat_config
)

print(response.text)

Seed: Борьба за детерминизм

До недавнего времени одной из главных проблем LLM была невозможность воспроизвести результат. Вы отлаживаете промпт, получаете отличный ответ, показываете заказчику... а модель выдает что-то другое.

В Gemini API (и других современных моделях) появился параметр Seed (зерно).

Если вы зафиксируете temperature = 0, результат будет почти всегда одинаковым, но не гарантированно (из-за особенностей параллельных вычислений на GPU). Использование конкретного целочисленного значения в seed заставляет генератор псевдослучайных чисел работать предсказуемо.

Сценарии использования Seed:

  1. Регрессионное тестирование: Проверка, что новая версия вашего промпта не сломала логику на тех же входных данных.
  2. Кеширование: Если запрос и seed совпадают, можно теоретически отдавать закешированный ответ (хотя это чаще реализуется на стороне приложения).
  3. Отладка: Понимание, почему модель ошиблась в конкретном случае.

Упражнение

Вы разрабатываете модуль генерации SQL-запросов для корпоративной аналитической системы на базе Gemini. Пользователи пишут запрос на естественном языке, модель переводит его в SQL. <br><br>Задача: Напишите конфигурацию `GenerationConfig` для этой задачи. Обоснуйте выбор каждого параметра (temperature, top_p, top_k).

Стратегия комбинирования: Золотые стандарты

Как архитектор, вы должны знать «пресеты» для разных типов задач. Конечно, это отправные точки, и их нужно тестировать, но они сэкономят вам часы настройки.

1. Кодинг, Математика, Факты (RAG):
Temperature: 0.0 - 0.2
Top-P: 0.95
Top-K: 10 - 20
Цель: Максимальная точность, минимум галлюцинаций.

2. Чат-бот поддержки, Общение:
Temperature: 0.5 - 0.7
Top-P: 0.9
Top-K: 40
Цель: Естественная речь, вежливость, способность перефразировать, но соблюдение скриптов.

3. Креативное письмо, Маркетинг, Брейншторм:
Temperature: 0.8 - 1.0
Top-P: 0.9 - 1.0
Top-K: 40 - 100
Цель: Неожиданные ассоциации, метафоры, разнообразие.

Важное примечание: Порядок применения обычно такой: сначала Top-K отсекает мусор, затем Top-P выбирает ядро вероятности, и наконец Temperature масштабирует вероятности внутри этого ядра перед финальным сэмплированием.

Вопрос

Вы настраиваете модель для написания художественного рассказа. Вы установили Temperature = 0.9, но текст все равно получается скучным и повторяющимся, хотя и грамматически верным. Какой параметр вероятнее всего 'душит' креативность модели в данной конфигурации?