Новости
Модели
Продукты
keyboard_arrow_down
Читатель
Читайте URL-адреса и ищите информацию в Интернете для получения более подходящей подготовки для получения степени магистра права.
Вложения
Мультимодальные многоязычные вложения мирового класса.
Реранкер
Нейронный ретривер мирового класса для максимального повышения релевантности поиска.
Глубокий поиск
Ищите, читайте и рассуждайте, пока не найдете лучший ответ.
Более
keyboard_arrow_down
Классификатор
Классификация изображений и текста по нулевому и небольшому количеству кадров.
Сегментатор
Разрежьте длинный текст на куски и выполните токенизацию.

API-документы
Автоматическая генерация кода для вашего второго пилота IDE или LLM
open_in_new


Компания
keyboard_arrow_down
О нас
Связаться с отделом продаж
Стажерская программа
Присоединяйтесь к нам
open_in_new
Скачать логотип
open_in_new
Условия использования


Авторизоваться
login
кратко
Слова, токены, числа
Отображение языка в числа
Зачем мы токенизируем? И почему именно так?
Эмпирические оценки размеров выходных токенов
Относимся к токенам серьезно
Технический блог
январь 31, 2024

Глубокое погружение в токенизацию

Токенизация в LLM означает разделение входных текстов на более мелкие части для обработки. Так почему же за embeddings берут плату по токенам?
Colorful speckled grid pattern with a mix of small multicolored dots on a black background, creating a mosaic effect.
Scott Martens
Scott Martens • 16 минуты чтения

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

Tokenizer API
Free API to tokenize texts, count and get first/last-N tokens.

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

Более того, сервисы эмбеддингов обычно тарифицируются "за токен", что означает, что токены важны для понимания вашего счета.

Это может быть очень запутанно, если вы не понимаете, что такое токен.

Текущий прайс-лист Jina Embeddings (по состоянию на февраль 2024).
Текущий прайс-лист Jina Embeddings (по состоянию на февраль 2024). Обратите внимание, что цены указаны за "1M токенов".

Но из всех запутанных аспектов современного AI, токены, вероятно, наименее сложны. В этой статье мы постараемся разъяснить, что такое токенизация, что она делает и почему мы делаем это именно так.

tagкратко

Для тех, кто хочет или нуждается в быстром ответе, чтобы понять, сколько токенов купить у Jina Embeddings или оценить, сколько им нужно будет купить, вот необходимая статистика.

tagТокены на английское слово

💡
Запрос к API Jina Embeddings v2 для английских моделей будет использовать примерно на 10% больше токенов, чем количество слов в вашем тексте, плюс два токена на эмбеддинг.

При эмпирическом тестировании, описанном ниже в этой статье, различные английские тексты конвертировались в токены с соотношением примерно на 10% больше токенов, чем слов, при использовании моделей Jina Embeddings только для английского языка. Этот результат был довольно устойчивым.

Модели Jina Embeddings v2 имеют контекстное окно размером 8192 токена. Это означает, что если вы передадите модели Jina английский текст длиннее 7 400 слов, есть большая вероятность, что он будет обрезан.

💡
Максимальный размер входных данных для Jina Embeddings v2 для английского языка составляет примерно 7 400 слов.

tagТокены на китайский иероглиф

Для китайского языка результаты более переменчивы. В зависимости от типа текста, соотношения варьировались от 0,6 до 0,75 токенов на китайский иероглиф (汉字). Английские тексты, переданные в Jina Embeddings v2 для китайского языка, производят примерно такое же количество токенов, как и Jina Embeddings v2 для английского: примерно на 10% больше, чем количество слов.

💡
Максимальный размер входных данных на китайском языке для Jina Embeddings v2 для китайского и английского языков составляет примерно 10 500 иероглифов (字数), или от 0,6 до 0,75 токенов на китайский иероглиф, плюс два на эмбеддинг.

tagТокены на немецкое слово

Соотношение слов к токенам в немецком языке более переменчиво, чем в английском, но менее, чем в китайском. В зависимости от жанра текста, в среднем получалось на 20-30% больше токенов, чем слов. При передаче английских текстов в Jina Embeddings v2 для немецкого и английского языков используется немного больше токенов, чем в моделях только для английского и китайского/английского языков: на 12-15% больше токенов, чем слов.

💡
Jina Embeddings v2 для немецкого и английского языков будет считать на 20-30% больше токенов, чем слов, плюс два на эмбеддинг. Максимальный размер входного контекста составляет примерно 6 300 немецких слов.

tagПредостережение

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

⚠️
Результаты могут отличаться!

Это оценки, основанные на статистически наивных расчетах. Мы не гарантируем, сколько токенов потребует конкретный запрос.

Если вам нужен только совет о том, сколько токенов купить для Jina Embeddings, можете остановиться здесь. Другие модели эмбеддингов от компаний, отличных от Jina AI, могут иметь другие соотношения токенов к словам и токенов к китайским иероглифам, чем у моделей Jina, но в целом они не будут сильно отличаться.

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

tagСлова, токены, числа

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

Немного банально говорить, что все в компьютере — это просто числа, но это в основном правда. Однако язык по своей природе не является просто набором чисел. Это может быть речь, состоящая из звуковых волн, или письмо, состоящее из отметок на бумаге, или даже изображение печатного текста или видео того, как кто-то использует язык жестов. Но чаще всего, когда мы говорим об использовании компьютеров для обработки естественного языка, мы имеем в виду тексты, состоящие из последовательностей символов: букв (a, b, c и т.д.), цифр (0, 1, 2…), знаков пунктуации и пробелов на разных языках и в разных текстовых кодировках.

Компьютерные инженеры называют их "строками".

AI-модели языка принимают на вход последовательности чисел. Так что вы можете написать предложение:

What is today's weather in Berlin?

Но после токенизации AI-модель получает на вход:

[101, 2054, 2003, 2651, 1005, 1055, 4633, 1999, 4068, 1029, 102]

Токенизация — это процесс преобразования входной строки в определенную последовательность чисел, которую ваша AI-модель может понять.

Когда вы используете AI-модель через веб-API, который взимает плату с пользователей за токен, каждый запрос преобразуется в последовательность чисел, подобную показанной выше. Количество токенов в запросе — это длина этой последовательности чисел. Таким образом, если вы попросите Jina Embeddings v2 for English дать вам эмбеддинг для "What is today's weather in Berlin?", это будет стоить вам 11 токенов, потому что она преобразовала это предложение в последовательность из 11 чисел перед передачей его AI-модели.

AI-модели, основанные на архитектуре Transformer, имеют фиксированного размера контекстное окно, размер которого измеряется в токенах. Иногда это называют "входным окном", "размером контекста" или "длиной последовательности" (особенно на лидерборде MTEB Hugging Face). Это означает максимальный размер текста, который модель может видеть одновременно.

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

Модели Jina Embeddings v2 все имеют контекстное окно размером 8 192 токена. Другие модели будут иметь другие (как правило, меньшие) контекстные окна. Это означает, что какой бы текст вы ни подали на вход, токенизатор, связанный с этой моделью Jina Embeddings, должен преобразовать его не более чем в 8 192 токена.

tagОтображение языка в числа

Самый простой способ объяснить логику токенов следующий:

💡
Токен — это число, которое представляет часть строки.

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

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

Чтобы показать, как работает токенизация, мы собираемся токенизировать несколько предложений, используя самую маленькую модель Jina Embeddings v2 для английского языка: jina-embeddings-v2-small-en. Другая модель Jina Embeddings только для английского языка — jina-embeddings-v2-base-en — использует тот же токенизатор, поэтому нет смысла скачивать дополнительные мегабайты AI-модели, которые мы не будем использовать в этой статье.

Сначала установите модуль transformers в вашей среде Python или блокноте. Используйте

Используйте флаг -U, чтобы установить последнюю версию, так как эта модель не работает с некоторыми старыми версиями:

pip install -U transformers

Затем загрузите jina-embeddings-v2-small-en, используя AutoModel.from_pretrained:

from transformers import AutoModel

model = AutoModel.from_pretrained('jinaai/jina-embeddings-v2-small-en', trust_remote_code=True)

Для токенизации строки используйте метод encode объекта tokenizer модели:

model.tokenizer.encode("What is today's weather in Berlin?")

Результат - список чисел:

[101, 2054, 2003, 2651, 1005, 1055, 4633, 1999, 4068, 1029, 102]

Чтобы преобразовать эти числа обратно в строковую форму, используйте метод convert_ids_to_tokens объекта tokenizer:

model.tokenizer.convert_ids_to_tokens([101, 2054, 2003, 2651, 1005, 1055, 4633, 1999, 4068, 1029, 102])

Результат - список строк:

['[CLS]', 'what', 'is', 'today', "'", 's', 'weather', 'in',
 'berlin', '?', '[SEP]']

Обратите внимание, что токенизатор модели:

  1. Добавил [CLS] в начало и [SEP] в конец. Это необходимо по техническим причинам и означает, что каждый запрос на эмбеддинг будет стоить два дополнительных токена, помимо количества токенов самого текста.
  2. Разделил пунктуацию и слова, превратив "Berlin?" в: berlin и ?, а "today's" в today, ' и s.
  3. Перевел все в нижний регистр. Не все модели делают это, но это может помочь при обучении для английского языка. Это может быть менее полезно в языках, где заглавные буквы имеют другое значение.

Разные алгоритмы подсчета слов в разных программах могут по-разному считать слова в этом предложении. OpenOffice считает это как шесть слов. Алгоритм сегментации текста Unicode (Unicode Standard Annex #29) считает семь слов. Другое программное обеспечение может прийти к другим числам, в зависимости от того, как они обрабатывают пунктуацию и клитики вроде "'s".

Токенизатор этой модели создает девять токенов для этих шести или семи слов, плюс два дополнительных токена, необходимых для каждого запроса.

Теперь давайте попробуем с менее распространенным названием места, чем Берлин:

token_ids = model.tokenizer.encode("I live in Kinshasa.")
tokens = model.tokenizer.convert_ids_to_tokens(token_ids)
print(tokens)

Результат:

['[CLS]', 'i', 'live', 'in', 'kin', '##sha', '##sa', '.', '[SEP]']

Название "Kinshasa" разбито на три токена: kin, ##sha и ##sa. ## указывает, что этот токен не является началом слова.

Если мы дадим токенизатору что-то совершенно чужеродное, количество токенов по отношению к количеству слов увеличится еще больше:

token_ids = model.tokenizer.encode("Klaatu barada nikto")
tokens = model.tokenizer.convert_ids_to_tokens(token_ids)
print(tokens)

['[CLS]', 'k', '##la', '##at', '##u', 'bar', '##ada', 'nik', '##to', '[SEP]']

Три слова превращаются в восемь токенов, плюс токены [CLS] и [SEP].

Токенизация в немецком языке похожа. С помощью модели Jina Embeddings v2 для немецкого языка, мы можем токенизировать перевод "What is today's weather in Berlin?" тем же способом, что и с английской моделью.

german_model = AutoModel.from_pretrained('jinaai/jina-embeddings-v2-base-de', trust_remote_code=True)
token_ids = german_model.tokenizer.encode("Wie wird das Wetter heute in Berlin?")
tokens = german_model.tokenizer.convert_ids_to_tokens(token_ids)
print(tokens)

Результат:

['<s>', 'Wie', 'wird', 'das', 'Wetter', 'heute', 'in', 'Berlin', '?', '</s>']

Этот токенизатор немного отличается от английского тем, что <s> и </s> заменяют [CLS] и [SEP], но выполняют ту же функцию. Кроме того, текст не нормализуется по регистру — верхний и нижний регистры остаются как написаны — потому что в немецком языке заглавные буквы имеют другое значение, чем в английском.

(Для упрощения этой презентации я убрал специальный символ, обозначающий начало слова.)

Теперь давайте попробуем более сложное предложение из газетного текста:

Ein Großteil der milliardenschweren Bauern-Subventionen bleibt liegen – zu genervt sind die Landwirte von bürokratischen Gängelungen und Regelwahn.
sentence = """
Ein Großteil der milliardenschweren Bauern-Subventionen
bleibt liegen – zu genervt sind die Landwirte von 
bürokratischen Gängelungen und Regelwahn.
"""
token_ids = german_model.tokenizer.encode(sentence)
tokens = german_model.tokenizer.convert_ids_to_tokens(token_ids)
print(tokens)

Результат токенизации:

['<s>', 'Ein', 'Großteil', 'der', 'mill', 'iarden', 'schwer', 
 'en', 'Bauern', '-', 'Sub', 'ventionen', 'bleibt', 'liegen', 
 '–', 'zu', 'gen', 'ervt', 'sind', 'die', 'Landwirte', 'von', 
 'büro', 'krat', 'ischen', 'Gän', 'gel', 'ungen', 'und', 'Regel', 
 'wahn', '.', '</s>']

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

Давайте сделаем то же самое на китайском, переведя "What is today's weather in Berlin?" как:

柏林今天的天气怎么样?
chinese_model = AutoModel.from_pretrained('jinaai/jina-embeddings-v2-base-zh', trust_remote_code=True)
token_ids = chinese_model.tokenizer.encode("柏林今天的天气怎么样?")
tokens = chinese_model.tokenizer.convert_ids_to_tokens(token_ids)
print(tokens)

Результат токенизации:

['<s>', '柏林', '今天的', '天气', '怎么样', '?', '</s>']

В китайском языке обычно нет разрывов между словами в письменном тексте, но токенизатор Jina Embeddings часто объединяет несколько китайских иероглифов вместе:

Token string Pinyin Meaning
柏林 Bólín Berlin
今天的 jīntiān de today's
天气 tiānqì weather
怎么样 zěnmeyàng how

Давайте используем более сложное предложение из гонконгской газеты:

sentence = """
新規定執行首日,記者在下班高峰前的下午5時來到廣州地鐵3號線,
從繁忙的珠江新城站啟程,向機場北方向出發。
"""
token_ids = chinese_model.tokenizer.encode(sentence)
tokens = chinese_model.tokenizer.convert_ids_to_tokens(token_ids)
print(tokens)

(Перевод: «В первый день вступления в силу новых правил репортер прибыл на линию 3 метро Гуанчжоу в 17:00, в час пик, отправившись со станции Чжуцзян Нью-Таун в направлении аэропорта»)

Результат:

['<s>', '新', '規定', '執行', '首', '日', ',', '記者', '在下', '班', 
 '高峰', '前的', '下午', '5', '時', '來到', '廣州', '地', '鐵', '3', 
 '號', '線', ',', '從', '繁忙', '的', '珠江', '新城', '站', '啟', 
 '程', ',', '向', '機場', '北', '方向', '出發', '。', '</s>']

Эти токены не соответствуют какому-либо конкретному словарю китайских слов (词典). Например, "啟程" - qǐchéng (отправляться, уезжать) обычно классифицируется как одно слово, но здесь разделено на два составляющих иероглифа. Аналогично, "在下班" обычно распознается как два слова, с разделением между "在" - zài (в, во время) и "下班" - xiàbān (конец рабочего дня, час пик), а не между "在下" и "班", как это сделал токенизатор.

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

💡
Алгоритм токенизации не использует обычный словарь с учетом языка, поэтому его поведение не соответствует тому, как люди считают слова.

Это не является особенностью только моделей Jina Embeddings. Такой подход к токенизации практически универсален в разработке AI-моделей. Хотя у двух разных AI-моделей могут быть неидентичные токенизаторы, на текущем этапе развития они практически все используют токенизаторы с таким поведением.

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

tagЗачем мы токенизируем? И почему именно так?

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

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

В обработке естественного языка это называется проблемой слов вне словаря (out-of-vocabulary, OOV), и она встречается во всех типах текстов и во всех языках. Существует несколько стратегий решения проблемы OOV:

  1. Игнорировать ее. Заменять все, чего нет в словаре, токеном "неизвестно".
  2. Обойти ее. Вместо использования словаря, который сопоставляет текстовые последовательности с векторами, использовать тот, который сопоставляет отдельные символы с векторами. В английском в основном используется только 26 букв, поэтому это должно быть меньше и устойчивее к проблемам OOV, чем любой словарь.
  3. Найти частые подпоследовательности в тексте, поместить их в словарь и использовать символы (однобуквенные токены) для всего остального.

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

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

Языковые модели AI в основном все реализуют третью стратегию в той или иной форме. Большинство использует какой-либо вариант алгоритма Wordpiece [Schuster and Nakajima 2012] или похожую технику, называемую Byte-Pair Encoding (BPE). [Gage 1994, Senrich et al. 2016] Эти алгоритмы являются языконезависимыми. Это означает, что они работают одинаково для всех письменных языков без каких-либо знаний, кроме полного списка возможных символов. Они были разработаны для многоязычных моделей, таких как BERT от Google, которые принимают любые входные данные из интернета — сотни языков и тексты, отличные от человеческого языка, например компьютерные программы — чтобы их можно было обучать без сложной лингвистики.

Некоторые исследования показывают значительные улучшения при использовании более специфичных для языка токенизаторов. [Rust et al. 2021] Но создание таких токенизаторов требует времени, денег и опыта. Реализация универсальной стратегии, такой как BPE или Wordpiece, намного дешевле и проще.

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

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

tagЭмпирические оценки размеров выходных токенов

Для английского и немецкого языков я использовал алгоритм сегментации текста Unicode (Unicode Standard Annex #29) для подсчета слов в текстах. Этот алгоритм широко используется для выделения фрагментов текста при двойном щелчке. Это самое близкое к универсальному объективному счетчику слов, что доступно.

Я установил библиотеку polyglot в Python, которая реализует этот сегментатор текста:

pip install -U polyglot

Чтобы получить количество слов в тексте, можно использовать код вроде этого фрагмента:

from polyglot.text import Text

txt = "What is today's weather in Berlin?"
print(len(Text(txt).words))

Результат должен быть 7.

Для подсчета токенов фрагменты текста передавались токенизаторам различных моделей Jina Embeddings, как описано ниже, и каждый раз я вычитал два из количества возвращенных токенов.

⚠️
Количество токенов, перечисленное здесь, не включает два дополнительных токена в начале и конце каждого токенизированного текста.

tagАнглийский
(jina-embeddings-v2-small-en и jina-embeddings-v2-base-en)

Для расчета средних значений я загрузил два английских текстовых корпуса с Wortschatz Leipzig, коллекции свободно загружаемых корпусов на нескольких языках и в разных конфигурациях, размещенной Лейпцигским университетом:

  • Корпус из миллиона предложений новостных данных на английском языке за 2020 год (eng_news_2020_1M)
  • Корпус из миллиона предложений данных английской Википедии за 2016 год (eng_wikipedia_2016_1M)

Оба можно найти на их странице загрузок английского языка.

Для разнообразия я также загрузил перевод Хэпгуда романа Виктора Гюго «Отверженные» с Project Gutenberg и копию Библии короля Якова, переведенной на английский язык в 1611 году.

Для всех четырех текстов я подсчитал слова, используя сегментатор Unicode, реализованный в polyglot, затем подсчитал токены, созданные jina-embeddings-v2-small-en, вычитая два токена для каждого запроса токенизации. Результаты следующие:

ТекстКоличество слов
(сегментатор Unicode)
Количество токенов
(Jina Embeddings v2
для английского)
Отношение токенов к словам
(до 3 знаков после запятой)
eng_news_2020_1M22 825 71225 270 5811,107
eng_wikipedia_2016_1M24 243 60726 813 8771,106
les_miserables_en688 911764 1211,109
kjv_bible1 007 6511 099 3351,091

Использование точных чисел не означает, что это точный результат. То, что документы столь разных жанров имеют на 9-11% больше токенов, чем слов, указывает на то, что вы можете ожидать примерно на 10% больше токенов, чем слов, согласно сегментатору Unicode. Текстовые редакторы часто не учитывают пунктуацию, в то время как сегментатор Unicode учитывает, поэтому не стоит ожидать, что подсчет слов в офисном ПО будет соответствовать этим данным.

tagНемецкий
(jina-embeddings-v2-base-de)

Для немецкого языка я загрузил три корпуса со страницы немецкого языка Wortschatz Leipzig:

  • deu_mixed-typical_2011_1M — Миллион предложений из сбалансированной смеси текстов разных жанров за 2011 год.
  • deu_newscrawl-public_2019_1M — Миллион предложений новостных текстов за 2019 год.
  • deu_wikipedia_2021_1M — Миллион предложений, извлеченных из немецкой Википедии в 2021 году.

А для разнообразия я также загрузил все три тома «Капитала» Карла Маркса из Deutsches Textarchiv.

Затем я следовал той же процедуре, что и для английского:

ТекстКоличество слов
(Unicode Segmenter)
Количество токенов
(Jina Embeddings v2
для немецкого и английского)
Отношение токенов к словам
(до 3 знаков после запятой)
deu_mixed-typical_2011_1M7 924 0249 772 6521,234
deu_newscrawl-public_2019_1M17 949 12021 711 5551,210
deu_wikipedia_2021_1M17 999 48222 654 9011,259
marx_kapital784 3361 011 3771,289

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

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

ТекстКоличество слов
(Unicode Segmenter)
Количество токенов
(Jina Embeddings v2
для немецкого и английского)
Отношение токенов к словам
(до 3 знаков после запятой)
eng_news_2020_1M24 243 60727 758 5351,145
eng_wikipedia_2016_1M22 825 71225 566 9211,120

Следует ожидать, что для встраивания английских текстов с двуязычным немецко-английским токенизатором потребуется на 12-15% больше токенов, чем с токенизатором только для английского.

tagКитайский
(jina-embeddings-v2-base-zh)

Китайский язык традиционно пишется без пробелов и до 20-го века не имел традиционного понятия "слов". Следовательно, размер китайского текста обычно измеряется в символах (字数). Поэтому вместо использования сегментатора Unicode я измерял длину китайских текстов, удаляя все пробелы и затем просто получая длину в символах.

Я загрузил три корпуса со страницы китайского корпуса Wortschatz Leipzig:

  • zho_wikipedia_2018_1M — Миллион предложений из китайскоязычной Википедии, извлечённых в 2018 году.
  • zho_news_2007-2009_1M — Миллион предложений из китайских новостных источников, собранных с 2007 по 2009 год.
  • zho-trad_newscrawl_2011_1M — Миллион предложений из новостных источников, использующих исключительно традиционные китайские иероглифы (繁體字).

Кроме того, для разнообразия я также использовал «Подлинную историю А-кью» (阿Q正傳), повесть Лу Синя (魯迅), написанную в начале 1920-х годов. Я загрузил версию с традиционными иероглифами из Project Gutenberg.

ТекстКоличество символов
(字数)
Количество токенов
(Jina Embeddings v2
для китайского и английского)
Отношение токенов к символам
(до 3 знаков после запятой)
zho_wikipedia_2018_1M45 116 18229 193 0280,647
zho_news_2007-2009_1M44 295 31428 108 0900,635
zho-trad_newscrawl_2011_1M54,585,81940,290,9820.738
Ah_Q41,26825,3460.614

Такой разброс в соотношении токенов к символам неожиданный, и особенно выброс для корпуса с традиционными иероглифами заслуживает дальнейшего исследования. Тем не менее, мы можем заключить, что для китайского языка вам потребуется меньше токенов, чем символов в вашем тексте. В зависимости от содержания, можно ожидать, что потребуется на 25% - 40% меньше.

Английские тексты в Jina Embeddings v2 для китайского и английского языков дали примерно то же количество токенов, что и в модели только для английского языка:

TextWord count
(Unicode Segmenter)
Token count
(Jina Embeddings v2 for Chinese and English)
Ratio of tokens to words
(to 3 decimal places)
eng_news_2020_1M24,243,60726,890,1761.109
eng_wikipedia_2016_1M22,825,71225,060,3521.097

tagОтносимся к токенам серьезно

Токены являются важной основой для языковых моделей ИИ, и исследования в этой области продолжаются.

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

Следовательно, на улучшение токенизации тратится гораздо меньше усилий, чем в других областях, но это может измениться.

Как пользователь эмбеддингов, который покупает их через API вроде Jina Embeddings, вы не можете точно знать, сколько токенов вам понадобится для конкретной задачи, и, возможно, придется провести собственное тестирование, чтобы получить точные цифры. Но оценки, приведенные здесь — около 110% от количества слов для английского, около 125% от количества слов для немецкого и около 70% от количества символов для китайского — должны быть достаточными для базового планирования бюджета.

Категории:
Технический блог
rss_feed
Офисы
location_on
Саннивейл, Калифорния
710 Lakeway Dr, Ste 200, Саннивейл, Калифорния 94085, США
location_on
Берлин, Германия (штаб-квартира)
Prinzessinnenstraße 19-20, 10969 Берлин, Германия
location_on
Пекин, Китай
Уровень 5, здание 6, ул. Хайдянь Вест, д. 48, Пекин, Китай
location_on
Шэньчжэнь, Китай
402, этаж 4, здание Fu'an Technology, Шэньчжэнь, Китай
Поиск Фонда
Читатель
Вложения
Реранкер
Глубокий поиск
Классификатор
Сегментатор
API-документация
Получить API-ключ Jina
Ограничение скорости
Статус API
Компания
О нас
Связаться с отделом продаж
отдел новостей
Стажерская программа
Присоединяйтесь к нам
open_in_new
Скачать логотип
open_in_new
Условия
Безопасность
Условия использования
Конфиденциальность
Управление файлами cookie
email
Jina AI © 2020-2025.