Я из Беларуси и каждый пост в этом блоге выходит ещё и на беларусском. GPT-3 сейчас очевидный помощник для такой работы, а платить за него приходится по токенам. Прежде чем им пользоваться, я хотел знать, сколько там стоит беларусский.
На странице помощи OpenAI про токены есть примерное правило: 1 токен это примерно 4 символа английского текста. Я взял это правило и в уме перенёс его на русский с поправкой. Кириллическая буква в UTF-8 занимает 2 байта, токенизатор работает с байтами, значит русский должен стоить примерно вдвое дороже, может, чуть больше. На той же странице есть пример на испанском и фраза о том, что другие языки бывают дороже. Я её пропустил и ни один из двух языков так и не посчитал.
Перед подсчётом я записал свою догадку: русский примерно в 4 раза дороже английского, беларусский примерно в 5. Она всё равно оказалась заниженной.
Как мерил
Корпус это FLORES-101 devtest, который Facebook выложил в июне прошлого года. В нём 1012 предложений, переведённых людьми с английского на 100 других языков, так что смысл одинаковый и меняется только язык. Я взял английский, русский, беларусский, а для сравнения украинский и польский. Каждое предложение кодируется отдельно, без служебных токенов. Налог это число токенов на языке, делённое на число токенов на английском на том же токенизаторе.
В статье про GPT-3 сказано, что модель использует токенизацию GPT-2. Это BPE на уровне байтов и его словарь открыт с 2019 года. Кроме него я взял ещё 4 токенизатора. ruGPT-3 от Сбера обучен на русском. mBERT, XLM-R и mT5 многоязычные и беларусский был в их обучающих данных. Считал я библиотеками tokenizers 0.12.1 и sentencepiece 0.1.96.
Для mBERT это считали до меня. Ács в 2019 году разобрала его словарь и измерила, как он режет слова в 54 из его 104 языков. Rust и соавторы в прошлом году сравнили его с одноязычными токенизаторами, русский там тоже есть. Я не нашёл никого, кто прогнал бы беларусский через токенизатор GPT-3 или сравнил бы его на кириллице и на латинице на одних и тех же предложениях.
В 6,47 раза
На GPT-2 английский корпус занимает 27044 токена. Русский в 5,68 раза больше, беларусский в 6,47. Украинский 5,71, почти как русский. Польский, который пишется латиницей с диакритикой, 2,68.
По цене Davinci, 0,06 доллара за 1000 токенов, английский корпус стоит 1,62 доллара, а беларусский 10,50. Базовая модель Davinci принимает 2048 токенов на запрос и ответ вместе. Среднее английское предложение здесь занимает 27 токенов, беларусское 173, поэтому в окно контекста влезает 76 английских предложений и 11 беларусских.
Многоязычные токенизаторы гораздо мягче: на XLM-R русский в 1,16 раза дороже английского, беларусский в 1,45, на mBERT беларусский в 1,99.
Потом я захотел посмотреть на сам словарь. По первому подсчёту выходило, что кириллицы в GPT-2 нет вообще. Так быть не может, потому что у русского вышло 1,08 токена на символ, а не около 1,8, по числу его байтов на символ. Я забыл перевести байтовые куски обратно в текст перед поиском. Второй подсчёт нашёл 18 записей с кириллицей из 50257. 17 из них это одиночные строчные буквы: о, а, е, и, т и другие частые в русском. Любая другая буква это 2 токена, по одному на каждый её байт. Заглавные тоже по 2 токена.
Выходит, GPT-2 читает кириллицу по буквам, а беларусский чаще пользуется дорогими буквами. Буквы ў и і в эти 17 не входят, вместе это 7,4% всех беларусских букв. Вместе с з, ц, ч, ш, заглавными и остальными по 2 токена стоят 29,1% беларусских букв против 17,0% русских. К тому же в беларусском переводе примерно на 4% больше букв. Подсчёт одних только букв, по 1 или 2 токена на каждую, объясняет примерно 90% из тех 21598 токенов, которые беларусский тратит сверх русского.
Латиница
У беларусского есть своя латиница, лацинка (łacinka), с č, š, ž, ŭ и ł. Если цена идёт от алфавита, то те же слова лацинкой должны выйти на GPT-2 намного дешевле. Я написал грубый конвертер с классическими правилами для ł/l, ia/ja и мягкого ś перед мягким согласным. Исключений для заимствований в нём нет. Беларусский читатель найдёт в его результате ошибки, но слова остаются теми же, меняются только буквы.
На GPT-2 лацинка стоит в 2,98 раза больше английского, а не в 6,47, то есть счёт падает на 54%. “навукоўцы” (учёные) это 12 токенов на кириллице и 5 в виде “navukoŭcy”. Эта часть совпала с ожиданием, я заранее записал: минимум на 30% дешевле.
Потом я прогнал то же преобразование на остальных 4 токенизаторах и на каждом вышло наоборот. На mBERT лацинка на 6% дороже кириллицы, на ruGPT-3 на 52%, mT5 и XLM-R между ними. Все 3 многоязычных токенизатора видели беларусский на кириллице во время обучения. Думаю, они выучили его куски, а латинское написание тех же слов в их данных встречалось редко, особенно с ŭ. На XLM-R “навукоўцы” это 2 токена, на один меньше, чем русское “учёные”. Лацінкой это слово занимает 4. В словаре ruGPT-3 всего 2 записи с буквой ў, но там, вероятно, работает то же самое. Он выучил кириллические куски на русском, а лацинка их выбрасывает.
Токенизатор соседа
ruGPT-3 устроен так же, как GPT-2: BPE на уровне байтов на 50257 записей, только слияния он выучил на русском. С русского Сбер снял большую часть налога: русский корпус занимает на нём 29833 токена, это 1,10 от английского на GPT-2.
Я ожидал, что беларусскому это тоже поможет: языки близкие и большинство букв общие. На ruGPT-3 беларусский в 2,12 раза дороже русского. На GPT-2 разрыв был всего 1,14, потому что оба языка там обслуживались одинаково плохо. 78% русских слов на ruGPT-3 укладываются в один токен, а беларусских 27%. “навукоўцы” занимает 5 токенов, “учёные” 1.
Снова казалось, что виноваты 2 буквы. Я заменил букву ў на у, а і на и во всём беларусском корпусе. На GPT-2 это закрывает 42% разрыва с русским и это сходится с чтением по буквам. На ruGPT-3 только 16%. Там в словаре целые русские слова, а беларусские слова просто другие и замена букв не делает их русскими. Думаю, именно это даёт большую часть тех 2,12, но отдельно я этот вклад не считал.
Чего я не проверял
- Только цену в токенах. Хуже ли GPT-3 отвечает на беларусском, я не измерял.
- Мой конвертер в лацинку грубый. В первой версии не было ji после гласных и мягкого ś. С ними результат GPT-2 сдвинулся с 2,91 до 2,98, а остальные 4 остались дороже кириллицы. Аккуратная ручная транслитерация может сдвинуть числа ещё немного.
- FLORES это тексты из проектов Викимедиа вроде Викиновостей, переведённые с английского. Текст, изначально написанный по-беларусски, может токенизироваться иначе.
- OpenAI может сменить токенизатор в новых моделях. Я считал на словаре GPT-2, про который сама статья о GPT-3 пишет, что он “разработан для почти полностью английского обучающего набора”.