这是参加Hacktoberfest 开源 AI 挑战赛第 1 周:Touch Grass 的参赛作品

我构建了什么

我天生是个内向的人,但在社会意义上是个外向的人。在会议或任何正式场合,我都没问题,主要是因为有一个说话的理由。我真正挣扎的是在没必要的时候和人交谈,也就是我们所说的闲聊,尤其是和一个我并不一定需要交谈的人。

The quests Gemma generated on Sonder

所以当主题是“Touch Grass”时,我不想要又一个告诉你去散步的应用。出门对内向着来说并不是难的部分。和外面的人交谈才是。许多社交应用帮助你与人交谈,但几乎所有这些应用都让你隔着屏幕交谈。这个应用恰恰相反。它让你与周围的世界交谈:那些你每天都会路过、却从未真正说过话的人。它关乎意识到每一个随机的路人都在过着和你自己一样生动、复杂、情感丰富的生活。这就是这个应用背后的理念。

Sonder 就是为此而设的每周游戏。它让你更容易与周围的人建立联系,而不必承受走向陌生人并想好该说什么的压力。因为有时候,把一个陌生人变成朋友只需要一点点推动。每周你都会在便利贴上得到几个任务,设置在你真正会去的地方。它带有两个难度等级(简单、还行和可怕)

你在现实世界中完成任务,回来,写下你发现的东西。Gemma 像朋友一样回复,你的笔记会积累成一堵不再陌生的人墙。它适合任何每天路过同样面孔、却从不多说一句“早上好”的人。

它如何运作

  1. 告诉它你平常的一周。选择你真正会去的地方(市场、办公室、健身房、公交站、教堂或清真寺、海滩等等),或者添加你自己的。
  2. 选择你的挑战。简单、还行或可怕(见下文)。
  3. 获取你的一周。Gemma 为你的地点写出一组混合的任务。每个任务都有一句你真正能说出口的开场白。
  4. 去完成它们。写下你发现的东西。Gemma 回复的是你学到的东西,而不是任务。
  5. 看着你的墙不断增长。People 标签页会按周保存每一条笔记。

设置让你可以随时更改地点、等级和每周任务数。新任务把你还没开始的换掉,保留你已经完成的。

三个等级

等级 一个任务长什么样 示例
简单 一个快速问题,一分钟以内 在公交站问别人哪路车能到你知道的某个地方
还行 一次轻松的聊天,带一个简单的追问 让健身房的常客给你演示一个他深信不疑的动作
吓人 一次真正的对话 问市场上一位年长的摊主,这些年变化最大的是什么

每周都会混合任务类型,所以没有哪两周是相同的。一共有 14 种类型,从记住一个名字和问路一直到起源故事和回访(回去找你之前见过的人)。

一个真实的任务,从头到尾

Gemma 生成任务:

Gemma generates the quests

任务会显示出来。

Quests are displayed

对任务给出反馈。你学到了什么?

Give feedback on the quest

查看你互动过的所有陌生人:

People wall

“晚上,因为他试了一周早上,结果上班时犯困。”这就是我健身房里一个不再是陌生人的人。

没感觉?带原因跳过。“感觉不安全”会自动把你切换到稳妥模式。

Skipping a quests

或者更改设置。
Setting

演示

Sonder 运行在我的笔记本电脑上,所以没有公开链接。它还会存储关于你见过的真实人物的笔记,所以它运行在你自己的笔记本上,而不是服务器上。想试用的话,克隆仓库并按照 README 里的三个步骤操作。如果你已经安装了 Ollama,大约需要五分钟。

下面的视频展示了它在我 MacBook 上的运行效果。

我把它带到了外面

我的第一个任务是简单级别的:问问你的理发师,现在大家都在要什么发型。于是我去剪了个头发,问了我的理发师 Tobi。我已经找他剪了一段时间,除了“老样子”之外,我从没真正问过他什么。他的回答是:大家都想染发。😂

这变成了一整段对话。他提醒我,一个月前我来的时候说过想染发,还吐槽我从来没回来染。

我把它记在了 Sonder 里,Gemma 回复说:

“真的吗?大家都在染发?太疯狂了,大家具体要的是什么颜色?”

Gemma response to my quest

这很合理。我没问。那是我下次剪发时的追问。Sonder 有一个你所有对话的画廊。

Sonder's gallery

代码

GitHub logo Bennykillua/sonder

一个每周游戏,让你和每天擦肩而过的人交谈。便利贴上的小任务,由本地运行的 Gemma 编写。你的笔记永远不会离开你的笔记本电脑。

Sonder

出门从来都不是难事。打招呼才是。

sonder(名词):意识到你路过的每一个陌生人,都拥有和你一样生动而复杂的人生。

Sonder 是一个每周游戏,让你和每天擦肩而过的人交谈。你会收到几张便利贴上的小任务,设定在你实际会去的地方。你在现实世界中完成它们,写下你了解到的东西,Gemma 会像朋友一样回复你。随着时间推移,陌生人变成了名字。

它完全运行在你自己的机器上,Gemma 通过 Ollama 在本地运行。

Gemma FastAPI SQLite License: MIT Hacktoberfest 2026

A week of quests on sticky notes An open quest with an opener and a follow-up The People wall with a finished note

问题所在

我是个内向的人。在会议或任何正式场合,我都没问题,因为说话有理由。在我不必说话的时候和人交谈,才是难的部分。

大多数“出门走走”类应用都叫你去户外。出门从来不是我的问题。Sonder 是……



MIT 许可,在挑战赛期间构建。后端就是一个 Python 文件。README 说明了如何用三条命令在本地通过 Ollama 运行它。

我是如何构建的

技术栈刻意保持精简:

  • Gemma,通过 Ollama 在本地运行
  • 我笔记本电脑上的 FastAPI 和 SQLite
  • 整个界面就是一个 HTML 页面,在手机上打开。我把它做得古怪又有趣

有意思的部分不是技术栈。而是让一个小模型写出值得做的任务。

Gemma 做什么

  1. 编写你的一周。它把你的地点和你的挑战等级转化为一组任务,每个任务都有一个你真正说得出口的开场白,对于 Fine 和 Scary 等级,还有一个后续问题。
  2. 回复你了解到的东西。当你完成一个任务并写下笔记时,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,这个选择就不由我做。

gemma3:4b loaded

  • 安全过滤器在我的代码里,任何人都可以在仓库中阅读它们。

我的智能体会话

我没有 DevRelay 会话可以分享。我并不是用 Claude Code 构建 Sonder 的。我在聊天中用 Claude 作为结对程序员:它起草代码、帮我规划应用,并帮我修复 bug。所有事情都由我来运行,我在自己的手机上以及和多位朋友一起测试,用 Claude Code 调试,并决定哪些保留下来。

奖项类别

  • Gemma 最佳应用

Gemma 在 Sonder 中承担两项工作。两者都通过 Ollama 在本地运行,在我的笔记本电脑(一台 MacBook)上使用 gemma3:4b:

  1. 任务撰写者。每周,应用会为每个任务给 Gemma 一份简要说明:一个任务类型、你的一个地点,以及你的挑战等级。Gemma 会写出任务、一句你真正能说出口的开场白,并在 Fine 和 Scary 等级下写一个后续问题。它以结构化 JSON 返回这些内容,代码会在你看到每个任务之前进行检查。
  2. 回复的朋友。当你完成一个任务并写下你发现的内容时,Gemma 会回复你遇到的那个人,而不是回复任务,就像朋友之间发短信一样。

在本地运行 Gemma 意味着你关于真实人物的笔记永远不会离开你的机器,而且 Sonder 每次请求都零成本。

独立构建。


如果你自己运行 Sonder,告诉我你希望看到哪些功能,或者我可以如何改进它。

另外,如果你对尝试它还有些犹豫,想想这句走红网络的引语:“在追求人际连接的过程中,稍微让自己出点丑也没关系”,这句话源自Bianca Sparacino

在一个寻求连接的世界里,我们却奇怪地回避眼神接触,我们掐着时间回复短信,以免显得太急切或太感兴趣,我们压抑自己的感受,因为不想显得过于情绪化或不讲道理。我们让自己的本能沉默,到头来,我们非但没有对自己感觉良好,反而感到孤独,感到被误解。记住——情绪化没关系,寻求帮助没关系,自信地告诉你喜欢与之相处的人你对他们着迷也没关系。脆弱没有错,做一个人也没有错,因为正是这造就了我们关系的深度,也正是这最终将我们联结在一起。