Top-p (nucleus sampling) — как выбирать токены в LLM адаптивно к «уверенности» модели

Top-p, или nucleus sampling, — стратегия декодирования для языковых моделей, в которой на каждом шаге генерации выбирается минимальное множество токенов с совокупной вероятностью не ниже p (например, 0,9). Из этого адаптивного ядра распределение пере-нормируется, затем случайно выбирается следующий токен. В отличие от top-k, где размер множества фиксирован (*k*), в top-p его размер зависит от «уверенности» модели на текущем шаге.

Top-p (nucleus sampling) — как выбирать токены в LLM адаптивно к «уверенности» модели

Связанные страницы: Контекстное окно, RAG-хаб, Evals.

Top-p (nucleus sampling): формальное определение

Пусть модель вернула вероятности p(v) по словарю V для следующего токена.

  1. Упорядочим токены по убыванию: v₁, v₂, … где p(v₁) ≥ p(v₂) ≥ …
  2. Возьмём наименьшее ядро S_p = {v₁, …, v_m}, такое что Σ_{i=1..m} p(vᵢ) ≥ p
  3. Определим новое распределение:
    1. q(v) = p(v) / Σ_{u∈S_p} p(u) для v ∈ S_p
    2. q(v) = 0 для v ∉ S_p
  4. Сэмплируем один токен из q

Крайние случаи:

  • p → 0 (теоретически) тянет к greedy;
  • p = 1 эквивалентно выбору из полного распределения (без отсечения).

Почему nucleus sampling полезен

  • Адаптивность к неопределённости. Когда модель «уверена», ядро маленькое; когда неопределённость высока, ядро расширяется.
  • Контроль внезапных «ошибок хвоста». Маловероятные токены, как правило, не попадают в ядро при достаточном *p*, снижая риск нелепых продолжений.
  • Баланс разнообразия и стабильности «на лету», без ручного пересчёта *k* под каждый шаг.

Связь и различия: top-p, top-k, температура

  • Температура (T) делает распределение острее (T<1) или ровнее (T>1) до формирования ядра.
  • Top-k фиксирует размер множества; top-p фиксирует суммарную вероятность.
  • На практике часто используют комбинацию: сначала nucleus (*p*), затем «потолок» по *k*, чтобы ядро не раздувалось в «трудных» шагах.
Метод Регулирует Поведение
Температура «Остроту» распределения Глобально меняет вероятности перед отсечением
Top-k Максимальный размер множества Предсказуемое разнообразие, но без учёта уверенности
Top-p Суммарную вероятность ядра Адаптивно к шагу, размер множества «плавает»

Псевдокод

  1. logits = model(x)
  2. logits = logits / T
  3. probs = softmax(logits)
  4. idx = argsort_desc(probs)
  5. cum = cumsum(probs[idx])
  6. m = min { j : cum[j] ≥ p }
  7. S = idx[:m]
  8. q = normalize(probs[S])
  9. next = sample(q)

Практические пресеты

Сценарий Температура p (старт) Комментарий
Фактическое QA / поиск по контенту 0–0,3 0,80–0,92 Минимизируйте «воду»; при RAG держите *p* ближе к 0,85 и ограничивайте длину.
Код / формальные форматы 0,2–0,5 0,80–0,95 Жёсткие структуры выигрывают от более низких *p*; проверяйте pass@k (см. Evals).
Суммаризация / рефакторинг текста 0–0,4 0,85–0,95 Стабильность > разнообразия; следите за повторяемостью.
Креатив / маркетинг / сторителлинг 0,7–1,0 0,90–0,97 Поднимайте сначала T, затем p; контролируйте длину и логические связки.
Диалог-ассистент (общий) 0,5–0,8 0,88–0,95 Баланс; добавляйте политики безопасности и стоп-фразы.

*Ориентиры зависят от конкретной модели, языка и контекста.*

Интуиция влияния *p*

  • Низкое *p* (≈0,8–0,85) — ядро маленькое, стиль сдержанный и предсказуемый; меньше риска «съехать», но выше шанс повторов и «склейки фраз».
  • Среднее *p* (≈0,9–0,95) — компромисс «качество/разнообразие» для большинства задач.
  • Высокое *p* (≈0,96–0,99) — ядро широкое, появляются «дальние ассоциации» и креатив, но растут ошибки стиля и фактов.

Как комбинировать top-p, top-k и T

  • Правило 1. Настройте T под домен (факты/код — ниже; креатив — выше).
  • Правило 2. Подберите p как основной регулятор разнообразия (0,9 хорошая отправная точка).
  • Правило 3. При всплесках «размазни» ограничьте ядро max-k: используйте min(|S_p|, k_cap) с k_cap ≈ 20–50 под задачу.
  • Правило 4. Для JSON/таблиц снижайте *T* и *p* и добавляйте схемную валидацию.

Тонкие эффекты и частые ошибки

  • «Слишком высокий *p* лечит креатив». Да, но если T тоже высока — вырастет «словесный шум». Лучше сначала поднять T, затем p.
  • Длинные ответы и циклы. При низком *p* модель может «залипать» в повторы; добавляйте штраф повторов и лимиты длины.
  • Смешение жанров. Универсальные настройки для всех задач почти всегда хуже, чем профильные пресеты.
  • Путаница «правдивость ↔ *p*». Top-p регулирует разнообразие, а не знания. За факты отвечают контекст, источники и политика ответов (см. RAG-хаб и Evals).

Тюнинг в проде: пошагово

  1. Определите цель (факты/стиль/креатив/длина) и метрики (EM/F1, win-rate, pass@k).
  2. Прогоните сетку T ∈ {0.3, 0.7, 1.0} × p ∈ {0.85, 0.90, 0.95} на вашем golden-наборе.
  3. Для сложных шагов включите «потолок» k_cap и сравните стабильность форматов.
  4. Зафиксируйте лучшие пары и версионируйте настройки; мониторьте жалобы/ошибки/латентность.
  5. Для RAG — дополнительно меряйте faithfulness и citation-precision.

Мини-FAQ

Чем top-p принципиально отличается от top-k?

Top-p отбирает минимальное ядро по совокупной вероятности, его размер меняется от шага к шагу. Top-k держит фиксированное количество токенов, независимо от «уверенности».

Можно совмещать top-p и top-k?

Да, это популярная схема: сначала nucleus по *p*, затем ограничение «потолком» *k* (например, k_cap = 40) в «трудных» шагах.

Что выбрать для кода?

Низкая T и умеренно низкое p (≈0,85–0,9), плюс тесты pass@k и строгая валидация формата.

Повышение *p* улучшит фактичность?

Нет. *p* управляет разнообразием. Для фактов используйте хорошие источники/контекст и консервативное декодирование.

Почему оптимальные *p* различаются для языков?

Из-за токенизации и распределений частот. Для языков с богатой морфологией нередко требуется чуть более высокое *p* при той же T, чтобы избежать «сухости» текста.

См. также

Task Runner