Как компьютер представляет слова (токены)

ChatGPT не читает буквы, как ты читаешь эту строку. Он работает с пронумерованными кусочками текста — токенами. Разберёмся, что это и зачем.

Главная мысль урока: модель не видит ни букв, ни слов в привычном смысле. Текст сначала режут на кусочки-токены, а каждому токену выдают номер. Дальше внутри ИИ движутся только числа — слов там уже нет.

Зачем тебе это знать

Представь, что ты пишешь другу в мессенджере «прив», и телефон сам предлагает «привет». Или ищешь песню по паре слов, а сервис достаёт нужный трек. Везде здесь компьютер как-то работает с текстом. Но есть загвоздка: компьютер вообще не умеет работать с текстом. Он умеет только с числами.

Любая буква, эмодзи или пробел внутри устройства — это число. Картинка — это числа. Звук — числа. И когда мы хотим, чтобы ИИ разобрался с фразой, первым делом нужно превратить эту фразу в числа так, чтобы было удобно. Способ, которым это делают современные языковые модели, называется разбиением на токены.

К концу урока ты будешь понимать, что происходит с твоим сообщением в первую миллисекунду после того, как ты нажал «Отправить» в чате с ИИ: как текст рубится на кусочки и почему в окошке «осталось N токенов» считают именно их, а не буквы или слова.

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

Токен — кусочек текста (слово или его часть), которым модель оперирует вместо целых предложений.

В уроке про то, что значит «модель учится на данных» мы говорили, что модель — это система, которая после обучения делает предсказания. Языковая модель предсказывает следующий кусочек текста. Но чтобы что-то предсказывать, ей нужно сначала договориться, из каких «кирпичиков» вообще состоит текст. Вот эти кирпичики и есть токены.

Метафора: текст как конструктор LEGO

Вспомни конструктор LEGO. У тебя нет детальки «целый космический корабль» — есть набор стандартных кирпичиков, из которых можно собрать что угодно: корабль, дом, машину. Если нужна новая модель, ты не изобретаешь новые детали, а по-новому соединяешь те же самые кубики.

Текст для модели устроен так же. Есть фиксированный набор кусочков — словарь токенов (обычно несколько десятков тысяч штук). Любое предложение, даже которое модель видит впервые, собирается из этих готовых кусочков. Слово «привет» может быть одним токеном. А редкое слово «гиппопотамыч» модель соберёт из нескольких: гиппо + пота + мыч, как корабль из кубиков.

Почему не резать просто по словам? Тогда словарь пришлось бы делать бесконечным: люди постоянно придумывают новые слова, опечатываются, пишут «прееееевет» с десятью буквами «е». Подумай про чат любой онлайн-игры или комменты под роликом — там и сленг, и ники, и слова, которых нет ни в одном словаре. Если каждое такое слово требовало бы своей детальки, набор кубиков разросся бы до бесконечности и всё равно не покрыл бы завтрашние мемы. А по отдельным буквам резать слишком мелко — фразы становятся очень длинными, и модели тяжело уловить смысл, как тебе тяжело понять предложение, если читать его строго по одной букве в секунду. Токены — золотая середина: частые слова остаются целыми, а редкие и странные разбираются на знакомые части.

И ещё один плюс такого подхода: даже совсем новое для модели слово не ставит её в тупик. «Гиппопотамыч» она никогда не встречала, но кусочки гиппо, пота, мыч ей знакомы по другим словам. Это как собрать незнакомую фигурку из привычных деталей LEGO — инструкции нет, но детали те же, и что-то осмысленное собрать получится.

Способ резать текстПроблема
По буквамСлишком мелко, фразы длинные, смысл размазан
По целым словамСловарь бесконечный, опечатки ломают всё
По токенам (кусочкам)Золотая середина — этим и пользуются

А зачем нужны номера

Допустим, текст порезали на кусочки. Но кусочки — это всё ещё буквы, а модель умеет только в числа. Поэтому каждому токену из словаря заранее выдают порядковый номер, как место в раздевалке: токену кошка — номер 4021, токену пьёт — номер 8530, и так далее.

Дальше происходит самое важное для понимания: внутри модели нет ни слов, ни букв. Там бегают только эти номера. Модель смотрит на последовательность чисел вроде [4021, 8530, ...] и предсказывает, какое число должно идти следующим. И только в самом конце номера переводят обратно в кусочки текста, склеивают — и ты видишь читаемый ответ.

Сравни это с раздевалкой в спортзале. Ты сдаёшь куртку, тебе дают номерок — скажем, 17. Гардеробщик не запоминает, что у тебя синяя куртка с капюшоном; он просто вешает её на крючок 17. Когда ты вернёшься с номерком 17, он отдаст ровно твою куртку. Номер сам по себе ничего не говорит о куртке — это просто способ её быстро найти. Точно так же номер токена ничего не говорит о смысле слова, он лишь указывает, где этот кусочек лежит в словаре. Эта мысль нам ещё пригодится в разделе про подводные камни.

Возвращаемся к нашему сквозному примеру: «Кошка пьёт ...»

Через весь курс с нами идёт фраза, которую модель должна продолжить: «Кошка пьёт ...». Раньше мы говорили про неё на пальцах. Теперь посмотрим, что с ней реально происходит на входе в модель.

Шаг за шагом:

  1. Режем на токены. Фраза «Кошка пьёт» превращается в кусочки. Допустим, получилось три токена: Кош, ка, пьёт. (Где именно пройдут границы — решает обученный разбивщик; нам сейчас важна сама идея.)
  2. Заменяем на номера. Каждый кусочек ищется в словаре и заменяется своим номером: например Кош → 712, ка → 19, пьёт → 8530.
  3. Модель работает с числами. На вход уходит последовательность [712, 19, 8530]. Модель предсказывает следующий номер — скажем, 4115.
  4. Переводим обратно. Номер 4115 в словаре — это токен молоко. Его дописывают к фразе, и ты видишь: «Кошка пьёт молоко».

Заметь главное: слово «молоко» модель не «придумала из головы» и не «поняла». Она предсказала номер следующего токена, опираясь на то, что в миллионах текстов после «кошка пьёт» чаще всего шло именно «молоко». Подробно, как именно она это предсказывает, мы разберём в следующих уроках. Сейчас фиксируем только: на входе и выходе — текст, а внутри — числа-номера токенов.

Кстати, вот почему ответ ИИ часто «печатается» по кусочкам, слово за слово, а не появляется целиком. Модель и впрямь выдаёт по одному токену за раз: предсказала номер, перевела в кусочек, показала тебе, дописала его к фразе и снова предсказывает следующий. Та самая «печатная машинка», которую ты видишь в чате, — это и есть токены, вылетающие один за другим. Так что в следующий раз, наблюдая, как ответ набирается на глазах, ты будешь точно знать: это не для красоты, это реальный ритм работы модели.

А что с кошками и собаками

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

Посмотрим на разбиение «вживую»

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

// Игрушечный словарь: частые слова знаем целиком,
// у каждого свой номер.
const vocab = {
  "кошка": 4021,
  "пьёт": 8530,
  "молоко": 4115,
  " ": 1 // пробел тоже токен!
};

// Режем текст: известные слова берём целиком,
// незнакомые — по 2 буквы.
function tokenize(text) {
  const words = text.split(/( )/); // сохраняем пробелы
  const tokens = [];
  for (const w of words) {
    if (w === "") continue;
    if (vocab[w] !== undefined) {
      tokens.push(w);
    } else {
      for (let i = 0; i < w.length; i += 2) {
        tokens.push(w.slice(i, i + 2));
      }
    }
  }
  return tokens;
}

const frase = "кошка пьёт сок";
const tokens = tokenize(frase);
console.log("токены:", tokens);
console.log("сколько токенов:", tokens.length);

// Меняем токены на номера (незнакомым дадим 0)
const ids = tokens.map(t => vocab[t] === undefined ? 0 : vocab[t]);
console.log("номера:", ids);

Вывод:

токены: [ 'кошка', ' ', 'пьёт', ' ', 'со', 'к' ]
сколько токенов: 6
номера: [ 4021, 1, 8530, 1, 0, 0 ]

Разберём, что произошло. Слова кошка и пьёт модель знает целиком — они стали одним токеном каждое и получили свои номера. Пробел — тоже отдельный токен (это часто удивляет новичков!). А вот слово «сок» нашему игрушечному словарю незнакомо, поэтому оно разрезалось на со и к, и обоим достался номер 0 («незнакомый»). Видишь: фраза из трёх слов превратилась в шесть токенов. Буквы исчезли — остались номера.

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

Частые ошибки и подводные камни

Вокруг токенов крутится много путаницы. Разберём самое частое, чтобы ты не попался.

1. «Один токен — это одно слово»

Самое популярное заблуждение. Иногда токен — это целое слово, иногда — его часть, иногда — всего лишь пробел или знак препинания. Длинное или редкое слово легко разваливается на 3–4 токена. Грубое житейское правило для русского текста: токенов обычно больше, чем слов. Поэтому, если в ИИ-сервисе написано «лимит 1000 токенов», это не «1000 слов» — реально влезет заметно меньше.

Этот же предел объясняет, почему в очень долгой переписке ИИ будто бы «забывает», о чём вы говорили в начале. У модели есть окно — сколько токенов она может держать перед глазами за раз. Когда диалог разрастается и токенов набирается слишком много, самые старые перестают помещаться в окно и выпадают из поля зрения. Это не склероз и не каприз — просто старые токены физически не влезли. Знание про токены помогает это предсказывать: если разговор стал длинным, важное иногда стоит повторить.

2. Путать токены с буквами

Токен — это не буква. Из-за этого модели бывает трудно с задачами, где важны именно буквы: например, посчитать, сколько раз буква «р» встречается в слове, или написать слово задом наперёд. Модель видит слово как пару готовых кусочков, а не как цепочку отдельных букв, поэтому «по буквам» ей думать неудобно. Если ИИ ошибся в подсчёте букв — часто причина именно в этом.

3. Думать, что номер токена несёт смысл

Номер 4021 у токена кошка — это просто адрес в словаре, как номер дома на улице. Он не означает, что кошка «больше» собаки с номером 318 или «похожа» на токен 4022. Номер нужен только чтобы найти кусочек в таблице. Смысл слова прячется совсем в другом месте — мы доберёмся до него в уроке про эмбеддинги.

4. Считать, что у всех моделей токены одинаковые

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

5. Забывать про пробелы и регистр

Пробел, перенос строки, заглавная буква — всё это часть токенов. Слова кошка и Кошка вполне могут оказаться разными токенами с разными номерами. Поэтому лишние пробелы и странное оформление в запросе реально меняют то, что увидит модель.

Мини-практика: посчитай токены сам

Теперь твоя очередь. Возьми за основу игрушечный разбивщик выше и поэкспериментируй:

  1. Добавь в vocab слово молоко с номером 4115 (оно там уже есть) и проверь фразу «кошка пьёт молоко». Сколько вышло токенов? Совпало с числом слов?
  2. Прогони фразу «Кошка пьёт молоко» с заглавной «К». Что изменилось и почему? (Подсказка: загляни в пункт про регистр.)
  3. Возьми любое своё длинное или редкое слово — например, имя любимого персонажа из игры — и посмотри, на сколько кусочков его разрежет разбивщик.
  4. Прикинь на глаз: возьми одно своё сообщение в мессенджере и грубо посчитай, токенов в нём окажется больше или меньше, чем слов. Почему?

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

Итоги

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

  • Токен — это кусочек текста: целое слово, его часть, пробел или знак. Модель оперирует токенами, а не буквами и не предложениями.
  • Компьютер умеет работать только с числами, поэтому каждому токену выдают номер. Внутри модели бегают только эти номера — слов и букв там нет.
  • Текст проходит путь: фраза → кусочки-токены → номера → модель → номера → склейка обратно в текст. Наша «Кошка пьёт ...» именно так превращается в «Кошка пьёт молоко».
  • Любые данные на входе ИИ становятся числами: текст — номерами токенов, картинка с кошкой или собакой — числами пикселей. Дальше модели всё равно, что перед ней.
  • Токенов обычно больше, чем слов; номер токена — это адрес, а не смысл; у каждой модели свой словарь.

Теперь у тебя есть фундамент: ты знаешь, в каком виде текст вообще попадает в модель. Но мы пока обошли главную загадку. Номер 4021 — это просто адрес, в нём нет ни капли смысла. Откуда же модель «знает», что кошка ближе к собаке, чем к табуретке? В следующем уроке мы разберём эмбеддинги — хитрый способ превратить номер токена в точку в пространстве смыслов, где похожие слова и правда лежат рядом. Там наша «Кошка пьёт ...» заиграет новыми красками.

Проверьте себя
1. Что такое токен?
AОтдельная буква алфавита
BКусочек текста — слово или его часть, — которым оперирует модель
CЦелое предложение
DПароль для входа в ИИ-сервис
2. Почему модель работает с номерами токенов, а не с самими буквами?
AТак быстрее печатать ответ
BБуквы занимают слишком много места на диске
CКомпьютер умеет работать только с числами, поэтому текст переводят в номера
DНомера красивее выглядят в логах
3. Сколько токенов обычно получается из русской фразы по сравнению с числом слов?
AВсегда ровно столько же, сколько слов
BОбычно больше, чем слов
CВсегда ровно вдвое меньше слов
DЭто никак не связано с текстом
4. Что означает номер токена, например 4021 у слова «кошка»?
AЧто кошка «важнее» слов с меньшими номерами
BЭто просто адрес кусочка в словаре, смысла в самом номере нет
CСколько раз слово встречалось в интернете
DНасколько кошка похожа на токен 4022
5. Почему модели бывает трудно посчитать, сколько раз буква «р» встречается в слове?
AМодель не умеет считать вообще
BМодель видит слово как готовые кусочки-токены, а не как цепочку отдельных букв
CВ русском языке нет буквы «р» в токенах
DЭто слишком сложная математика для любого компьютера
6. В нашем сквозном примере фраза «Кошка пьёт» проходит путь до ответа «молоко». В каком виде модель видит вход?
AКак читаемые буквы, точно как их видишь ты
BКак последовательность номеров токенов, например [712, 19, 8530]
CКак одну большую картинку с текстом
DКак звук произнесённой фразы