Text Generation
Генерация текста — это процесс, в котором языковые модели предсказывают по одному токену за раз, выбирая каждый из них с помощью жадного декодирования, поиска по лучу или семплирования.
Генерация текста — это автоматическое создание письменного текста моделью: от однострочного ответа до полноценного отчёта или программы. Сегодня этим в основном занимаются большие языковые модели (LLM), работающие авторегрессионно: получив запрос, модель вычисляет вероятность каждого токена в своём словаре, выбирает один токен, добавляет его и повторяет процесс, пока не решит остановиться. Этот же цикл лежит в основе чат-ассистентов, автодополнения кода, машинного перевода и суммаризации текста. Ранние системы заполняли шаблоны или выбирали варианты из n-граммных моделей и моделей на основе рекуррентных нейронных сетей, а трансформер сделал практически возможной генерацию длинных связных текстов — начиная с GPT-2 в 2019 году.
Как работает авторегрессионная генерация#
Токенизация преобразует запрос в идентификаторы токенов, а модель обрабатывает их все за один параллельный этап предварительного заполнения (prefill), сохраняя ключи и значения внимания для каждого токена в KV-кэше. На каждом шаге декодирования модель обрабатывает только самый новый токен, считывает кэш и выдаёт логиты — по одной исходной оценке на каждый элемент словаря. Затем softmax преобразует логиты в вероятности. Стратегия декодирования выбирает следующий токен, который передаётся пользователю и добавляется к последовательности. Генерация останавливается на токене конца последовательности, стоп-строке или лимите токенов, поэтому длина вывода определяется во время генерации:
Этап предварительного заполнения требует много вычислений, а скорость декодирования ограничена пропускной способностью памяти. Поэтому движки обслуживания тщательно планируют оба этапа, например используя предварительное заполнение блоками. Потоковая передача позволяет приложениям показывать текст по мере появления: интерфейс LLM от Ultralytics передаёт stream=True в SDK OpenAI, поэтому приложение на базе YOLO26 может выводить описание обнаруженной сцены по токенам, по мере поступления каждого события response.output_text.delta.
Стратегии декодирования#
Стратегия декодирования влияет на вывод не меньше, чем сама модель. Жадное декодирование всегда выбирает наиболее вероятный токен. Оно детерминировано, но часто приводит к повторам. Поиск по лучу сохраняет k наиболее вероятных частичных последовательностей и возвращает лучшую завершённую последовательность, поэтому подходит для задач с единственным правильным ответом, например перевода. При сэмплировании токены выбираются из распределения, обычно предварительно изменённого: температура масштабирует логиты перед softmax, сэмплирование top-k оставляет только k наиболее вероятных токенов, а сэмплирование по ядру (top-p), предложенное в статье «Странный случай вырождения нейронного текста» Хольцмана и соавторов в 2019 году, сохраняет наименьший набор токенов, суммарная вероятность которых не меньше p. Пример на словаре из пяти токенов в PyTorch показывает оба эффекта:
import torch
# Next-token logits over a five-word vocabulary after the prompt "I took the"
vocab = ["bus", "train", "car", "stairs", "banana"]
logits = torch.tensor([3.0, 2.4, 1.8, 0.6, -2.0])
# Temperature divides the logits: low values sharpen the distribution, high values flatten it
for temperature in [0.5, 1.0, 1.5]:
probs = torch.softmax(logits / temperature, dim=-1)
print(f"T={temperature}:", ", ".join(f"{w} {p:.2f}" for w, p in zip(vocab, probs)))
# Top-p (nucleus) sampling keeps the smallest set of tokens whose probabilities reach p
probs, order = torch.softmax(logits, dim=-1).sort(descending=True)
keep = probs.cumsum(dim=-1) - probs < 0.9
print("Top-p 0.9 keeps:", [vocab[i] for i in order[keep]])
# Sample from the renormalized nucleus
torch.manual_seed(0)
picks = torch.multinomial(probs[keep] / probs[keep].sum(), num_samples=10, replacement=True)
print("Samples:", [vocab[order[i]] for i in picks])При температуре 0,5 вероятность токена «bus» составляет 0,71, а при 1,5 снижается до 0,42, и вероятность «banana» повышается с 0,00 до 0,02. При top-p 0,9 остаются «bus», «train» и «car», на которые вместе приходится 0,95 вероятности. Поэтому выбрать «stairs» и «banana» уже невозможно, а десять попыток дают разнообразную смесь из трёх оставшихся токенов. Другие параметры влияют на те же логиты: штрафы за повторы снижают оценки токенов, уже использованных ранее, а декодирование с ограничениями маскирует все токены, нарушающие грамматику или схему JSON. Так API гарантируют структурированный вывод. Спекулятивное декодирование ускоряет генерацию: небольшая черновая модель предлагает несколько токенов, которые большая модель проверяет за один проход.
Генерация текста и связанные понятия#
- Языковое моделирование: обучение модели оценивать вероятность следующего токена — задача обучения, благодаря которой возможна генерация. Генерация — это использование такой модели во время инференса.
- Модели последовательность—последовательность: модели «кодировщик—декодировщик», генерирующие выходной текст на основе отдельного входного текста, как при переводе. LLM с одним декодировщиком выполняют те же задачи, продолжая запрос.
- Диффузионные языковые модели: создают весь текстовый фрагмент, за несколько шагов подавления шума параллельно уточняя все позиции, а не генерируя по одному токену за раз.
- Преобразование текста в изображение: принимает текст и создаёт пиксели.
Качество и риски#
Сгенерированный текст остаётся беглым, даже если он неверен, поэтому галлюцинации — основной риск при работе с фактами. Генерация с дополнением за счёт поиска (RAG) снижает этот риск, помещая исходные документы в запрос. Низкая температура делает ответы более воспроизводимыми, а высокая добавляет разнообразия, но также повышает вероятность выбора маловероятного и ошибочного токена. Машинный текст также трудно распознать, поэтому ведутся исследования по маркировке контента ИИ. В статье о GPT-3 за 2020 год люди, которым нужно было отличить написанные моделью с 175 миллиардами параметров новостные статьи объёмом 200 слов от текстов людей, справились лишь в 52% случаев.










