Top-p, или nucleus sampling, — стратегия декодирования для языковых моделей, в которой на каждом шаге генерации выбирается минимальное множество токенов с совокупной вероятностью не ниже p (например, 0,9). Из этого адаптивного ядра распределение пере-нормируется, затем случайно выбирается следующий токен. В отличие от top-k, где размер множества фиксирован (*k*), в top-p его размер зависит от «уверенности» модели на текущем шаге.
Связанные страницы: Контекстное окно, RAG-хаб, Evals.
Top-p (nucleus sampling): формальное определение
Пусть модель вернула вероятности p(v) по словарю V для следующего токена.
- Упорядочим токены по убыванию: v₁, v₂, … где p(v₁) ≥ p(v₂) ≥ …
- Возьмём наименьшее ядро S_p = {v₁, …, v_m}, такое что Σ_{i=1..m} p(vᵢ) ≥ p
- Определим новое распределение:
- q(v) = p(v) / Σ_{u∈S_p} p(u) для v ∈ S_p
- q(v) = 0 для v ∉ S_p
- Сэмплируем один токен из 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 | Суммарную вероятность ядра | Адаптивно к шагу, размер множества «плавает» |
Псевдокод
- logits = model(x)
- logits = logits / T
- probs = softmax(logits)
- idx = argsort_desc(probs)
- cum = cumsum(probs[idx])
- m = min { j : cum[j] ≥ p }
- S = idx[:m]
- q = normalize(probs[S])
- 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* модель может «залипать» в повторы; добавляйте штраф повторов и лимиты длины.
- Смешение жанров. Универсальные настройки для всех задач почти всегда хуже, чем профильные пресеты.
Тюнинг в проде: пошагово
- Определите цель (факты/стиль/креатив/длина) и метрики (EM/F1, win-rate, pass@k).
- Прогоните сетку T ∈ {0.3, 0.7, 1.0} × p ∈ {0.85, 0.90, 0.95} на вашем golden-наборе.
- Для сложных шагов включите «потолок» k_cap и сравните стабильность форматов.
- Зафиксируйте лучшие пары и версионируйте настройки; мониторьте жалобы/ошибки/латентность.
- Для 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, чтобы избежать «сухости» текста.
