Simon Edwardsson дообучил Qwen2.5-Coder-0.5B предсказывать изменения экрана терминала вместо выполнения команд. За интерфейсом нет ни шелла, ни файловой системы: каждое нажатие клавиши уходит в языковую модель на 360 млн параметров, и она рисует, как изменится экран. Проверить это легко: наберите в демо pythoon с опечаткой, и в ответ придёт то, что модель считает правдоподобным, а не сообщение bash об отсутствующей команде. Разбор автора опубликован на Habr в русском переводе.
Обучение шло на 336 тысячах синтетических сессий, записанных с настоящих программ внутри Docker. Терминал представлен как сетка символов, по одному на ячейку, а модель получает последовательность токенов с описанием содержимого экрана и его изменений. Словарь компактный: 333 токена, часть из них описывает операции над блоками экрана вроде COPY.
Попробовать можно без установки: квантованная в int4 версия занимает 208 МБ и работает прямо во вкладке браузера через WebGPU. Нужен десктопный браузер с поддержкой WebGPU и физическая клавиатура, лучше всего подходят Chrome и Edge.
Что такое WorldTUI и почему за терминалом нет шелла
Под именем WorldTUI этот эксперимент обсуждают читатели, сам автор называет его терминалом, который изображает модель. Архитектура отличается от привычной: вместо интерпретатора команд работает генеративная модель, которая по текущему состоянию экрана и нажатию клавиши предсказывает следующее состояние.
Каждая сессия начинается со снимка: размер экрана, содержимое строк и положение курсора. Внутри это выглядит примерно так: BOS SCREEN_START 32 96, ROW_0 0 'simedw@laptop:~$ ', CURSOR 0 17 1. Размер подаётся на вход и не зашит жёстко как 32×96: в демо при создании своего стартового экрана можно задать число строк и столбцов.
Чем WorldTUI отличается от эмулятора терминала
Эмулятор терминала разбирает escape-последовательности, держит реальный процесс и работает с настоящей файловой системой. Xterm, iTerm или Windows Terminal выполняют команду и показывают её вывод. WorldTUI ничего не исполняет: он предсказывает, каким станет экран. Одно нажатие клавиши может само по себе что-то сделать, как Esc в vim. Вывод не всегда появляется внизу: clear стирает весь экран и переносит курсор наверх, то есть меняет состояние всех строк сразу.
Правилам терминала модель следует настолько, насколько они выучились по примерам. Файлы создаются, vim и tmux запускаются, в змейку можно играть. Там, где поведение расходится с настоящим шеллом, расхождение видно сразу.
Почему автор выбрал именно терминал
Вдохновением стала Genie 3, модель мира, генерирующая интерактивное видео. У автора не было ни большого GPU-кластера, ни горы видео, поэтому амбиции урезались до терминала.
Терминал оказался удачным выбором. Это сетка символов вместо пикселей. Идеально размеченных данных можно нагенерировать сколько угодно, запуская настоящие шеллы. Предобученная языковая модель уже неплохо представляет, что должны печатать ls или cat.
Главный вопрос, который автор хотел проверить, звучал так: сможет ли модель поддерживать согласованный мир или будет просто генерировать правдоподобный вывод терминала. Ответ по разделу с ограничениями ближе ко второму варианту.
Как обучали модель: 336 тысяч сессий, Docker и самокоррекция по идее DAgger
Данные собирали с настоящих программ внутри Docker. Такой источник даёт полную разметку: известно и состояние экрана, и каждое изменение. 336 тысяч сессий дают то, чего не даст парсинг скриншотов, а именно точные переходы между состояниями.
Больше всего результата дали два приёма: обучение модели исправлять собственные ошибки и параллельное декодирование строк экрана. Остальные улучшения оказались заметно скромнее.
Зачем нужна самокоррекция и как работает идея DAgger
При наивном обучении модель видит только идеальные состояния: ровный экран, аккуратный вывод, курсор на месте. На практике она быстро уходит в состояние, которого в выборке не было, и дальше предсказывает мусор. Одна неверная строка, и через несколько нажатий экран рассыпается.
DAgger, или Dataset Aggregation, решает это так: модель проходит траекторию сама, а эксперт размечает правильное действие в тех состояниях, куда она забрела. Эти состояния добавляют в датасет. Обучение идёт на распределении, которое модель реально посещает, а не на идеальном.
Для терминала приём критичен: интерактивная сессия состоит из десятков шагов, и ошибка накапливается. Модель, которая возвращает экран к консистентному виду после опечатки, полезнее той, что идеально рисует первый кадр. Похожая логика обучения узкой модели под конкретную задачу разобрана в кейсе о 50-мегабайтной замене Gemini Flash: там компактная модель на 550 реальных примерах доводится до 97% точности.
Как устроен словарь из 333 токенов и операции вроде COPY
Модель работает не с потоком символов напрямую, а с компактным словарём из 333 токенов. Часть токенов описывает изменения блоками: скопировать участок экрана, прокрутить, очистить. Операции вроде COPY позволяют не перегенерировать весь кадр, когда изменилась одна строка.
Экономия здесь прямая. Экран 32×96 это 3072 ячейки, и генерация каждого символа заново раздувает вывод и замедляет инференс. Операция «скопировать блок и заменить одну строку» занимает несколько токенов вместо тысяч.
Терминал при этом остаётся сеткой символов, по одному на ячейку. clear стирает экран и отправляет курсор наверх, то есть меняет состояние всех строк одновременно. Такие операции словарь и описывает.
Параллельное декодирование строк и спекулятивная проверка: как p95 упал с 6,7 до 0,87 секунды
Интерактивность упирается в задержку. Если кадр рисуется 6,7 секунды, печатать в таком терминале невозможно. Параллельное декодирование строк со спекулятивной проверкой сократило задержку p95 на больших кадрах с 6,7 до 0,87 секунды на RTX 4090, об этом автор пишет в том же разборе на Habr.
Логика приёма такая: строки экрана предсказываются параллельно, а спекулятивная проверка отбрасывает варианты, которые не сходятся с уже принятым состоянием кадра. Часть работы делается вперёд и выбрасывается, зато хвост задержки схлопывается.
p95 означает, что 95% кадров отрисовываются быстрее этого значения. Хвост распределения важнее среднего: именно он ощущается как залипание при быстрой печати. Цифры получены на RTX 4090, на другом железе результат будет другим, а на современном телефоне демо работает, по словам автора, мучительно медленно.
Результаты тестов: ShellBench и тест памяти, 9 из 13 против 2 и 3
ShellBench проверяет, насколько модель помнит и читает то, что было записано раньше. Дообученная модель ответила верно в 9 случаях из 13. Модели без дообучения справились в 2 и 3 случаях из тех же 13. Разрыв в три-четыре раза показывает, откуда берётся основной прирост.
При этом 9 из 13 значит, что примерно в трети случаев ответ неверный. Для демонстрации подхода это хороший результат, для рабочего инструмента маловато.
Что ещё умеет модель: создавать файлы, запускать vim и tmux, играть в змейку. Обычно она помнит, что было написано несколько команд назад. Слово «обычно» здесь ключевое: память есть, гарантий нет.
Ограничения WorldTUI: новые сочетания команд, вложенные каталоги и слабая согласованность мира
Автор называет три ограничения прямо: ошибки в новых сочетаниях команд, проблемы с вложенными каталогами и слабая согласованность мира.
Новые сочетания команд. Модель училась на конкретных последовательностях, и комбинация, которой не было в 336 тысячах сессий, может дать правдоподобный, но неверный экран. Снаружи это выглядит как обычная работа терминала, отличить подделку по виду сложно.
Вложенные каталоги. Чем глубже структура, тем больше сущностей модель должна удерживать в состоянии одновременно, и тем чаще возникают расхождения между тем, что показано, и тем, что «есть на самом деле».
Слабая согласованность мира. Это главное ограничение подхода: модель мира не гарантирует корректность, в отличие от настоящего шелла. Правдоподобный вывод и верный вывод это разные вещи. Материал основан на переводе оригинальной статьи, поэтому часть деталей обучения в нём могла быть опущена.
Как запустить WorldTUI в браузере: int4, 208 МБ и WebGPU
Квантованная в int4 версия занимает 208 МБ и работает прямо во вкладке браузера через WebGPU. Модель при этом остаётся на 360M параметров: урезанная таблица эмбеддингов сократила её размер, а int4-квантование уменьшило вес до указанных 208 МБ.
Требования скромные, но конкретные: десктопный браузер с WebGPU и физическая клавиатура. Chrome и Edge работают лучше всего. На современном телефоне демо тоже должно запуститься, но медленно.
Ждать одинаковой плавности на любом железе не стоит: цифры задержки в статье получены на RTX 4090. Тема экономии памяти на маленьких моделях подробно разобрана в материале про разреженную память вместо параметров: там таблица на 6,4 млрд векторов живёт на NVMe и занимает 0,4 ГБ VRAM.
Что это значит для моделей мира и почему дистилляция ломает память
Автор начинал с идеи обучить модель мира наподобие Genie 3 и урезал амбиции до терминала из-за отсутствия GPU-кластера и видео. Демо получилось узким, вывод из него шире самого проекта: дистилляция в меньшее число слоёв незаметно ломает память модели.
Незаметно здесь ключевое слово. Внешне поведение сохраняется: модель отвечает связно, печатает похожие ответы, проходит простые проверки. Способность удерживать состояние при этом ухудшается, и проявляется это на длинных последовательностях, а не на одном запросе. Для терминала, где важно помнить, что было пять команд назад, такая деградация равна поломке.
Практический вывод для тех, кто сжимает модели: проверять надо длинные сценарии с памятью, а не средний ответ на один промпт. WorldTUI на 360M параметров показывает, что компактная модель может имитировать терминал, но ограничения по памяти и согласованности мира остаются принципиальными. Кому важно понять, где проходит граница возможностей малых моделей, пригодится разбор пределов малых моделей: там речь о пороге до 48 ГБ VRAM и о том, насколько качество упирается в датасет, а не только в размер.
Если хочется оценить подход своими руками, откройте демо в Chrome или Edge, наберите пару команд с опечаткой, а потом clear и ls, и посмотрите, где модель начнёт расходиться с реальным терминалом. Это самый быстрый способ почувствовать разницу между интерпретатором команд и предсказанием экрана.