这是为以下活动提交的作品Hacktoberfest 开源 AI 挑战赛第 4 周:机器中的幽灵
我构建了什么
有些记忆并不足够戏剧化,无法成为历史。
它们是倒茶前先温好的杯子。
黄昏时分从旧收音机里传出的歌声。
花园里的一条黄色纱丽。
某个人说“再待一会儿吧”时的确切语气。
这些细节很容易丢失,因为它们太过平常。但平常的细节,往往正是一个人继续存在于我们生活中的地方。
所以我构建了Marigold /router:一个离线优先的口述历史工作室与虚拟祭坛(ofrenda),用于收集家庭记忆、照片、食谱和语音笔记。
这是一个保存重要之物的地方,而不会把所爱之人变成一个聊天机器人。
核心理念很简单:
Marigold 会记住你给它的东西。它拒绝编造你未曾提供的内容。
这个项目的灵感来自挑战主题,机器中的幽灵,以及记忆与人工智能之间的张力。
机器可以检索一段记忆。
它可以帮忙整理一段记忆。
它可以转写一段录音。
但它不应假装成为录音中的那个人。
这条边界正是 Marigold 的核心。
演示
💻源代码: https://github.com/kumudasrip/marigold-router
🎬演示: https://youtu.be/t74MdHNO8nM?si=TRmUi6bRflMOHTtK
Marigold 目前只在本地运行,因为隐私是产品的一部分,而不只是部署上的限制。
运行浏览器应用
gitclonehttps://github.com/kumudasrip/marigold-router.gitcdmarigold-routerpy-mhttp.server4173
打开:
该档案无需账户、数据库或云服务即可使用。
要获得完整的 AI 体验,请安装 Ollama 并拉取本地 Gemma 模型:
ollamapullgemma4:e4b
可选的 Faster-Whisper 服务可实现真正的音频转文字转写。
Marigold 能做什么
1. 构建私密记忆档案
你可以添加:
- 文字故事
- 照片
- 语音笔记
- 年份和日期
- 来源与家庭背景
- 主题标签
记忆存储在浏览器的本地存储中。没有账户系统,也不需要云数据库。
该档案包含搜索、筛选、时间线和记忆详情抽屉,以便日后重新查看这些细小的片段。
2. 创建一个类似祭坛(ofrenda)的记忆空间
我希望这个界面感觉像一个保存记忆的场所,而不是又一个仪表盘。
设计使用了:
- 万寿菊橙
- 烛光黄
- 赤陶色
- 深祭坛红
- 灵感来自羊皮纸的表面
- 一个手工制作的 Marigold /router 标志
- 灵感来自 papel picado 和祭坛布置的装饰细节
视觉语言刻意保持温暖。档案应该足够平静,让人能在一段记忆中停留一会儿。
3. 询问 Ofrenda Guide
Guide 让你可以就档案提问。
例如:
What did they love to cook?
如果档案中包含相关记忆,Guide 会检索它并指向来源。
如果档案中不包含答案,它会说:
“那段记忆还不在档案里。我不会用猜测来填补沉默。”
这是应用中最重要的一项行为。
有说服力的答案并不总是负责任的答案。
4. 在本地转写语音笔记
一条语音笔记可能包含某人永远不会坐下来打字的细节。
Marigold 可选地通过一个小型本地 FastAPI 服务使用 Faster-Whisper:
Audio file
↓
Local Faster-Whisper service
↓
Transcript
↓
Memory saved in the browser archive
音频被发送到127.0.0.1,而不是发送到托管的转写服务提供商。
转写文本会附加到已保存的记忆上,而原始音频仍可在浏览器档案中本地获取。
5. 导出档案
档案可以导出为独立的 HTML 文件。
导出的纪念页面包括:
- 记忆标题
- 文字细节
- 日期
- 来源
- 标签
- 上传的照片
目标是让档案可移植,而无需 Marigold 服务器。
我是如何构建它的
Marigold 刻意采用一套小型、易于理解的技术栈构建:
- HTML用于应用结构
- CSS用于响应式的 ofrenda 风格设计
- 原生 JavaScript用于档案交互和本地状态
- 浏览器 localStorage用于私密记忆的持久化
- Ollama用于本地模型推理
- Gemma 4 e4b用于策展和有依据的 Guide 回复
- Faster-Whisper用于本地多语言转写
- FastAPI用于可选的本地转写服务
- Uvicorn用于运行 Whisper 服务
没有必需的 npm 构建步骤,也没有 Marigold 后端。
主应用直接与 Ollama 通信:
Marigold browser app
│
├── localStorage
│
├── Ollama
│ └── Gemma 4 e4b
│
└── FastAPI localhost service
└── Faster-Whisper
AI 真正发挥作用的地方
我不想仅仅因为挑战标题里有“AI”就加入 AI。
本地模型有真实且有限的职责。
1. 策划主题
策展人读取档案上下文,并建议诸如以下主题线索:
- 厨房
- 花园
- 音乐
- 仪式
- 归属感
这些只是建议,并非关于某个人的事实。
2. 基于档案的检索
Ofrenda Guide 接收档案上下文和用户的问题。
它被指示:
- 仅依据档案作答
- 绝不冒充逝者
- 绝不编造缺失的细节
- 返回来源引用
- 拒绝缺乏依据的问题
前端还保留了一个确定性的回退检索模式,这样即使 Ollama 离线,应用仍然可用。
3. 转录文本清理
当把转录文本粘贴到 AI Studio 时,Gemma 可以帮助清理标点和段落分隔,同时保留原意。
4. 音频转录
Faster-Whisper 在本地处理实际的语音转文字转换。
这一点尤其有用,因为口述历史往往说起来比打字更容易。
为什么选择 Gemma 和本地推理?
用云端模型本可以让第一个演示更简单。
但记忆档案恰恰是那种不应默认把所有内容都发送到远程 API 的应用。
使用 Ollama 和 Gemma 让这个项目:
- 更私密
- 无需 AI 订阅即可使用
- 更透明
- 更容易离线运行
- 更容易检查和修改
- 不受托管 API 限额变化的影响
模型可以在本地替换,而无需改变产品架构。
用户掌控推理在哪里进行。
当数据包含家族故事、哀伤、文化历史或私人录音时,这一点很重要。
为什么开放创新很重要?
开放创新在这里很重要,因为这个项目依赖于信任。
封闭的 API 也许能给出精致的答案,但会让人更难理解:
- 答案从何而来
- 哪些数据离开了设备
- 是哪个模型生成了回答
- 模型出错时会发生什么
- 该服务是否会持续可用
借助本地、开放的工具,系统更易于检查。
人们可以看到:
- 记忆存储在浏览器存储中
- Ollama 通过本地端点调用
- Faster-Whisper 在 localhost 上运行
- Guide 的提示词明确禁止冒充
- 缺乏依据的回答会回退为拒绝
- 导出在本地生成
开放创新让构建一个隐私不只是营销口号的项目成为可能。它是实现的一部分。
它也让实验变得触手可及。我可以把静态前端、Ollama、Gemma、Faster-Whisper 和 FastAPI 组合起来,而不需要付费的基础设施栈或大型生产后端。
我在构建过程中学到了什么
本地 AI 并不自动等同于负责任的 AI
在本地运行模型能提升隐私,但并不会自动让输出变得可信。
重要的工作在于界定模型应该拒绝做什么。
Guide 不允许重现某个人,也不允许自信地填补缺失的历史。拒绝行为与成功回答同样重要。
小模型需要清晰的边界
当提示词范围狭窄、预期输出明确时,本地模型表现更好。
对于策展,Marigold 要求输出结构化 JSON。
对于 Guide,它提供带编号的档案条目,并期望返回引用索引。
对于转录清理,它要求模型保留每一个词和每一层含义。
任务越具体,本地模型就越有用。
回退机制很重要
Ollama 可能没有在运行。
Whisper 可能没有安装。
模型可能响应太慢。
档案仍应能打开、搜索、保存记忆,并提供诚实的回退行为。
AI 是对档案的增强,而不是其他一切所依赖的基础。
UI 是情感设计的一部分
记忆档案不能让人感觉像管理后台。
视觉设计需要在用户点击任何 AI 按钮之前就传达出关怀。
温暖的色调、祭坛风格的布局、蜡烛细节和万寿菊品牌,都是让这个项目感觉像一个人们愿意回来的地方的一部分。
负责任的 AI 决策
Marigold 遵循几条简单的规则:
- 不要冒充逝者。
- 不要编造记忆。
- 不要把猜测当作家族历史呈现。
- 展示检索到的信息来自哪里。
- 信息缺失时要说明。
- 默认将数据保留在本地。
- 演示时使用合成数据或经同意的数据。
- 把浏览器存储视为便捷的本地持久化,而非加密。
这个项目并不是想造一个幽灵。
它试图让围绕一段缺失记忆的沉默变得诚实。
它的精神
让我久久难忘的,并不是模型给出了一个聪明的回答。
而是它的拒绝。
我问了 Guide 一件实际上并不存在于档案中的事,它没有编造一个听起来温暖的回答,而是说那段记忆还不在那里。
这比一个完美的回答更有意义。
因为悲伤本身已经包含了足够多想象中的对话。
一个用于记忆的工具不应该假装它能把某人带回来。
它应该帮助我们留住那些真正被说出口、被拍下、被录下、被烹饪、被歌唱、被生活过的东西。
这就是 Marigold /router 的用途:
一份爱的记录,而非一次重建。
奖项类别
- Gemma 最佳应用
代码
https://github.com/kumudasrip/marigold-router
该仓库包含以下各项的设置说明:
- 静态浏览器应用
- Ollama 和 Gemma 4 e4b
- Faster-Whisper
- 本地 FastAPI 转写服务
- 隐私与故障排查说明