0Pricing
AI Prompt Engineering · Урок

Выборка по ядру top-p

Как top-p ограничивает выборку наиболее вероятным набором токенов.

«Выборка по ядру top-p» — бесплатный урок AI Prompt Engineering на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения AI Prompt Engineering, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс AI Prompt Engineering содержит 4 уроков всего.

Что такое выборка top-p?

Выборка top-p (также называемая выборкой по ядру) — это метод, ограничивающий выборку динамическим подмножеством словаря. Вместо выборки из всех токенов модель рассматривает только наименьший набор токенов, суммарная вероятность которых составляет не менее p.

Метод предложен в статье «Любопытный случай вырождения нейронного текста» (Holtzman и др., 2019); для разнообразной и одновременно связной генерации он превосходит простое масштабирование температуры.

Как работает top-p: пошаговое описание

Алгоритм:

  1. Вычислите вероятности softmax для всего словаря
  2. Отсортируйте токены по вероятности, начиная с самой высокой
  3. Последовательно проходите по отсортированному списку, накапливая вероятности, пока их суммарное значение не достигнет p
  4. Этот набор токенов называется ядром
  5. Выполняйте выборку только из ядра, перенормировав вероятности так, чтобы их сумма была равна 1
import numpy as np

def top_p_sample(logits, p=0.9):
    probs = softmax(logits, temperature=1.0)

    # Sort by probability descending
    sorted_indices = np.argsort(probs)[::-1]
    sorted_probs = probs[sorted_indices]

    # Find nucleus: smallest set with cumulative prob >= p
    cumulative = np.cumsum(sorted_probs)
    nucleus_size = np.searchsorted(cumulative, p) + 1
    nucleus_indices = sorted_indices[:nucleus_size]
    nucleus_probs = sorted_probs[:nucleus_size]

    # Renormalize
    nucleus_probs = nucleus_probs / nucleus_probs.sum()

    # Sample
    chosen = np.random.choice(nucleus_indices, p=nucleus_probs)
    return chosen

token = top_p_sample(logits, p=0.9)

Динамическое ядро

Ключевая особенность top-p: размер ядра является динамическим. Когда модель очень уверена в ответе (один токен доминирует с вероятностью 0.95), ядро содержит всего 1 токен. Когда модель не уверена (многие токены имеют близкие вероятности), ядро расширяется и включает больше токенов.

Размер ядра автоматически подстраивается под уверенность модели: высокая уверенность → небольшой словарь → сфокусированный результат. Низкая уверенность → больший словарь → больше возможностей для исследования.

# High-confidence situation: model strongly prefers 'the'
high_confidence_logits = np.array([5.0, 1.0, 0.5, 0.1, -0.5])
hc_probs = softmax(high_confidence_logits)
print('High confidence probs:', np.round(hc_probs, 3))
# [0.974, 0.018, 0.011, 0.007, 0.004]
# Top-p=0.9 nucleus: just 1 token (cumulative after token 0 = 97.4% > 90%)

# Low-confidence situation: model unsure
low_confidence_logits = np.array([1.1, 1.0, 0.9, 0.8, 0.7])
lc_probs = softmax(low_confidence_logits)
print('Low confidence probs:', np.round(lc_probs, 3))
# [0.218, 0.208, 0.199, 0.190, 0.181]
# Top-p=0.9 nucleus: all 5 tokens (need all to reach 90%)

Top-p в API OpenAI

Укажите top_p в вызове API. Допустимый диапазон — 0.0–1.0. Значение по умолчанию — 1.0 (полный словарь, без ограничения ядром).

OpenAI рекомендует: если вы изменяете top_p, оставляйте температуру равной 1.0, и наоборот. Одновременная настройка обоих параметров затрудняет предсказание фактического поведения выборки.

import openai
client = openai.OpenAI(api_key='sk-...')

# Nucleus sampling: top 90% of probability mass
resp = client.chat.completions.create(
    model='gpt-4o',
    messages=[{'role': 'user', 'content': 'Tell me an interesting fact about the ocean.'}],
    temperature=1.0,   # leave temperature at default
    top_p=0.9          # sample from top 90% nucleus
)
print(resp.choices[0].message.content)

p=1.0: выборка без ограничений

Когда top_p=1.0, ядро включает все токены — весь словарь. Это эквивалентно выборке только с температурой, без ограничения top-p. Каждый токен, каким бы маловероятным он ни был, имеет ненулевую вероятность выбора.

Используйте p=1.0, если нужна максимальная разнообразность. При p=1.0 только температура управляет формой распределения.

# p=1.0: all tokens in nucleus
resp_full = client.chat.completions.create(
    model='gpt-4o',
    messages=[{'role': 'user', 'content': 'Generate a creative story opening.'}],
    temperature=1.0,
    top_p=1.0  # no nucleus restriction
)

# p=0.5: very focused nucleus
resp_focused = client.chat.completions.create(
    model='gpt-4o',
    messages=[{'role': 'user', 'content': 'Generate a creative story opening.'}],
    temperature=1.0,
    top_p=0.5  # only top 50% probability mass
)

Компромисс: top-p и температура

Оба параметра управляют разнообразием результата, но по-разному:

  • Температура изменяет форму всего распределения — относительная вероятность токена по сравнению со всеми остальными меняется
  • Top-p обрезает распределение — токен просто исключается, если находится за пределами ядра, независимо от его относительной вероятности

Top-p предотвращает проблему «выборки из хвоста»: при высокой температуре крайне маловероятные токены (бессмыслица, несвязанные слова) иногда всё же выбираются. Top-p полностью исключает такие токены из рассмотрения.

# The tail problem with temperature alone
high_temp_logits = np.array([3.0, 2.0, 1.0, 0.0, -1.0, -5.0, -10.0])
probs_high_temp = softmax(high_temp_logits, temperature=2.0)
print('High temp probs:', np.round(probs_high_temp, 4))
# The last token (logit=-10) still has a small probability
# With many tokens in a real vocab, these rare tokens accumulate
# and occasionally get sampled, producing incoherent output

# Top-p=0.9 cuts these off entirely
# ensuring only tokens contributing to the top 90% are considered

Совместное использование температуры и top-p

При совместном использовании обоих параметров сначала применяется температура (изменяется форма распределения), а затем к полученным вероятностям применяется top-p (распределение обрезается до ядра).

Распространённые конфигурации для рабочей среды:

  • Творческое письмо: temp=1.0, top_p=0.95
  • Чат: temp=0.8, top_p=0.9
  • Код: temp=0.2, top_p=1.0 (при низкой температуре top-p почти не ограничивает выборку)
def combined_sample(logits, temperature=1.0, top_p=0.9):
    # Step 1: apply temperature
    probs = softmax(logits, temperature=temperature)

    # Step 2: apply top-p nucleus
    sorted_idx = np.argsort(probs)[::-1]
    sorted_probs = probs[sorted_idx]
    cumulative = np.cumsum(sorted_probs)
    nucleus_size = np.searchsorted(cumulative, top_p) + 1
    nucleus_idx = sorted_idx[:nucleus_size]
    nucleus_probs = probs[nucleus_idx]
    nucleus_probs = nucleus_probs / nucleus_probs.sum()

    return np.random.choice(nucleus_idx, p=nucleus_probs)

Top-p и повторения

Низкие значения top-p могут приводить к повторениям. Когда ядро очень маленькое, например при p=0.5, модель снова и снова выбирает токены из крошечного набора. Результат становится повторяющимся и предсказуемым — полной противоположностью ожидаемому творческому эффекту.

Следите за повторениями: они могут указывать на то, что значение top-p слишком низкое для данной задачи. Полезный диагностический признак: если модель зацикливается на одних и тех же фразах, увеличьте top-p или температуру.

def detect_repetition(text, window=20):
    words = text.split()
    if len(words) < window * 2:
        return False
    # Check if any window of words repeats within the text
    for i in range(len(words) - window):
        phrase = ' '.join(words[i:i + window])
        rest = ' '.join(words[i + window:])
        if phrase in rest:
            return True
    return False

response = call_llm(prompt)
if detect_repetition(response):
    print('Warning: repetition detected — consider increasing top_p or temperature')

Top-p и top-k: предварительный обзор

Top-p и top-k обрезают словарь перед выборкой, но делают это по-разному:

  • Top-p: динамический размер ядра — расширяется, когда модель не уверена, и уменьшается, когда она уверена
  • Top-k: фиксированный размер ядра — всегда рассматривается ровно k токенов независимо от уверенности модели

Обычно предпочтителен top-p, поскольку он подстраивается под уверенность модели. Подробно top-k рассматривается в следующем уроке.

# Top-k equivalent for comparison
def top_k_sample(logits, k=50):
    probs = softmax(logits)
    # Keep only top-k tokens
    top_k_indices = np.argsort(probs)[::-1][:k]
    top_k_probs = probs[top_k_indices]
    top_k_probs = top_k_probs / top_k_probs.sum()
    return np.random.choice(top_k_indices, p=top_k_probs)

# Key difference: k is always 50, regardless of model confidence
# Top-p nucleus size varies from 1 to thousands depending on confidence

Значения по умолчанию и когда их изменять

Значения API по умолчанию: top_p = 1.0 (без ограничения ядром). Когда следует изменить этот параметр?

  • Уменьшите top_p до 0.7–0.9: если результаты кажутся несвязными или содержат бессмысленные слова — слишком много выборки из хвоста
  • Оставьте значение 1.0: если температура уже низкая — при низкой температуре распределение и так достаточно резко выражено, поэтому top-p всё равно почти не ограничивает выборку
  • Не уменьшайте значение ниже 0.5: это приводит к повторениям и потере разнообразия
# Guidance: what to adjust based on symptoms
TROUBLESHOOTING = {
    'output is incoherent or contains random words': {
        'fix': 'lower top_p to 0.9 or 0.85',
        'or': 'lower temperature'
    },
    'output is repetitive and looping': {
        'fix': 'increase top_p or temperature',
        'also': 'try adding frequency_penalty or presence_penalty'
    },
    'output is too predictable and boring': {
        'fix': 'increase temperature to 0.9-1.2',
        'keep': 'top_p at 0.95'
    },
    'output needs to be deterministic': {
        'fix': 'set temperature=0, top_p=1.0'
    }
}

Top-p в Anthropic Claude

API Anthropic Claude также предоставляет top_p как параметр. Поведение идентично: модель формирует ядро из наименьшего набора токенов, чья суммарная вероятность достигает порога p, а затем выполняет выборку из этого ядра.

Для точного управления сочетайте этот параметр с температурой: используйте температуру для изменения формы распределения, а top_p — для ограничения набора токенов, которые можно выбрать из этого распределения.

import anthropic
claude = anthropic.Anthropic(api_key='sk-ant-...')

# Creative writing with nucleus sampling
message = claude.messages.create(
    model='claude-opus-4-5',
    max_tokens=256,
    temperature=1.0,
    top_p=0.95,
    messages=[{
        'role': 'user',
        'content': 'Write a short poem about the ocean.'
    }]
)
print(message.content[0].text)

Проверка знаний

Какое ключевое преимущество выборки top-p (по ядру) перед выборкой top-k?

Итоги: выборка по ядру top-p

Выборка top-p формирует динамическое ядро — наименьший набор токенов, охватывающий не менее p всей вероятности:

  • p=1.0: полный словарь, без ограничений
  • p=0.9: масса вероятности 90% — типичная настройка для творческих задач
  • p=0.5: очень сфокусированный результат — риск повторений

Ядро расширяется, когда модель не уверена, и сужается, когда она уверена. Это предотвращает выборку из хвоста (бессмыслицу от маловероятных токенов), сохраняя разнообразие. Следующий урок: выборка top-k и её отличие от top-p.

Часто задаваемые вопросы

Урок «Выборка по ядру top-p» бесплатный?

Да — полный текст урока «Выборка по ядру top-p» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс AI Prompt Engineering, подпишись на CoddyKit PRO. Курс AI Prompt Engineering содержит 4 уроков всего.

Чему я научусь в уроке «Выборка по ядру top-p»?

Как top-p ограничивает выборку наиболее вероятным набором токенов. Ты практикуешь AI Prompt Engineering с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать AI Prompt Engineering?

Предыдущий опыт не требуется. AI Prompt Engineering на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.

Сколько времени занимает урок «Выборка по ядру top-p»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке AI Prompt Engineering?

Да. Каждый урок AI Prompt Engineering включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Что такое температура в LLM
  2. Выборка по ядру top-p
  3. Выборка top-k
  4. Выбор параметров для вашего сценария
← Назад к AI Prompt Engineering