打开冰箱,盯着看,关上。五分钟后,再打开,再看,还是说不清牛奶是没了还是只剩一点。等真正坐下来写购物清单,刚才看到的东西已经忘了一半。

打开网易新闻 查看精彩图片

这是开发者Vikram在Hacktoberfest开源AI挑战第三周交出的作品起点。那一周的主题叫"Slow and Steady"——做一个奖励懒惰的东西。于是他做了SlothList:一个替你看冰箱和食品柜的工具。

它的逻辑简单到近乎无礼:你最多拍三张照片,视觉模型判断哪些是满的、哪些快没了、哪些已经空了,文本模型再把结果整理成一份分类清晰的购物清单,顺手写好一条可以直接发出去的WhatsApp消息。谁去买菜,把消息转过去就行,连重打一遍都省了。

最懒的部分是"常备品"

你只需要输入一次那些永远想补货的东西——牛奶、鸡蛋、咖啡,随便什么。此后每一份清单都会自动带上它们,拍没拍照都一样。如果连拍照都懒得拍,还有一个"重排上次清单"按钮,一键用上一次的结果加常备品重建清单,零新输入。

演示里,SlothList扫描一层货架后,正确跳过了那盒满的鸡蛋,抓到了快见底的牛奶和黄油,还把他没提过的咖啡和卫生纸自动并了进去。生成的WhatsApp消息长这样:

  • 牛奶(1升)
  • 黄油(500克)
  • 咖啡(1包)
  • 卫生纸(2包)

让视觉模型别瞎编

整套东西跑在一台没有GPU的普通笔记本上:Ubuntu、15GB内存,通过Ollama调用开放权重模型,一个Python文件,Flask加Pillow,没有API密钥,除了Ollama不依赖外部服务。

开发过程中踩到的第一个坑是幻觉。小视觉模型在照片模糊或内容不多时,会"想象"出一个整洁、符合预期的冰箱。所以提示词里明确写着:只列出你真正看得见的物品,不要编造。同时模型还要报告它实际观察到的内容,结果显示在结果页上,供人核对。

第二个坑更关键。早期版本里,视觉模型只把物品标成"有"或"没有",这基本没用——你不想因为看见一个牛奶盒就把牛奶写进清单,你想的是盒子快空了才写。把状态拆成满、低、空三档,只把低和空的物品拉进购物清单,输出才真正可用。

常备品的优先级则被写死在清单构建的提示词里:无论状态如何,每一项常备品都必须包含,与扫描结果分开处理。这一刀把"冰箱里现在有什么"和"我永远想家里有什么"彻底解耦,也正是常备品功能的意义所在。

为什么非要本地跑

冰箱是私密的地方。一张内部的照片能透露很多——饮食结构、预算、家里住几个人、有没有人出门在外。把照片交给一个常驻云端、内置分析和广告定向的应用,和让视觉模型在本地或通过单次Ollama云调用完成,是两回事。

懒惰只有在免费时才成立。这个应用的全部卖点就是"设置一次,然后什么都不做",按次计费的API会直接拆掉这个前提——你会开始 ration 自己的懒惰,那就本末倒置了。开放权重模型让"随便用、不用想成本"变成真的。

还有一层:一个你不再惦记的工具,恰恰是云服务商下架模型或改价时会悄悄坏掉的那种工具。开放权重不会被从脚下抽走。

想试的话,克隆仓库、装依赖、运行app.py,打开本地5000端口即可;手机连同一个WiFi也能直接访问,站在厨房里就能拍。这个挑战上线时正好赶上10月20日的国际树懒日——愿你的冰箱常满,付出最少。