Menu

Токены и контекстное окно: как ИИ читает текст

ИИ-модели читают текст токенами, небольшими кусочками слов, и могут удерживать лишь ограниченное их число за раз: это контекстное окно. Как устроено и то и другое и что делать, когда чат становится длинным.

Каждый промпт на этой странице можно изменить и открыть в ChatGPT, Claude или другом ИИ-приложении.

Языковые ИИ-модели не читают буквы или слова. Они читают токены: небольшие кусочки текста, часто целое слово, иногда его часть. И они могут принять лишь ограниченное число токенов за раз, этот предел называется контекстным окном. Две эти идеи объясняют, почему ИИ-инструменты тарифицируются так, как тарифицируются, почему длинные чаты начинают забывать ранние инструкции и почему модели бывает трудно посчитать буквы в слове, которое она только что написала правильно.

Что такое токен в нейросети

Прежде чем модель увидит ваш промпт, программа под названием токенизатор делит текст на части из фиксированного словаря и превращает каждую часть в число. Модель работает только с этими числами и пишет ответ так же, по одному токену за раз, а приложение превращает их обратно в текст.

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

Token ization isn 't magic .

Это разбиение приведено для иллюстрации. У каждого семейства моделей свой токенизатор, и одно и то же предложение в каждом может превратиться в разное число частей. Многие разработчики моделей публикуют инструмент-токенизатор или API для подсчёта токенов, чтобы можно было проверить реальные числа.

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

Сколько токенов в слове

Для английского текста широко используется практическое правило: около четырёх символов на токен, или примерно три четверти слова. По этой оценке 1000 токенов: это около 750 английских слов, а статья на 3000 слов занимает около 4000 токенов.

Соотношение меняется в зависимости от содержания:

  • Другие языки часто требуют больше токенов для того же смысла. Токенизаторы обучают на данных, где английского очень много, поэтому английские слова получают компактные токены, а текст на японском, корейском, арабском, хинди и многих других языках, включая русский, делится на большее число частей. Разрыв зависит от токенизатора и в новых токенизаторах сократился, но не исчез.
  • Код тратит токены на отступы, скобки, операторы и длинные идентификаторы, поэтому файл часто стоит больше токенов, чем подсказывает число слов в нём.
  • Числа, URL и необычные строки, такие как идентификаторы и хеши, обычно делятся на много мелких токенов.

Почему токены важны

Стоимость. API берут плату за токены, с отдельными ценами за токены, которые вы отправляете, и за токены, которые пишет модель. В чате весь разговор отправляется заново с каждым новым сообщением, поэтому в длинном диалоге каждое сообщение стоит дороже, чем в коротком.

Лимиты. У модели есть контекстное окно для всего, что она читает и пишет в одном запросе, и часто отдельный предел длины одного ответа. В API этот предел можно задать самому, а в API Anthropic это обязательно: max_tokens является обязательным параметром.

Скорость. Ответ создаётся токен за токеном, поэтому более длинный ответ пропорционально дольше генерируется.

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

Что такое контекстное окно

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

  • системный промпт, собственные инструкции приложения и ваши
  • переписка до этого момента, каждое сообщение пользователя и каждый ответ
  • прикреплённые файлы, вставленные документы и результаты поиска или инструментов
  • ответ, который сейчас пишется

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

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

Что происходит, когда чат становится длинным

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

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

Как работать в пределах контекстного окна

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

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

Продолжить в новом чате
Fill in
Этот чат становится длинным. Напиши краткое изложение, которое я смогу вставить в новый чат, чтобы продолжить работу. Включи: цель, принятые решения и их причины, текущую версию схемы базы данных и открытые вопросы. Уложи изложение в 200 слов, не считая самого артефакта (схемы базы данных).
Try it
Example replyReplies vary between models and runs.

Цель: база данных для небольшого приложения библиотеки на SQLite.

Решения:

  • У выдач своя таблица, чтобы сохранялась вся история выдачи книг.
  • Книга считается доступной, если у неё нет выдачи с пустым returned_at.

Текущая схема:

CREATE TABLE books (id INTEGER PRIMARY KEY, title TEXT NOT NULL, author TEXT NOT NULL);
CREATE TABLE members (id INTEGER PRIMARY KEY, name TEXT NOT NULL, email TEXT UNIQUE);
CREATE TABLE loans (
  id INTEGER PRIMARY KEY,
  book_id INTEGER NOT NULL REFERENCES books(id),
  member_id INTEGER NOT NULL REFERENCES members(id),
  loaned_at TEXT NOT NULL,
  returned_at TEXT
);

Открытые вопросы:

  • Нужны ли штрафы за просрочку?
  • Должна ли библиотека учитывать несколько экземпляров одной книги?

Вставляйте только то, что нужно для задачи. Функцию с багом и код, который её вызывает, а не весь репозиторий. Нужный раздел договора, а не все сорок страниц. Меньше материала: меньше шансов что-то упустить.

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

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

Fill in
Я пришлю тебе длинный документ в 3 частях. После каждой части отвечай только «Получена часть N из 3» и больше ничего. Ничего не пересказывай и ни на что не отвечай, пока я не задам свой вопрос. Часть 1 из 3: """ [вставьте часть 1] """
Try it
Example replyReplies vary between models and runs.

Получена часть 1 из 3

Считайте токены, когда это важно. Если вы работаете через API, считайте до отправки. Открытая библиотека OpenAI tiktoken токенизирует текст токенизаторами OpenAI, а в API Anthropic есть эндпоинт для подсчёта токенов. Подсчёт токенизатором одного провайдера для другого провайдера лишь приблизителен.

import tiktoken

enc = tiktoken.get_encoding("o200k_base")  # one of OpenAI's tokenizers
tokens = enc.encode("Tokenization isn't magic.")
print(len(tokens))
print([enc.decode([t]) for t in tokens])

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

Часто задаваемые вопросы

Что такое токен в ИИ?

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

Сколько слов в 1000 токенов?

Для английского языка распространённое практическое правило: около четырёх символов на токен, то есть примерно 750 слов на 1000 токенов. Реальное число зависит от токенизатора модели и от текста. Код, числа и многие языки, кроме английского, в том числе русский, расходуют больше токенов на тот же объём содержания.

Что такое контекстное окно?

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

Что происходит, когда чат превышает контекстное окно?

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

Помнят ли ChatGPT или Claude мои прошлые чаты?

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

Coddy programming languages illustration

Учитесь программировать с Coddy

НАЧАТЬ