Webrium
Подписаться

Токены в нейросети: в чём модель считает текст

Токены — это не слова или символы, а элементы словаря модели, от которых зависят пределы контекста и стоимость запроса

Текст разделяется на токены перед обработкой нейросетьюТекстТокены

Что такое токены и где они проявляются

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

Токен — это элемент словаря модели, и таким элементом может оказаться целое слово, часть слова — её называют подсловом, — отдельный символ, знак препинания или служебная метка вроде отметки конца сообщения. Граница токена не обязана совпадать с границей слова: в одном словаре слово оказывается одним токеном, в другом собирается из нескольких — смотря как часто оно встречалось в текстах, по которым этот словарь строили.

Токенизация происходит до того, как текст попадает в нейросеть. Это отдельный детерминированный алгоритм, который режет текст на куски по правилам словаря. Словарь составляют до обучения модели, и у готовой модели он обычно остаётся неизменным — хотя при дообучении в него могут добавлять специальные служебные метки.

На вход модели приходит не текст, а последовательность номеров токенов. На выходе модель выдаёт распределение вероятностей над всем словарём: для каждого элемента словаря она определяет, насколько вероятно, что следующим будет именно он. Ответ порождается по одному токену: выбранный токен добавляется ко входу, и цикл повторяется. Поэтому длинный ответ требует больше времени, чем короткий. Как именно выбирается токен из распределения, подробно разобрано в материале Почему нейросеть отвечает по-разному на один вопрос.

Где пользователь сталкивается с токенами:

  1. Тарифы и квоты. При оплате по расходу цена, как правило, назначена за число токенов, а не за запрос. Предел длины сообщения тоже выражен в токенах.
  2. Окно контекста. У каждой модели есть предел, сколько токенов она может обработать за один раз. Если входной текст вместе с историей диалога не помещается в окно, дальнейшее решает не сама модель, а программа, через которую к ней обращаются: она либо отклонит запрос с ошибкой, либо тихо вытеснит старые сообщения, либо тихо обрежет начало запроса — что именно произойдёт, зависит от реализации.
  3. Обрыв ответа. Если модель генерирует длинный текст, она может остановиться на середине слова. Причина — предел длины ответа в токенах. Обрыв отличается от естественного конца: интерфейс показывает причину остановки.

Токен здесь — не токен авторизации и не криптовалютный токен. Это единица измерения текста для конкретной модели.

Как работает токенизатор: от текста к номерам

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

Словарь строится до обучения модели. Самый распространённый способ — слияние частых пар. Начинают с отдельных байтов или символов и раз за разом объединяют самую частую соседнюю пару в новый элемент. Есть и другие способы: с поправкой на частоты частей пары или с прореживанием большого набора кандидатов. Но итог один: частое слово получает один токен, редкое собирается из нескольких подслов.

Пробел обычно входит в состав токена — как правило, приклеен к началу следующего слова. Регистр тоже важен: одно и то же слово с заглавной буквы, со строчной, в начале строки и после пробела может быть разными токенами и резаться на разное число частей.

Пример разбиения — условный, потому что у разных моделей разные словари:

  • “hello” → [“hello”] (одно слово — один токен)
  • “Hello” → [“Hello”] (заглавная буква делает токен другим)
  • “привет” → [“при”, “вет”] (редкое слово режется на подслова)
  • “Привет” → [“П”, “ри”, “вет”] (заглавная буква меняет разбиение: подслов стало больше)

Если словарь начинается с байтов, представим любой текст. Нет “неизвестных слов”, есть длинное разбиение. Граница токена при этом может пройти внутри символа: одна буква бывает записана несколькими ячейками — байтами, как объяснено в материале Почему текст превращается в кракозябры, и граница способна пройти между ними. Поэтому при потоковой выдаче и при обрезке текста по токенам на стыке возможен битый символ. Это не «не та кодировка», и перекодированием он не лечится: символ просто пришёл не целиком. При потоковой выдаче его остаток, как правило, приходит со следующим токеном, а при обрезке неполный хвост остаётся только отбросить.

Почему число токенов не выводится из числа слов

Число токенов зависит от токенизатора, с которым работает модель, а не от названия поставщика. Модели одного семейства могут использовать один токенизатор и давать одинаковый счёт. Но новое поколение у того же поставщика может прийти с другим токенизатором, и тот же текст начнёт занимать заметно больше или заметно меньше токенов.

Главные факторы, влияющие на число токенов:

  1. Язык текста. Русский текст расходует больше токенов, чем английский того же смысла, у словарей, построенных на корпусах с преобладанием английского. Причины:

    • Доля языка в корпусе словаря
    • Богатая морфология: словоформы реже попадают в словарь целиком
    • Но это свойство таких словарей, а не закон: у токенизатора, построенного на корпусе с большой долей русского, разрыв мал
  2. Тип текста. JSON расходует больше токенов на тот же объём данных, чем компактная запись. Причины:

    • Структурные знаки и имена полей повторяются в каждой записи
    • Отдельно от повтора, и это касается любой структурной записи, не только JSON: знаки, цифры и короткие имена — короткие токены, каждый покрывает меньше символов, чем частое слово. Поэтому структурный текст, как правило, даёт больше токенов на тот же объём символов, чем связная проза. Именно это, а не повтор структуры, ломает коэффициент, подобранный на прозе
    • Мелко режутся редкие идентификаторы, хеши, случайные строки и длинные числа. Но частые сочетания знаков и серии пробелов сами бывают отдельными токенами и мелко не режутся: это оговорка к предыдущему пункту, а не ещё одна причина

Число токенов нельзя вычислить по числу слов или символов с помощью фиксированного коэффициента. Коэффициент зависит от:

  • Конкретного токенизатора
  • Языка текста
  • Типа текста (проза, код, JSON, таблицы)
  • Частотности слов в словаре

Что меряется в токенах и как это проявляется

В токенах выражены основные ограничения работы с моделью:

  1. Размер контекстного окна. Это предел, сколько токенов модель может обработать за один раз. Устроен он не у всех одинаково: у части поставщиков предел входа и предел выхода заданы отдельно, и смотреть это нужно в описании своей модели. Там, где окно общее, в него часто входят:

    • Системная инструкция
    • Вся пересылаемая история диалога
    • Вложенные документы
    • Описания инструментов
    • Сам порождаемый ответ

    Так окно устроено часто, но не везде: у части поставщиков предел входа и предел выхода заданы отдельно. Как у вас — смотрите в описании своей модели.

  2. Предел длины ответа. Это максимальное число токенов, которое модель может сгенерировать в одном ответе.

  3. Тарификация. При оплате по расходу цена назначается за определённое число токенов.

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

Но не все ограничения выражены в токенах:

  • Квоты задаются ещё и числом запросов за промежуток времени
  • У части подписочных продуктов предел показан числом сообщений
  • Часть инструментов тарифицируется за вызов
  • Картинки, звук и файлы переводятся в токены по своим правилам

Служебные токены — метки ролей, начала и конца сообщения — занимают место в окне, но оплачиваются не у всех поставщиков. “Занимает место” и “оплачивается” — два разных вопроса.

У моделей с режимом размышления токены рассуждения читателю не показываются, но:

  • Оплачиваются как выходные
  • Входят в предел ответа
  • Занимают окно во время генерации
  • Могут оставаться в истории или отбрасываться после хода — зависит от поставщика

Это объясняет, почему ответ может быть пустым или оборванным при коротком видимом тексте: предел ответа целиком или почти целиком уходит на рассуждение, которого читатель не видит.

Два предела — два разных отказа

Переполнение окна входом и предел длины ответа — два разных предела с разным поведением.

Переполнение окна входом проявляется тремя способами:

  1. Отказ в запросе с ошибкой — чаще в облачном интерфейсе
  2. Тихое вытеснение старых сообщений — чаще в чат-продукте (“модель забыла начало разговора”)
  3. Тихое обрезание начала промпта

Как поступает ваш продукт, проверьте в его описании.

Выдаёт себя переполнение по-разному. Отказ виден сразу: это ошибка запроса. Тихое вытеснение и тихое обрезание в ответе никак не отмечены, а под обрезание может попасть и системная инструкция. Ловят их так: считают токены запроса до отправки и сверяют входной расход из ответа с ожидаемым. Если расход меньше отправленного, начало срезано.

Предел длины ответа обрывает порождение на границе токена. Это может быть:

  • Середина слова
  • Середина предложения
  • Незакрытый JSON

Модель не “закругляется” к пределу, потому что параметр предела обычно не передаётся в саму модель. Обрыв отличают от нормального завершения по причине остановки в ответе интерфейса. Причин может быть несколько:

  • Естественный конец
  • Предел ответа
  • Стоп-последовательность
  • Вызов инструмента
  • Отказ или фильтр
  • Исчерпание окна

Особый случай — когда вход поместился, но занял окно почти целиком, и ответ оборвался раньше своего предела. Причина в окне, лечится сокращением входа, а не подъёмом предела ответа.

Как узнать число токенов и почему это важно

Есть три способа узнать число токенов, и они дают разную точность:

  1. Локальная библиотека — оценивает число токенов текста, но не учитывает:

    • Метки ролей
    • Описания инструментов
    • Служебную инструкцию
    • Картинки и файлы
  2. Операция подсчёта у поставщика — оценивает запрос целиком, но это:

    • Сетевой запрос
    • Собственная квота вызовов
  3. Фактическое число — приходит в каждом ответе отдельным полем расхода

Публичный локальный токенизатор есть не у каждого поставщика. Где-то доступна библиотека, где-то только сетевая операция подсчёта, где-то ни того ни другого.

Почему важен точный подсчёт:

  • Чтобы не переполнить окно
  • Чтобы не обрезать ответ
  • Чтобы правильно спланировать бюджет
  • Чтобы сравнить модели по эффективности

С советом считать словами из материала Откуда берётся счёт за искусственный интеллект эта позиция не спорит: для бытовой прикидки вдали от пределов слов хватает, а у предела окна и в расчёте бюджета — нет, там считают в токенах.

Тупик: почему коэффициент из чужой заметки не работает

Первым делом бюджет и пределы прикидывают по словам или символам с одним коэффициентом из чужой заметки. Такой подход не работает, потому что:

  1. Коэффициент подобран под:

    • Конкретный токенизатор
    • Конкретный язык
    • Конкретный тип текста
  2. На своём материале расчёт расходится с фактом:

    • Русский текст даёт больше токенов
    • JSON даёт больше токенов
    • Другая модель работает с другим токенизатором и даёт другой счёт

Не помогает именно чужой и единый коэффициент. Вместо числа нужно использовать модель расчёта:

  1. Измерить отношение токенов к символам на своём однородном потоке
  2. Брать данные из фактического расхода в ответах
  3. Добавлять запас на вариативность

Позиция редакции

Объём текста в системе с моделью измеряется в токенах, а не в словах и символах. Это касается:

  • Пределов контекстного окна
  • Порогов обрезки
  • Размеров фрагментов
  • Расхода на запрос

Единицей бюджета продукта остаётся задача. Для точного планирования нужно:

  1. Оценивать токены до отправки средствами той модели, которая будет вызвана
  2. Сверять расчёт с фактическим расходом из ответа
  3. Пересчитывать при смене модели или токенизатора

Модель работает с номерами токенов, а не с буквами. Это одна из причин, по которым задачи, требующие работы на уровне отдельных символов, даются ей сложнее. Например, арифметика над длинными числами вызывает затруднения.

Позиция неверна в случаях, когда:

  • До пределов заведомо далеко (разовые запросы в чате, прототип на коротких текстах)
  • Используется тариф с фиксированной платой без учёта объёма
  • Поставщик не предоставляет токенизатора или операции подсчёта (тогда рабочий способ — собственный измеренный коэффициент с запасом)

С чем это связано

Метка над заголовком говорит, зачем туда идти: продолжить тему, перейти к практике или увидеть возражение.

Цепочка генерации нейросети: от одного запроса к разным ответам через последовательный выбор токеновИсходный запросУникальный ответ
Углубление

Почему нейросеть отвечает по-разному на один вопрос

Как случайность в выборе токенов, параметры генерации и архитектура модели делают каждый ответ нейросети уникальным — и почему даже temperature 0 не гарантирует повторяемость.

Семь ячеек-кандидатов, одна выделена: каждое новое слово ответа машина заново выбирает из всей таблицы чиселвся таблица чиселновое слово
Просто

Откуда берётся счёт за искусственный интеллект

Как нейросеть формирует стоимость запроса и почему каждый ваш вопрос влияет на итоговый счёт.

Из нескольких размеров корпуса только один укладывается в бюджет и окно контекста без переплатыразмеры корпусав бюджет и окно
Усиление

Длинный контекст: когда он экономит, а когда просто дорожает

Когда длинный контекст оправдан, а когда — лишние траты: разбираем реальную стоимость токенов и кэша в каждом запросе.

Текст цел: числа те же, а таблица соответствия другаята же записьдругая таблица
Предыстория

Почему текст превращается в кракозябры

Если вы видите вместо текста абракадабру — дело не в ошибке, а в несовпадении кодировок: данные записаны одной таблицей, а читаются другой. Как вернуть текст без потерь.

Письмо по вторникам

Один разбор недели и короткий список того, что изменилось. Без дайджестов на сорок ссылок.

Начните вводить — материалы появятся здесь.

↑↓ выбрать · Enter открыть · Esc закрыть