alterna ai
ALTERNA AI / ГЛАВА 12 · 04

12.4 Разбить и восстановить текст

На предыдущей странице: частые соседние кусочки объединяются.

Применяем уже заданные правила словаря. Для восстановления сначала собираем все байты, потом декодируем строку.

Разбиение задаётся конкретным словарём и правилами. Байт, символ, слово и токен не обязаны совпадать. Полученный номер — адрес, а не числовой смысл слова.

Обучение правил и применение правил разделены

Во время encode новый текст не переобучает tokenizer. Строка превращается в UTF-8 bytes, затем ранее выученные пары применяются в порядке рангов. На decode IDs раскрываются в byte sequences, все bytes соединяются и декодируются одним UTF-8 проходом.

Почему нельзя декодировать каждый token отдельно и склеить строки? Некоторые tokens содержат лишь часть многобайтного знака. Подстановка Unicode replacement character U+FFFD необратимо повредит текст. Поэтому основная проверка:

decode⁡(encode⁡(s))=s.\operatorname{decode}(\operatorname{encode}(s))=s.

Это равенство относится к допустимым Unicode-строкам нашего tokenizer без скрытой нормализации. Пробелы, line breaks и начальный BOM сохраняются. Пустая строка кодируется пустым списком и обратно; пустой training corpus для обучения merges отдельно отклоняется.

Эксперимент. Скопируйте полученные IDs в режим ручного decode. Измените один ID на неизвестный или сформируйте некорректную UTF-8 последовательность: должна появиться понятная ошибка, не ложный «успешный roundtrip». Byte fallback позволяет представлять любой валидный текст, но не гарантирует валидность произвольной случайной последовательности bytes.

Легко ошибиться. Decode произвольных IDs не обязан вернуть грамматичный текст. Decoder vocabulary и tokenizer vocabulary должны совпадать по содержимому и порядку. Если переобучить merges, сохранив старые веса embedding, соответствие строк может нарушиться.

s='  Я🙂\n'
ids=list(s.encode('utf-8'))
assert bytes(ids).decode('utf-8')==s

Код повторяет только что разобранные операции. Полный проверяемыйPython-пример главы доступен отдельным файлом; показанный короткий фрагмент не заменяет его реализацию.

Один token может содержать неполную UTF-8 последовательность.

Большой словарь и короткая последовательность. Как этот вопрос продолжает полученный результат?

Python-примеры главы 12 Академическая база →