Что такое ТОКЕН, или почему нейросеть не знает слов
Содержание
Нейросеть не читает слова — она считает числа. И мостик между миром людей и миром чисел называется токеном: маленьким кусочком текста, который модель складывает в векторы, а из векторов — в ответы. Разберёмся, почему «токен» — это не жаргон, а фундамент всего, что мы называем ИИ.
Слово — не слово
Когда вы видите в чате слово «вероятность», ваш мозг достаёт из памяти связанные образы: монетку, погоду, страховку. У нейросети такого словаря нет. У неё — таблица сопоставления фрагментов текста целым числам. Это и есть токен.
from transformers import AutoTokenizer
tokenizer = AutoTokenizer.from_pretrained("gpt2")
text = "вероятность дождя завтра"
tokens = tokenizer.encode(text)
print(tokens) # [38857, 16843, 21169, ...] — 25 токенов
print(tokenizer.decode(tokens)) # вероятность дождя завтра
Токен — это не слово, не буква и не слог. Это элемент словаря, который модель научилась выделять в тексте. Словарь современных языковых моделей содержит 50 000 – 200 000 токенов, и в нём есть слова, части слов, знаки препинания, пробелы — и даже эмодзи.
Как текст превращается в числа
Процесс называется токенизацией. Модель режет входной текст на токены по определённым правилам, каждому токену присваивает уникальный номер (ID), и дальше работает только с этими номерами.
flowchart LR
A[Текст: вероятность дождя] --> B[Токенизатор]
B --> C[38857]
B --> D[16843]
B --> E[21169]
C --> F[Эмбеддинг-вектор]
D --> F
E --> F
F --> G[Трансформер]
G --> H[Ответ]
Важно: токены — это дискретные символы, а не векторы. Эмбеддинг — это отдельная таблица, которая переводит номер токена в плотный вектор чисел (обычно 768 или 4096 измерений). Токенизатор отвечает за разрезание, эмбеддинги — за смысл, трансформер — за предсказание следующего токена.
Почему «токен», а не «слово»
Потому что слово — слишком крупная и слишком неудобная единица. Представьте словарь из миллиона слов: матрица эмбеддингов стала бы гигантской, а редкие слова получали бы «пустые» представления. Токенизация решает это — разбивает редкие и длинные слова на частые куски.
| Язык | Пример текста | Токены (GPT-2) |
|---|---|---|
| Английский | unhappiness |
un + h + appiness |
| Русский | предположительно |
18 токенов |
| Китайский | 人工智能 |
人工 + 智能 |
В английском токены часто совпадают со словами (особенно частыми), но даже там unhappiness разбивается на три токена. В русском и китайском разбиение заметнее: одно слово может стать пятью-десятью токенами. Именно поэтому стоимость запроса в API считается в токенах, а не в словах.
Стыдливость контекста
Есть забавный феномен: нейросеть «видит» только номера токенов, но не их содержание. Модель может идеально отвечать на вопросы, не понимая, что означает слово «вероятность» — она лишь выучила статистические связи между номерами. Это похоже на то, как человек может наизусть выучить текст на незнакомом языке: звучит убедительно, смысла ноль.
Поэтому и возникают эффекты «галлюцинаций»: модель умеет складывать векторы, но не обязана понимать, что конкретный вектор соответствует реальному объекту. Токены — это ярлыки, а не определения.
Сколько токенов в одном слове?
Зависит от языка и модели. Вот несколько примеров для популярных токенизаторов:
| Токенизатор | «вероятность» | «предположительно» | «artificial intelligence» |
|---|---|---|---|
| GPT-2 (BPE, 50k) | 18 токенов | 18 токенов | 3 токена |
| GPT-4 (cl100k, 100k) | 4 токена | 7 токенов | 3 токена |
| Mistral 7B (SentencePiece, 32k) | 5 токенов | 6 токенов | 3 токена |
Чем «ближе» язык к обучающим данным, тем меньше токенов на слово. Английский текст обычно даёт ~1.3 токена на слово, русский — ~1.5–2, а редкие технические термины могут разбиваться на 5–10 кусочков.
Как посчитать токены самостоятельно
Не нужно угадывать — у каждой модели есть свой токенизатор:
# Для открытых моделей (GPT-2, Mistral, Llama)
from transformers import AutoTokenizer
tokenizer = AutoTokenizer.from_pretrained("mistralai/Mistral-7B-v0.1")
print(len(tokenizer.encode("Привет, мир!"))) # 7
# Для API OpenAI
import tiktoken
enc = tiktoken.get_encoding("cl100k_base")
print(len(enc.encode("Hello, world!"))) # 4
Практический вывод: если вы пишете промпт на русском для англоязычной модели, он будет стоить дороже в токенах, чем его английский эквивалент. Вот реальные цифры для cl100k_base (GPT-4):
| Английский | Токенов | Русский | Токенов |
|---|---|---|---|
probability |
1 | вероятность |
4 |
artificial intelligence |
3 | искусственный интеллект |
11 |
Hello, world! |
4 | Привет, мир! |
7 |
Не потому что русский «хуже», а потому что токенизатор менее эффективен для незнакомых языков. Для коротких промптов разница копеечная, но для длинных контекстов — заметная.
Что дальше
Токены — это только первый уровень. Дальше эмбеддинги переводят их в векторы, трансформер строит из векторов смысл, а декодер превращает следующий предсказанный вектор обратно в токен. Но именно токенизация задаёт границы всего процесса: что модель может знать, сколько будет стоить запрос, и где начинается её «понимание».
Пока нейросети считают числа, мы можем хотя бы понимать, что именно они считают.
Комментарии
Пока нет комментариев.
Войдите, чтобы комментировать.