这是参加Hacktoberfest 开源 AI 挑战赛第 1 周:Touch Grass 的参赛作品
我构建了什么
我天生是个内向的人,但在社会意义上是个外向的人。在会议或任何正式场合,我都没问题,主要是因为有一个说话的理由。我真正挣扎的是在没必要的时候和人交谈,也就是我们所说的闲聊,尤其是和一个我并不一定需要交谈的人。
所以当主题是“Touch Grass”时,我不想要又一个告诉你去散步的应用。出门对内向着来说并不是难的部分。和外面的人交谈才是。许多社交应用帮助你与人交谈,但几乎所有这些应用都让你隔着屏幕交谈。这个应用恰恰相反。它让你与周围的世界交谈:那些你每天都会路过、却从未真正说过话的人。它关乎意识到每一个随机的路人都在过着和你自己一样生动、复杂、情感丰富的生活。这就是这个应用背后的理念。
Sonder 就是为此而设的每周游戏。它让你更容易与周围的人建立联系,而不必承受走向陌生人并想好该说什么的压力。因为有时候,把一个陌生人变成朋友只需要一点点推动。每周你都会在便利贴上得到几个任务,设置在你真正会去的地方。它带有两个难度等级(简单、还行和可怕)
你在现实世界中完成任务,回来,写下你发现的东西。Gemma 像朋友一样回复,你的笔记会积累成一堵不再陌生的人墙。它适合任何每天路过同样面孔、却从不多说一句“早上好”的人。
它如何运作
- 告诉它你平常的一周。选择你真正会去的地方(市场、办公室、健身房、公交站、教堂或清真寺、海滩等等),或者添加你自己的。
- 选择你的挑战。简单、还行或可怕(见下文)。
- 获取你的一周。Gemma 为你的地点写出一组混合的任务。每个任务都有一句你真正能说出口的开场白。
- 去完成它们。写下你发现的东西。Gemma 回复的是你学到的东西,而不是任务。
- 看着你的墙不断增长。People 标签页会按周保存每一条笔记。
设置让你可以随时更改地点、等级和每周任务数。新任务把你还没开始的换掉,保留你已经完成的。
三个等级
| 等级 | 一个任务长什么样 | 示例 |
|---|---|---|
| 简单 | 一个快速问题,一分钟以内 | 在公交站问别人哪路车能到你知道的某个地方 |
| 还行 | 一次轻松的聊天,带一个简单的追问 | 让健身房的常客给你演示一个他深信不疑的动作 |
| 吓人 | 一次真正的对话 | 问市场上一位年长的摊主,这些年变化最大的是什么 |
每周都会混合任务类型,所以没有哪两周是相同的。一共有 14 种类型,从记住一个名字和问路一直到起源故事和回访(回去找你之前见过的人)。
一个真实的任务,从头到尾
Gemma 生成任务:
任务会显示出来。
对任务给出反馈。你学到了什么?
查看你互动过的所有陌生人:
“晚上,因为他试了一周早上,结果上班时犯困。”这就是我健身房里一个不再是陌生人的人。
没感觉?带原因跳过。“感觉不安全”会自动把你切换到稳妥模式。
演示
Sonder 运行在我的笔记本电脑上,所以没有公开链接。它还会存储关于你见过的真实人物的笔记,所以它运行在你自己的笔记本上,而不是服务器上。想试用的话,克隆仓库并按照 README 里的三个步骤操作。如果你已经安装了 Ollama,大约需要五分钟。
下面的视频展示了它在我 MacBook 上的运行效果。
我把它带到了外面
我的第一个任务是简单级别的:问问你的理发师,现在大家都在要什么发型。于是我去剪了个头发,问了我的理发师 Tobi。我已经找他剪了一段时间,除了“老样子”之外,我从没真正问过他什么。他的回答是:大家都想染发。😂
这变成了一整段对话。他提醒我,一个月前我来的时候说过想染发,还吐槽我从来没回来染。
我把它记在了 Sonder 里,Gemma 回复说:
“真的吗?大家都在染发?太疯狂了,大家具体要的是什么颜色?”
这很合理。我没问。那是我下次剪发时的追问。Sonder 有一个你所有对话的画廊。
代码
Bennykillua/sonder
一个每周游戏,让你和每天擦肩而过的人交谈。便利贴上的小任务,由本地运行的 Gemma 编写。你的笔记永远不会离开你的笔记本电脑。
Sonder
出门从来都不是难事。打招呼才是。
sonder(名词):意识到你路过的每一个陌生人,都拥有和你一样生动而复杂的人生。
Sonder 是一个每周游戏,让你和每天擦肩而过的人交谈。你会收到几张便利贴上的小任务,设定在你实际会去的地方。你在现实世界中完成它们,写下你了解到的东西,Gemma 会像朋友一样回复你。随着时间推移,陌生人变成了名字。
它完全运行在你自己的机器上,Gemma 通过 Ollama 在本地运行。
问题所在
我是个内向的人。在会议或任何正式场合,我都没问题,因为说话有理由。在我不必说话的时候和人交谈,才是难的部分。
大多数“出门走走”类应用都叫你去户外。出门从来不是我的问题。Sonder 是……
MIT 许可,在挑战赛期间构建。后端就是一个 Python 文件。README 说明了如何用三条命令在本地通过 Ollama 运行它。
我是如何构建的
技术栈刻意保持精简:
- Gemma,通过 Ollama 在本地运行
- 我笔记本电脑上的 FastAPI 和 SQLite
- 整个界面就是一个 HTML 页面,在手机上打开。我把它做得古怪又有趣
有意思的部分不是技术栈。而是让一个小模型写出值得做的任务。
Gemma 做什么
- 编写你的一周。它把你的地点和你的挑战等级转化为一组任务,每个任务都有一个你真正说得出口的开场白,对于 Fine 和 Scary 等级,还有一个后续问题。
- 回复你了解到的东西。当你完成一个任务并写下笔记时,Gemma 会针对你遇到的人作出回应,就像朋友在短信里那样。
应用如何围绕一个小型本地模型构建
小模型快速且私密,但它们会照抄示例、偏离要求。所以应用给 Gemma 的是结构而非自由:
- 在 Gemma 写任何东西之前,每一周都已被规划好。应用把一周拆分成多个时段,每个时段分配一种任务类型(共 14 种,从“Learn a name”到“Origin story”)以及你的一个地点。Gemma 为每个时段写一个任务,因此整周保持多样,并与你实际会去的地方绑定。
- Gemma 返回结构化 JSON。Ollama 的结构化输出意味着每个任务都带有相同的字段:task、opener、follow-up 和 place。
- 每个任务在你看到之前都会在代码中检查。如果它是标签而不是任务、是闲聊、是自身提示的复制、太长而说不出口、设在你没有选择的地点,或是重复内容,就会被丢弃。
-
安全规则在代码中强制执行,而不只是在提示中:
- 绝不询问婚姻、部落、政治、金钱或年龄,也绝不索要电话号码或照片
- 完全不问信仰问题
- 医院任务仅限工作人员
- 酒吧或饮品店不涉及酒精
- “Play it safe”模式会把一切限制在商店和排队场景中
- 83 个备用任务填补任何空缺,因此模型的一次糟糕运行绝不会让你面对空白的一周。
- 周计划在后台生成。手机每隔几秒检查一次,因此慢速模型绝不会让应用卡死。
为什么开放创新很重要?
因为 Sonder 存储的内容。它是一本日记,记录你交谈过的每个人、他们告诉你的内容,以及你因为觉得尴尬或不安全而跳过的对话。我不会把这些发送到我无法控制的服务器,我也不认为其他人应该这样做。
这也是没有托管版本的原因:一旦我托管它,你的笔记就存在我的服务器上。
借助本地运行的开放模型:
- 没有任何东西离开我的笔记本电脑。Gemma、任务和笔记全都存在我的机器上。
- 运行不花钱。这在尼日利亚很重要,因为按请求付费会迅速累积。
- 我可以自己选择速度与质量的权衡。我试过 gemma3:1b,它大约 2 秒就能写完一周,但生成的任务更平淡。我换回 gemma3:4b 以获得更好的任务,并让它常驻内存,这样你打开应用时它就绪了。如果使用封闭 API,这个选择就不由我做。
- 安全过滤器在我的代码里,任何人都可以在仓库中阅读它们。
我的智能体会话
我没有 DevRelay 会话可以分享。我并不是用 Claude Code 构建 Sonder 的。我在聊天中用 Claude 作为结对程序员:它起草代码、帮我规划应用,并帮我修复 bug。所有事情都由我来运行,我在自己的手机上以及和多位朋友一起测试,用 Claude Code 调试,并决定哪些保留下来。
奖项类别
- Gemma 最佳应用
Gemma 在 Sonder 中承担两项工作。两者都通过 Ollama 在本地运行,在我的笔记本电脑(一台 MacBook)上使用 gemma3:4b:
- 任务撰写者。每周,应用会为每个任务给 Gemma 一份简要说明:一个任务类型、你的一个地点,以及你的挑战等级。Gemma 会写出任务、一句你真正能说出口的开场白,并在 Fine 和 Scary 等级下写一个后续问题。它以结构化 JSON 返回这些内容,代码会在你看到每个任务之前进行检查。
- 回复的朋友。当你完成一个任务并写下你发现的内容时,Gemma 会回复你遇到的那个人,而不是回复任务,就像朋友之间发短信一样。
在本地运行 Gemma 意味着你关于真实人物的笔记永远不会离开你的机器,而且 Sonder 每次请求都零成本。
独立构建。
如果你自己运行 Sonder,告诉我你希望看到哪些功能,或者我可以如何改进它。
另外,如果你对尝试它还有些犹豫,想想这句走红网络的引语:“在追求人际连接的过程中,稍微让自己出点丑也没关系”,这句话源自Bianca Sparacino
在一个寻求连接的世界里,我们却奇怪地回避眼神接触,我们掐着时间回复短信,以免显得太急切或太感兴趣,我们压抑自己的感受,因为不想显得过于情绪化或不讲道理。我们让自己的本能沉默,到头来,我们非但没有对自己感觉良好,反而感到孤独,感到被误解。记住——情绪化没关系,寻求帮助没关系,自信地告诉你喜欢与之相处的人你对他们着迷也没关系。脆弱没有错,做一个人也没有错,因为正是这造就了我们关系的深度,也正是这最终将我们联结在一起。












