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, и из них выполняется сэмплирование.
- Модель считает оценки следующего токена для всего словаря.
- Из всего словаря выбираются только k лучших кандидатов.
- Остальные кандидаты исключаются из рассмотрения.
- Оставшиеся вероятности перенормируются.
- Из этого укороченного распределения случайно выбирается один токен.
- Выбранный токен добавляется в контекст, и цикл повторяется.
Контекст -> модель -> распределение по всему словарю
|
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
)
Что здесь важно на практике:
do_sample=Trueобязателен, если вы действительно хотите sampling, а не детерминированный выбор.top_k=10жёстко ограничивает число кандидатов для каждого следующего токена.- Явное указание
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-p / Nucleus Sampling — близкий способ контролировать выбор следующего токена.
- Model serving — где параметры sampling настраиваются на стороне инференс-сервера.
- Streaming — как top-k влияет на токены, которые вы отдаёте пользователю по одному.
- Как настроить Temperature и Top-p для контроля генерации — полезно, если ваш API не показывает параметр
top_k.
Источники
- Foundations of Top-$k$ Decoding for Language Models
- Hierarchical Neural Story Generation
- A Systematic Characterization of Sampling Algorithms for Open-ended Language Generation
- Generation · Hugging Face
- transformers/src/transformers/generation/logits_process.py at main · huggingface/transformers · GitHub
- sampling_params – vLLM
- Create completion | OpenAI API Reference
- Releases · vllm-project/vllm · GitHub
Вопросы и ответы
Что делает 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.