---
title:"WorldTUI:训练一个 360M 模型假装自己是终端"date:2026.10.22category:[编程, 行业观察]tags:[world-model, llm, terminal, fine-tuning, webgpu]status:published
---

WorldTUI:训练一个 360M 模型假装自己是终端

一个 360M 参数的小模型,没有 shell、没有文件系统,却能陪你 vim、tmux、打字、玩贪吃蛇——WorldTUI 把终端当成世界模型来训,靠按键预测屏幕变化,208MB 在浏览器里就能跑。本期访谈聊聊「应用不写代码、只被学出来」的未来。

2026.10.22·6 min read·10.2KB
// tl;dr: generating summary...

WorldTUI:训练一个 360M 模型假装自己是终端

这周 Hacker News 上最有意思的一个个人项目,来自独立开发者 simedw:他拿 Qwen2.5-Coder-0.5B 做底座,微调出一个 360M 参数的模型,专门用来"假装自己是终端"。注意,这个终端后面没有 shell、没有文件系统、没有真正的 vim——你敲的每一个按键都喂给模型,由它来预测屏幕会变成什么样。它能建文件、跑 vim、开 tmux 分屏、玩贪吃蛇,甚至记得你几分钟前写过什么;输错 pythoon 它会宽容地启动 Python,少打个 p 的 ython 就不行。最狠的是,整个模型量化到 int4 只有 208MB,在浏览器标签页里用 WebGPU 就能跑。评论区从微软的 Quake II 模拟、NeuralOS 桌面模拟一路聊到「把这东西放到公网上,看爬虫们会做什么」。我请来做推理优化的老朋友陈默——他早年在做自动驾驶仿真时就玩过世界模型那一套——聊聊为什么终端是世界模型的完美试验田。

本文由每日自动管线生成:选题与素材来自 Hacker News 公开讨论,访谈内容由 AI 基于原文整理,嘉宾为角色设定,观点不代表任何真实人物。

小听: 默哥,先给没看原文的朋友一句话介绍:WorldTUI 到底是个什么东西?

陈默: 一句话:它是一个学会了"装终端"的语言模型。正常的终端是程序在算、屏幕在显示;WorldTUI 把中间的程序全砍了,只剩一个模型。你按键,它预测这一帧屏幕应该长什么样。作者的野心其实不在终端——他是看了 DeepMind 的 Genie 3 之后想明白的:未来的应用可能不是写出来的,而是学出来的,模型直接预测用户输入后的下一帧画面。游戏世界太大、他没那算力,就把野心缩小到一个终端:一个字符网格,而不是像素画面。

小听: 为什么终端特别适合做世界模型?直觉上它就是个文本框啊。

陈默: 恰恰相反,终端是个绝妙的选择。第一,它是离散的字符网格,没有连续像素那种模糊地带,建模简单一个数量级;第二,作者可以无限生成带精确标注的训练数据——在 Docker 里跑真 shell,把"按键→屏幕变化"一对一录下来,336k 个 episode、约 20 亿 token,要多少有多少。第三,预训练的语言模型本来就见过无数次 ls 和 cat 的输出,对"终端应该长什么样"有天然直觉。HN 评论里有人问"有真终端了我为什么要用这个",答案是:这项目压根不是为了替代终端,它是一个世界模型的可控试验台——世界小到可以完整测量一致性,又真实到能跑 vim 和 tmux。

小听: 技术上最让我惊讶的是输入输出的设计。普通 LLM 是往后追加 token,但终端的 clear 会清屏、esc 在 vim 里切换模式,输出不一定往下走。作者怎么处理的?

陈默: 这是全文最漂亮的一段工程。他不预测文本流,而是把终端看成字符网格,模型只输出"哪些行要重写、光标落在哪"。滚屏是个经典难题:窗口到底了按回车,每行都要上移一位,让模型逐行重写一帧要 3000 个 token。所以他加了个 COPY 操作——ROW_0 COPY 1,旧的第 1 行变成新的第 0 行,一次滚屏每行只要 3 个 token。清屏、vim 插行删行、man 翻页全用同一招。更绝的是词汇表:复用 Qwen 已有的 256 个字节 token 当字符、坐标和小数字,整个模型只用 333 个 token,解码还做了语法约束,保证每次预测都是合法的屏幕更新。小词汇表后面还帮了大忙——把模型塞进浏览器时,embedding 表从 1.36 亿参数直接砍到几乎为零。

字符网格组成的终端屏幕特写,一行发光的文字正被复制上移

终端不是文本流,是一格一格的世界。

小听: 数据是合成的,合成数据有个老毛病:模型学的是"理想演示",一到自己生成的错误状态就崩。作者说最大的改进是"教会它修自己的错",这怎么做的?

陈默: 他借鉴了 DAgger 的思想:不只从完美轨迹学,还从模型自己犯错后的状态学。具体做法是挑录制会话里的一个点,让模型往前预测 1 到 4 步,把它生成的屏幕和真实录制的屏幕对比;如果差得不大,就构造一个"修正量"——下一次按键时把模型的错屏修回正确的下一屏。关键约束是:修正引入的词必须在之前的真实屏幕或用户输入里出现过,不能是模型自己编出来的,否则等于在奖励幻觉。做了三轮,每轮都用最新模型的错误重新采样。效果很实在:他自己设的 PresetBench 从 24/47 涨到 38/47。全部训练加起来只用了 75 个 GPU 小时,一块 RTX 4090 的量级——个人开发者能复刻,这点很重要。

小听: 说到速度,逐 token 生成 3000 个 token 的全屏重绘,在 4090 上要 12 秒,作者一开始甚至不想用自回归模型。最后怎么把延迟打下来的?

陈默: 两招。第一招是"行并行":一帧里大多数行互不依赖,没必要逐行生成。每个 batch 元素负责一行,共享同样的历史和 KV cache,只生成自己的更新,解码代价从"所有行 token 之和"变成"最长那行的长度"。大帧的 p95 延迟从 6.7 秒掉到 0.87 秒,代价是训练时要配一套匹配的 attention mask。第二招处理并行带来的副作用:各行没法互相商量,会出现 vim 开在第 3 行而不是第 0 行、贪吃蛇一次长出好几节食物这种 bug。解法是"自己给自己做 speculative decoding"——并行行先出草稿,再用同一个模型串行校验,保留到第一个分歧点为止,后面自己改。浏览器里 M4 Mac 上敲一个字符约 60ms,man 这种大更新 0.9 秒,终端的手感就回来了。

小听: 蒸馏那段我看得直冒冷汗:删掉第 7 层,next-token 准确率只从 99.3% 掉到 98.9%,但记忆测试的 64 次回读直接归零?

陈默: 对,这是全篇最值得所有做压缩的人抄下来的一段。他的记忆测试是 32 个"世界":每个世界写两个随机值到两个文件,换会话再读回来,名字和值都没在训练里出现过。学生模型删了 1、7、15、22 层之后,输出照样像模像样,ShellBench 也还行,但记忆回读只剩瞎蒙的水平——它永远输出两个值中的一个,对错各半,而且 4.8 亿 token 的再训练都没救回来。反过来,一个保住这四层的 16 层学生,64/64 全对。教训很硬:token 级准确率这个指标,对"世界一致性"这种能力是失明的。一个蒸馏模型看起来 fine,可能已经悄悄把记忆弄丢了。最后作者放弃了蒸馏。

黑暗中一块发光的终端屏幕,断裂的一行字符正被重新拼回整齐的一行

看起来没坏,不等于记得住。

小听: 回到"它到底能干嘛"。tmux 那段把我看笑了:开多个 pane、每个干不同的事、来回切换——作者说自己像科学怪人,"it's alive!"

陈默: 那段确实是高光。它不止 bash,vim 的模式切换、保存退出、tmux 分屏、环境变量展开、man page 全都训了。Python REPL 也还行:小加法是对的,列表推导式能返回列表(虽然内容常错),打错字还挺宽容。评论区最高赞的几个脑洞也很有意思:有人想起 2022 年大家拿 ChatGPT prompt 出 Linux 终端的玩法,WorldTUI 算是那个梗的"训练版";有人提到微软用扩散模型模拟 Quake II、NeuralOS 模拟整个桌面——这条"应用即世界模型"的线正在变长。还有个评论说想把它挂到公网上看爬虫会干什么,作者估计得先想想安全问题。

小听: 当然它也有翻车现场:echo green >> colors 再 cat,追加的那行经常不出现;目录嵌套深了会"迷路";Firefox 比 Chrome 慢 20 倍,原因还没找到。

陈默: 作者自己总结得很诚实:有用吗?没什么用。但一个 360M 的模型在浏览器里能做到这个程度,远超他预期。真正让他着迷的是:没有任何一条底层规则是手写的,模型却维持住了一个"还算一致"的世界——文件建了还在,vim 里改了存了,换个窗口 cat 出来是对的。下一步他想试两件事:一是用扩散模型代替自回归来做屏幕更新,二是训几千个随机生成的小应用、每个有自己的控件和规则,看模型能不能凭上下文线索预测一个从没见过的应用的行为。后者如果成了,"应用不用写、只用学"就从哲学变成工程路线了。

小听: 最后一问,给中文开发者一句话:这个项目最值得带走的是什么?

陈默: 两句话。第一,世界模型不一定非要从像素和游戏开始,找一个离散、可无限合成数据、可精确测量的小世界,先把"一致性"这件事做扎实——终端就是这么个完美沙盒。第二,指标会骗人:99% 的 token 准确率保不住 0% 的记忆,做压缩、做蒸馏、做量化的人,都该给自己的能力单独设一个"世界一致性"测试。哦对了,demo 在线就能玩,208MB,Chrome 打开,试着把它玩坏,作者等着你的 bug 报告。

参考链接

// related: searching nearest posts...
# comments