一个私有可控的推荐系统

某个晚上,我躺在床上刷 X 的 For You,刷了半小时。放下手机的时候有点烦躁,说不清为什么。

试着回想刚才看了什么,能记起来的只有三条:两个我不认识的人在吵架、一条某国政变的突发新闻、一个猫咪的 meme。没有一条是我主动想看的,但它们都”命中”了我,算法很清楚哪些东西能让我多停留三秒。

For You 推给我的确实是我”感兴趣”的东西,但它同时还在做另一件事:不断试探我的情绪和认知边界,用新鲜刺激维持我的停留。这不是 bug,是它被设计出来的目的。它服务的是平台的停留时长,不是我的脑子。


回到 RSS 呢?我认真试过一段时间。

RSS 的好处是信息源由我自己挑,没有算法在中间替我做决定;坏处也一样明显。一是它只按时间排序,订阅十几个源还行,订阅了 Hacker News、几十个博客、几个 YouTube 频道之后,打开阅读器看到 800 条未读,只想关掉。二是语言壁垒,我订阅的源里中英文混着,碰到长英文文章就有额外的阅读门槛。

RSS 把选择权还给了我,但没解决效率问题。 它假设我愿意一条一条翻,但我其实只想看其中真正关心的那部分。


所以我做了 FeedSense。它不是推荐系统的反面,而是把推荐系统的方向掉过来:只基于我自己选的源,只学习我过去读过什么,不主动试图拓展我的兴趣边界。

具体来说有三条:

  • 源永远只来自我主动添加的。RSS、网站、YouTube 频道都行,系统不会凭空塞给我”你可能会喜欢”的新账号。
  • 排序基于我过去读过什么,不基于外推。不猜我”可能还会感兴趣”的新领域,也不拿情绪化内容来试探我的反应。
  • AI 只做两件事:翻译和总结。让英文博客、长文、YouTube 视频在 Feed 流里也有接近 FYP 那种顺滑的消费感。

排序那部分我自己实现了一套算法:维护一个滚动窗口来推断我最近的爱好,每一次点击、收藏、阅读操作都会更新这个窗口;再用聚类算法从窗口里得到一个当下的兴趣向量,叠加时间衰减等因素,最终决定每一条内容的排序。窗口是滚动的,意味着最近几周没在看的话题会自然从我的 Feed 里淡出,而不是靠平台”再推一条看看反应”来维持热度。

最重要的是,我不需要考虑”用户停留时长”这类指标。用户累了就关掉好了,用色情、政治、冲突这些东西把人强行留下来,也许有商业价值,但我不喜欢做这样的事。

FeedSense 的 For You 界面
FeedSense 的 For You:只来自你订阅的源,按你读过什么排序

换个比喻可能更清楚。FYP 页面像去饭店吃饭:菜好吃,但你不知道用了什么料,也不知道为什么今天给你上这道菜,是真的适合你,还是后厨想清库存。RSS 像自己买菜做饭:每样食材都清清楚楚,但过程累人,你常常没时间。FeedSense 更像一个家庭厨师:食材我挑,怎么做给我吃、按什么顺序上菜,他来。


用了一段时间之后,我少了很多乐子,X 上的各种梗和 meme 都看不到了。但情绪波动也少了很多,真正关心的信息也能及时看到。FeedSense 帮我消除了噪音,也打破了语言的壁垒(我的英语阅读效率比中文低不少)。

感兴趣的话,也可以去 App Store 下载试试:https://apps.apple.com/app/id6760609052