COMRAD404 / GLOSSARY

Top-k Sampling (сэмплирование top-k)

Top-k sampling

Top-k sampling — способ декодирования, при котором LLM на каждом шаге выбирает следующий токен только из k самых вероятных вариантов. Разбираем механику, отличия от top-p и нюансы в Transformers и vLLM.

TL;DR

Метод генерации, при котором языковая модель на каждом шаге выбирает следующий токен только из k самых вероятных вариантов после их перенормировки.

Top-k sampling — это способ декодирования в авторегрессионной языковой модели, при котором на каждом шаге остаются только k самых вероятных следующих токенов, их вероятности заново нормируются до суммы 1, после чего из этого набора случайно выбирается один токен. Проще говоря, модель не выбирает из всего словаря, а работает с коротким списком лидеров.

Английский термин: Top-k sampling. В статьях и документации также встречаются top-k decoding и top-k random sampling; по-русски обычно говорят «сэмплирование top-k» или «декодирование top-k».

Простыми словами

Грубо говоря, top-k sampling похож на ситуацию, когда вам показывают не весь каталог вариантов ответа, а только несколько самых правдоподобных. Если k=10, модель сначала берёт 10 лидеров по вероятности, а уже потом случайно выбирает один из них.

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

Как это работает

В работе ACL 2020 top-k рассматривается вместе с nucleus sampling и tempered sampling как один из широко используемых алгоритмов ancestral sampling для авторегрессионных языковых моделей. Формально, как описано в работе NeurIPS 2025, на каждом шаге сохраняются k наибольших вероятностей следующего токена, затем они перенормируются так, чтобы снова суммироваться в 1, и из них выполняется сэмплирование.

  1. Модель считает оценки следующего токена для всего словаря.
  2. Из всего словаря выбираются только k лучших кандидатов.
  3. Остальные кандидаты исключаются из рассмотрения.
  4. Оставшиеся вероятности перенормируются.
  5. Из этого укороченного распределения случайно выбирается один токен.
  6. Выбранный токен добавляется в контекст, и цикл повторяется.
Контекст -> модель -> распределение по всему словарю
                    |
                    v
          оставить только k лучших токенов
                    |
                    v
        исключить остальные кандидаты
                    |
                    v
     перенормировать вероятности до суммы 1
                    |
                    v
      случайно выбрать 1 токен из shortlist
                    |
                    v
      добавить токен в ответ и перейти к шагу t+1

Если смотреть на реализацию, в текущем коде Transformers объект TopKLogitsWarper требует положительное целое значение top_k и маскирует токены, чей score ниже k-го по величине. Но сам по себе параметр top_k ещё не включает случайную генерацию: документация Hugging Face прямо указывает, что generate() использует multinomial sampling только при do_sample=True.

Практический нюанс: в документации Hugging Face top_k описан как число наиболее вероятных токенов словаря, которые нужно оставить; если параметр не задан в generation_config.json, там указан дефолт 50. При этом эффективная конфигурация может зависеть от конкретного сохранённого чекпойнта, поэтому в рабочих сценариях лучше задавать top_k явно.

Где применяется

  • Локальная генерация в Hugging Face Transformers. Вы задаёте top_k в generate() или через конфигурацию генерации, чтобы ограничить shortlist кандидатов при sampling.
  • Сервинг модели через vLLM. В SamplingParams параметр top_k задаёт число рассматриваемых токенов. Это типичный случай для продакшн-инференса и сервинга модели.
  • Открытая генерация текста. В статье Hierarchical Neural Story Generation использовалась схема top-k random sampling с k = 10 на каждом временном шаге для генерации историй. Это хороший ориентир, что метод давно применяется на практике, но не является универсальным стандартом для любого жанра и модели.
  • Потоковая выдача токенов. Если ответ отсылается постепенно, как в потоковой генерации, top-k влияет на выбор каждого следующего токена до его отправки клиенту.

Если вы сравниваете open-source фреймворки и hosted API, держите в уме важную границу: на проверенной странице справки OpenAI документирован параметр topP для nucleus sampling, а не top_k. То есть сам принцип top-k общеизвестен, но доступность конкретного параметра зависит от платформы и endpoint.

Практический пример

Минимальный сценарий в Hugging Face выглядит так:

# Hugging Face Transformers
generated = model.generate(
    **inputs,
    do_sample=True,  # без этого sampling не включится
    top_k=10,        # оставить 10 самых вероятных кандидатов
    max_new_tokens=40
)

Что здесь важно на практике:

  1. do_sample=True обязателен, если вы действительно хотите sampling, а не детерминированный выбор.
  2. top_k=10 жёстко ограничивает число кандидатов для каждого следующего токена.
  3. Явное указание top_k помогает не зависеть от скрытых значений в generation_config.json.

Похожий контроль есть и в vLLM:

# vLLM
sampling_params = SamplingParams(top_k=10)

Но переносить настройки между фреймворками без проверки нельзя. В vLLM задокументировано, что top_k=0 или -1 означает «рассматривать все токены», то есть truncation выключен. Это уже не то же самое, что положительное значение top_k в реализации Transformers.

Чем отличается от похожих терминов

Термин Что ограничивает Как задаётся Ключевая разница
Top-k sampling Фиксированное число самых вероятных токенов top_k Размер shortlist постоянный: на каждом шаге остаются ровно k кандидатов
Top-p / Nucleus Sampling Другой sampling-контроль, документируемый отдельно как top_p top_p Это не тот же параметр, что top_k; на проверенной странице OpenAI фигурирует именно topP, а не top_k
Сэмплирование без top-k-ограничения Список кандидатов не обрезается по k В vLLM: top_k=0 или -1 Все токены остаются в рассмотрении, то есть truncation отключён

Если вам нужен разбор соседних регуляторов генерации, посмотрите также материал как настроить Temperature и Top-p для контроля генерации. Это полезно именно потому, что в некоторых API вы увидите top_p, но не увидите top_k.

Ограничения и заблуждения

  • Заблуждение: top-k сам по себе делает текст «лучше». Источники из пакета описывают механику truncation и sampling, но не дают универсального качества для любого значения k. Число k зависит от модели и задачи.
  • Заблуждение: top-k работает без включённого sampling. Для Hugging Face это неверно: документация говорит, что generate() использует multinomial sampling при do_sample=True.
  • Заблуждение: semantics одинаковы во всех фреймворках. В Transformers top-k связан с положительным целым параметром и логикой warper-а; в vLLM документированы специальные значения 0 и -1, означающие рассмотрение всех токенов.
  • Заблуждение: top-k обязательно доступен в любом hosted API. На проверенной странице OpenAI reference документирован topP и есть рекомендация менять либо temperature, либо top_p, но поля top_k на этой странице нет.

Редакционное ограничение: сравнение hosted API здесь ограничено только теми страницами, которые были в исходном пакете на 2026-08-18. Я не проверял все endpoint-и и все модели вне этих источников, поэтому не стоит переносить вывод «есть/нет top_k» на всю экосистему без сверки с текущей документацией.

Практический вердикт: top-k удобен, когда вам нужен простой и явный способ жёстко сузить список кандидатов на каждом шаге генерации. Если вы работаете локально или через vLLM, этот контроль обычно доступен и понятен. Если вы работаете через API, сначала проверьте, документирован ли именно top_k; если нет, ориентируйтесь на доступные регуляторы вроде top_p и не переносите настройки между платформами вслепую.

Связанные термины и инструменты

Источники

Вопросы и ответы

Что делает top-k sampling?

Он оставляет только k самых вероятных следующих токенов, заново нормирует их вероятности и выбирает один токен случайно из этого сокращённого списка.

Работает ли top-k без do_sample=True в Transformers?

Для sampling в generate() документация Hugging Face указывает do_sample=True. Поэтому top-k обычно используют вместе с этим флагом.

Чем top-k отличается от top-p?

Это разные контролы генерации. Top-k задаётся числом кандидатов k, а top-p документируется отдельно как nucleus sampling через параметр top_p.

Что означает top_k=0 или -1 в vLLM?

По документации vLLM это значит, что рассматриваются все токены, то есть top-k-ограничение отключено.

Есть ли top_k в OpenAI API?

На проверенной странице OpenAI reference документирован topP и temperature, а поля top_k там нет. Поддержка может отличаться по endpoint-ам и моделям, поэтому сверяйтесь с актуальной документацией конкретного API.

Источники

SOURCES

Вопросы и ответы

FAQ
Что делает top-k sampling?

Он оставляет только k самых вероятных следующих токенов, перенормирует их вероятности и случайно выбирает один токен из этого сокращённого набора.

Работает ли top-k без `do_sample=True` в Transformers?

Для sampling в `generate()` документация Hugging Face указывает `do_sample=True`, поэтому top-k обычно используют вместе с этим флагом.

Чем top-k отличается от top-p?

Это разные контролы генерации: top-k задаётся числом кандидатов `k`, а top-p документируется отдельно как nucleus sampling через параметр `top_p`.

Что означает `top_k=0` или `-1` в vLLM?

По документации vLLM это значит, что рассматриваются все токены, то есть top-k-ограничение отключено.

Есть ли `top_k` в OpenAI API?

На проверенной странице OpenAI reference документирован `topP` и temperature, а поля `top_k` там нет; поддержку нужно проверять по документации конкретного endpoint-а и модели.

Читайте также

LINKS