Что такое токены и где они проявляются
Когда мы отправляем нейросети сообщение, она не читает текст как последовательность букв. Слово для неё тоже не единица: одно слово может оказаться одним элементом, другое — собраться из нескольких. Пробел обычно тоже не отдельный элемент, а часть соседнего. Вместо этого любой текст превращается в последовательность номеров из заранее составленного списка — словаря модели. Эти номера называются токенами.
Токен — это элемент словаря модели, и таким элементом может оказаться целое слово, часть слова — её называют подсловом, — отдельный символ, знак препинания или служебная метка вроде отметки конца сообщения. Граница токена не обязана совпадать с границей слова: в одном словаре слово оказывается одним токеном, в другом собирается из нескольких — смотря как часто оно встречалось в текстах, по которым этот словарь строили.
Токенизация происходит до того, как текст попадает в нейросеть. Это отдельный детерминированный алгоритм, который режет текст на куски по правилам словаря. Словарь составляют до обучения модели, и у готовой модели он обычно остаётся неизменным — хотя при дообучении в него могут добавлять специальные служебные метки.
На вход модели приходит не текст, а последовательность номеров токенов. На выходе модель выдаёт распределение вероятностей над всем словарём: для каждого элемента словаря она определяет, насколько вероятно, что следующим будет именно он. Ответ порождается по одному токену: выбранный токен добавляется ко входу, и цикл повторяется. Поэтому длинный ответ требует больше времени, чем короткий. Как именно выбирается токен из распределения, подробно разобрано в материале Почему нейросеть отвечает по-разному на один вопрос.
Где пользователь сталкивается с токенами:
- Тарифы и квоты. При оплате по расходу цена, как правило, назначена за число токенов, а не за запрос. Предел длины сообщения тоже выражен в токенах.
- Окно контекста. У каждой модели есть предел, сколько токенов она может обработать за один раз. Если входной текст вместе с историей диалога не помещается в окно, дальнейшее решает не сама модель, а программа, через которую к ней обращаются: она либо отклонит запрос с ошибкой, либо тихо вытеснит старые сообщения, либо тихо обрежет начало запроса — что именно произойдёт, зависит от реализации.
- Обрыв ответа. Если модель генерирует длинный текст, она может остановиться на середине слова. Причина — предел длины ответа в токенах. Обрыв отличается от естественного конца: интерфейс показывает причину остановки.
Токен здесь — не токен авторизации и не криптовалютный токен. Это единица измерения текста для конкретной модели.
Как работает токенизатор: от текста к номерам
Токенизатор — это не нейросеть. Это отдельная программа, которая превращает текст в последовательность номеров из словаря. Она работает по строгим правилам: буквы после неё модель уже не видит, а на вход поступают только номера токенов.
Словарь строится до обучения модели. Самый распространённый способ — слияние частых пар. Начинают с отдельных байтов или символов и раз за разом объединяют самую частую соседнюю пару в новый элемент. Есть и другие способы: с поправкой на частоты частей пары или с прореживанием большого набора кандидатов. Но итог один: частое слово получает один токен, редкое собирается из нескольких подслов.
Пробел обычно входит в состав токена — как правило, приклеен к началу следующего слова. Регистр тоже важен: одно и то же слово с заглавной буквы, со строчной, в начале строки и после пробела может быть разными токенами и резаться на разное число частей.
Пример разбиения — условный, потому что у разных моделей разные словари:
- “hello” → [“hello”] (одно слово — один токен)
- “Hello” → [“Hello”] (заглавная буква делает токен другим)
- “привет” → [“при”, “вет”] (редкое слово режется на подслова)
- “Привет” → [“П”, “ри”, “вет”] (заглавная буква меняет разбиение: подслов стало больше)
Если словарь начинается с байтов, представим любой текст. Нет “неизвестных слов”, есть длинное разбиение. Граница токена при этом может пройти внутри символа: одна буква бывает записана несколькими ячейками — байтами, как объяснено в материале Почему текст превращается в кракозябры, и граница способна пройти между ними. Поэтому при потоковой выдаче и при обрезке текста по токенам на стыке возможен битый символ. Это не «не та кодировка», и перекодированием он не лечится: символ просто пришёл не целиком. При потоковой выдаче его остаток, как правило, приходит со следующим токеном, а при обрезке неполный хвост остаётся только отбросить.
Почему число токенов не выводится из числа слов
Число токенов зависит от токенизатора, с которым работает модель, а не от названия поставщика. Модели одного семейства могут использовать один токенизатор и давать одинаковый счёт. Но новое поколение у того же поставщика может прийти с другим токенизатором, и тот же текст начнёт занимать заметно больше или заметно меньше токенов.
Главные факторы, влияющие на число токенов:
-
Язык текста. Русский текст расходует больше токенов, чем английский того же смысла, у словарей, построенных на корпусах с преобладанием английского. Причины:
- Доля языка в корпусе словаря
- Богатая морфология: словоформы реже попадают в словарь целиком
- Но это свойство таких словарей, а не закон: у токенизатора, построенного на корпусе с большой долей русского, разрыв мал
-
Тип текста. JSON расходует больше токенов на тот же объём данных, чем компактная запись. Причины:
- Структурные знаки и имена полей повторяются в каждой записи
- Отдельно от повтора, и это касается любой структурной записи, не только JSON: знаки, цифры и короткие имена — короткие токены, каждый покрывает меньше символов, чем частое слово. Поэтому структурный текст, как правило, даёт больше токенов на тот же объём символов, чем связная проза. Именно это, а не повтор структуры, ломает коэффициент, подобранный на прозе
- Мелко режутся редкие идентификаторы, хеши, случайные строки и длинные числа. Но частые сочетания знаков и серии пробелов сами бывают отдельными токенами и мелко не режутся: это оговорка к предыдущему пункту, а не ещё одна причина
Число токенов нельзя вычислить по числу слов или символов с помощью фиксированного коэффициента. Коэффициент зависит от:
- Конкретного токенизатора
- Языка текста
- Типа текста (проза, код, JSON, таблицы)
- Частотности слов в словаре
Что меряется в токенах и как это проявляется
В токенах выражены основные ограничения работы с моделью:
-
Размер контекстного окна. Это предел, сколько токенов модель может обработать за один раз. Устроен он не у всех одинаково: у части поставщиков предел входа и предел выхода заданы отдельно, и смотреть это нужно в описании своей модели. Там, где окно общее, в него часто входят:
- Системная инструкция
- Вся пересылаемая история диалога
- Вложенные документы
- Описания инструментов
- Сам порождаемый ответ
Так окно устроено часто, но не везде: у части поставщиков предел входа и предел выхода заданы отдельно. Как у вас — смотрите в описании своей модели.
-
Предел длины ответа. Это максимальное число токенов, которое модель может сгенерировать в одном ответе.
-
Тарификация. При оплате по расходу цена назначается за определённое число токенов.
Как складывается сам счёт, разобрано в материале Откуда берётся счёт за искусственный интеллект, а окупается ли длинный контекст — в материале Длинный контекст: когда он экономит, а когда просто дорожает.
Но не все ограничения выражены в токенах:
- Квоты задаются ещё и числом запросов за промежуток времени
- У части подписочных продуктов предел показан числом сообщений
- Часть инструментов тарифицируется за вызов
- Картинки, звук и файлы переводятся в токены по своим правилам
Служебные токены — метки ролей, начала и конца сообщения — занимают место в окне, но оплачиваются не у всех поставщиков. “Занимает место” и “оплачивается” — два разных вопроса.
У моделей с режимом размышления токены рассуждения читателю не показываются, но:
- Оплачиваются как выходные
- Входят в предел ответа
- Занимают окно во время генерации
- Могут оставаться в истории или отбрасываться после хода — зависит от поставщика
Это объясняет, почему ответ может быть пустым или оборванным при коротком видимом тексте: предел ответа целиком или почти целиком уходит на рассуждение, которого читатель не видит.
Два предела — два разных отказа
Переполнение окна входом и предел длины ответа — два разных предела с разным поведением.
Переполнение окна входом проявляется тремя способами:
- Отказ в запросе с ошибкой — чаще в облачном интерфейсе
- Тихое вытеснение старых сообщений — чаще в чат-продукте (“модель забыла начало разговора”)
- Тихое обрезание начала промпта
Как поступает ваш продукт, проверьте в его описании.
Выдаёт себя переполнение по-разному. Отказ виден сразу: это ошибка запроса. Тихое вытеснение и тихое обрезание в ответе никак не отмечены, а под обрезание может попасть и системная инструкция. Ловят их так: считают токены запроса до отправки и сверяют входной расход из ответа с ожидаемым. Если расход меньше отправленного, начало срезано.
Предел длины ответа обрывает порождение на границе токена. Это может быть:
- Середина слова
- Середина предложения
- Незакрытый JSON
Модель не “закругляется” к пределу, потому что параметр предела обычно не передаётся в саму модель. Обрыв отличают от нормального завершения по причине остановки в ответе интерфейса. Причин может быть несколько:
- Естественный конец
- Предел ответа
- Стоп-последовательность
- Вызов инструмента
- Отказ или фильтр
- Исчерпание окна
Особый случай — когда вход поместился, но занял окно почти целиком, и ответ оборвался раньше своего предела. Причина в окне, лечится сокращением входа, а не подъёмом предела ответа.
Как узнать число токенов и почему это важно
Есть три способа узнать число токенов, и они дают разную точность:
-
Локальная библиотека — оценивает число токенов текста, но не учитывает:
- Метки ролей
- Описания инструментов
- Служебную инструкцию
- Картинки и файлы
-
Операция подсчёта у поставщика — оценивает запрос целиком, но это:
- Сетевой запрос
- Собственная квота вызовов
-
Фактическое число — приходит в каждом ответе отдельным полем расхода
Публичный локальный токенизатор есть не у каждого поставщика. Где-то доступна библиотека, где-то только сетевая операция подсчёта, где-то ни того ни другого.
Почему важен точный подсчёт:
- Чтобы не переполнить окно
- Чтобы не обрезать ответ
- Чтобы правильно спланировать бюджет
- Чтобы сравнить модели по эффективности
С советом считать словами из материала Откуда берётся счёт за искусственный интеллект эта позиция не спорит: для бытовой прикидки вдали от пределов слов хватает, а у предела окна и в расчёте бюджета — нет, там считают в токенах.
Тупик: почему коэффициент из чужой заметки не работает
Первым делом бюджет и пределы прикидывают по словам или символам с одним коэффициентом из чужой заметки. Такой подход не работает, потому что:
-
Коэффициент подобран под:
- Конкретный токенизатор
- Конкретный язык
- Конкретный тип текста
-
На своём материале расчёт расходится с фактом:
- Русский текст даёт больше токенов
- JSON даёт больше токенов
- Другая модель работает с другим токенизатором и даёт другой счёт
Не помогает именно чужой и единый коэффициент. Вместо числа нужно использовать модель расчёта:
- Измерить отношение токенов к символам на своём однородном потоке
- Брать данные из фактического расхода в ответах
- Добавлять запас на вариативность
Позиция редакции
Объём текста в системе с моделью измеряется в токенах, а не в словах и символах. Это касается:
- Пределов контекстного окна
- Порогов обрезки
- Размеров фрагментов
- Расхода на запрос
Единицей бюджета продукта остаётся задача. Для точного планирования нужно:
- Оценивать токены до отправки средствами той модели, которая будет вызвана
- Сверять расчёт с фактическим расходом из ответа
- Пересчитывать при смене модели или токенизатора
Модель работает с номерами токенов, а не с буквами. Это одна из причин, по которым задачи, требующие работы на уровне отдельных символов, даются ей сложнее. Например, арифметика над длинными числами вызывает затруднения.
Позиция неверна в случаях, когда:
- До пределов заведомо далеко (разовые запросы в чате, прототип на коротких текстах)
- Используется тариф с фиксированной платой без учёта объёма
- Поставщик не предоставляет токенизатора или операции подсчёта (тогда рабочий способ — собственный измеренный коэффициент с запасом)