一个叫 Legacy Lantern 的项目,把“纪念”这件事做成了完全离线的工具。你给它一个名字、一段关系、几件喜欢的事,还有一个至今仍带在身上的瞬间,它把这些细节变成一段短短的纪念文字。关键在于,这段记忆不会离开浏览器。

作者对“机器中的幽灵”的理解,不是被鬼魂附身的机器,而是机器里那点人的痕迹——那些模型本来永远不可能知道的细节,直到有人主动选择把它们保存下来。视觉语言取自墨西哥亡灵节:万寿菊的橙色、烛光,以及一种邀请——用温暖去记住,而不是把悲伤变成景观。

最硬的约束是隐私。家庭记忆里可能有名字、有家族历史、有传统、有私密细节。作者不想让“私密”意味着“我们承诺我们的接口会小心处理”,他要的是根本不存在接口请求。

首次使用时,Legacy Lantern 会下载一个量化后的开放权重模型。此后生成全部在设备上完成,模型留在浏览器缓存里。纪念文字可以复制,也可以作为纯文本下载。作者在 Chromium 里跑通了完整路径:模型下载、本地推理、渲染、复制与导出控件,以及可离线使用的应用外壳。

技术栈刻意做得很小:

  • 模型是 Qwen2.5-1.5B-Instruct,使用 Hugging Face 社区维护的量化 ONNX 版本,通过 Transformers.js 在浏览器内运行,优先用 WebGPU,回退到 WASM;
  • 界面是静态响应式的,没有框架,没有构建步骤;
  • 没有账号、没有分析、没有数据库、没有 Cookie、没有服务端推理;
  • 纯文本导出,纪念文字不被锁在应用里;
  • 模型加载进度可见,WASM 回退覆盖更多硬件。

提示词在本地由表单拼装,要求模型只写一段简短的致敬文字,限定在用户提供的细节内,并明确告诉它不要编造生平或信仰。这条指令是在一次早期测试后收紧的——当时模型忽略了要求的语言。作者由此得到一个提醒:“它跑起来了”和“它跑对了”不是一回事。

代价是首次模型下载。它比调用托管接口大得多,也慢得多。作者最初试过 360M 和 500M 参数的模型,但两者都太容易编造细节,对一个纪念工具来说不可接受。选 1.5B 是有意的取舍:质量优先于下载体积。换来的是,后续生成不需要把记忆披露给第三方。

开放权重改变了信任边界。用闭源推理接口,每一段纪念都要穿过网络,落到家庭无法控制的设施上,隐私政策要承担全部重量。在这里,模型权重和运行时来到记忆身边,记忆不去它们那里。开放也让项目更耐久:模型可以被检查、替换、换一种量化方式,或者归档;界面可以在供应商改价或关停接口后继续存在。对一个关于让故事活下去的项目来说,依赖一个可能消失的服务,是错误的架构。

作者的测试记忆很小:一位祖母,她的厨房在周日闻起来像肉桂,做面包从不称量,洗碗时哼着波莱罗。这种具体性正是重点。通用模型知道“祖母”是什么,但它不知道那个厨房、那首歌、那个周日。人提供灵魂,模型只帮忙把灯笼的框架撑起来。