敲下 rm -r ghost_test,屏幕没有立刻回到提示符。一行字浮出来:“我的小实验……化为尘土了。”这不是彩蛋脚本,是一个跑在本地的开源模型在实时回应你刚才做的事。
![]()
这个项目叫 Haunted Terminal,作者把它定义成一个“被幽灵附身的 shell”。你输入的是真命令——ls、mkdir、git status、rm,执行方式和普通终端没有区别。区别在于每条命令之后,一个幽灵会针对你刚做的事说一句话,短、阴森、始终在角色里。
删东西它会哀悼,跑 sudo 它当成一次危险的召唤,命令失败它会温和地嘲笑你。你退出时它道别,并且把整段会话写进 haunting_*.md 日志——像一本幽灵替你记下的日记。
作者放出的演示是一段真实会话,没有摆拍。输入 ls,幽灵说“活人的文件,多么……乏味”。新建目录,它说“现在这是我的新家了”。sudo whoami 因为要密码而失败,它回一句“小家伙还在学,我猜”。退出时它说,你的离开不会让它沉默,它在这冰冷回响的厅堂里,已经看过无数像你一样的人。
不背台词,靠提示词约束
这些回应不是预先写好的分支。作者强调,幽灵从不会逐字复述你的命令,也不会跳出角色做解释,这一点由提示词强制,而非脚本匹配。演示里的每一句都直接来自模型。
模型是本地跑的开放权重模型 Llama 3.2,通过 Ollama 调用。整个项目只有一个 Python 文件,只用标准库,除 Ollama 本身外没有其他依赖。作者在一台 Ubuntu 笔记本上构建和测试,15 GB 内存,没有 GPU。
第一版有个明显问题:幽灵偶尔会破功——冒出带星号的舞台提示、引用原句,或者用四十个词解释刚才的笑点。作者把系统提示词收紧,明确禁止引号、星号和解释,并限制为一行纯文本、最多 20 个词。仅这一项就解决了绝大部分问题。作者的观察是,小模型对硬性约束的服从度,远高于“保持简短”这类软性建议。
只看意图,不看输出
幽灵能看到的只有命令文本,以及这条命令成功还是失败,从不接触命令的实际输出。这是有意为之:输出可能极大、可能敏感、可能是二进制,幽灵不需要读你的 secrets.env 才能对你运行它这件事作出反应。按“你刚做了哪类事”来回应——删除、召唤 root、失败——既更简单,也更好笑。
容错也做了处理。如果 Ollama 没在运行,这个 shell 依然是一个完全正常的 shell,幽灵只是安静下来,而不是把整个程序弄崩。用作者的话说,闹鬼是附加项,不是依赖项。
长时间会话里,每条 ls 都点评一遍很快会腻,所以有 --quiet 模式:只在真正有意思的命令上触发幽灵,包括 rm、sudo、git、mv、kill、chmod、chown,以及任何执行失败的命令。
为什么非要跑在本地
作者给出的理由很直接。模型拉下来之后,幽灵可以完全离线地缠着你,没有联网检查,没有“服务不可用”,飞机上也能有一个被附身的 shell。
终端历史是机器上最私密的东西之一:敲了一半的命令、文件路径、项目名,偶尔还有粘贴进去又立刻后悔的密钥。这些不该为了换一句玩笑而发往云端 API。本地运行意味着它们从不离开这台笔记本。
另一个理由是成本。这个工具的设计前提是长期开着,只有幽灵对整场会话、每一天的每条命令都点评,这个玩笑才成立。按调用计费的 API 会把玩具变成账单,而一个本地的 3B 模型让“永远缠着我”不花钱。
还有一层考虑:这是一个 silly 的个人工具,恰恰是那种一旦云服务商下线所依赖的模型就会被遗弃的东西。已经下载到本地的开放权重,不会在某天从一句玩笑底下被停掉。
想试的话,流程是克隆仓库、进入目录、执行 ollama pull llama3.2、再运行 python3 haunted_terminal.py。输入 exit 或 quit 离开时,幽灵会拿到最后一句台词。
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.