在上篇中,我们探讨了副屏的硬件部署。对我而言,副屏最核心的需求是准实时地展示我感兴趣的最新资讯。传统上,这往往需要一个复杂的推荐系统来支持;但借助LLM的强大能力,我们可以通过极简的配置(Almost One-Shot),构建一个专属于个人的精准推荐流。
为此,我开发了 AI-News-Dashboard 项目。其实践思路是:利用 RSS/API 从多种渠道广泛召回新闻,使用 LLM 根据我的个人偏好对每条内容进行评分,最后结合 时间衰减算法 生成一个兼顾时效性与精准度的推荐榜单。

你可以通过以下两个 Demo 体验不同偏好下的推荐效果:
- Demo 1(科技/AI/航天向): https://kindledash.t0saki.com/
- Demo 2(医疗/本地生活向): https://parentdash.t0saki.com/
技术实现细节
1. 新闻获取(召回层)
目前主要通过 RSS 协议进行广泛的内容拉取,这是目前最通用的网页聚合方案。针对 RSS 的配置,主要的实现策略如下:
- 原生支持:优先查找目标网站是否直接提供 RSS 接口。
- RSSHub:对于未提供接口的站点(包括许多国内平台),利用强大的 RSSHub 项目将其转化为 RSS 订阅源。
- Google News:对于来源不固定的话题,构建 Google News RSS Feed 的 URL 参数是一个高效技巧。它可以直接抓取特定关键字的搜索结果,省去了维护特定站点列表的繁琐。
获取到的新闻及后续处理结果都会存入 SQLite 数据库。主程序会定期轮询,仅存储增量内容以供后续处理。
2. 个性化偏好设定
为了让 LLM 准确理解我的需求,Prompt 的设计至关重要。我在 Prompt 中详细定义了感兴趣的领域,并提供了几个具体的打分示例(Few-Shot),让 LLM 模仿我的标准进行评分。实践证明,LLM 在这种任务中表现出色,且调整偏好只需修改 Prompt 即可,非常灵活。
3. LLM 处理流程(粗排与精排)
在这个流程中,每条新闻会经过两轮 LLM 处理,分别承担不同的任务:
-
第一轮(粗排): 使用轻量级模型(如
gemini-2.5-flash-lite)。- 任务:根据偏好快速筛选出“可能感兴趣”的新闻。
- 目的:在信噪比较低的新闻源中,使用低成本模型进行初筛,大幅降低后续高精度处理的开销。
-
第二轮(精排与重写): 使用更高智能的模型(如
gemini-3-flash-preview)。- 任务:不仅要对新闻进行精准打分,还需要结合标题与摘要进行标题重写。
- 目的:解决中文源通常存在的“标题党”或信息密度低的问题,同时提高非母语(英语)内容的阅读效率。最终输出的是优化后的标题及其推荐分数。
4. 排序算法(重排)
经过 LLM 处理后,我们得到了一组带有分数的候选新闻。如果仅按分数排序,可能会导致榜单被高分旧闻占据。因此,我引入了类似 Hacker News 的 重力排序算法(Gravity Sort),通过调整超参数,在“内容重要性”和“时效性”之间取得平衡,从而生成一份既精准又及时的推荐榜单。
5. 去重机制
由于订阅了多个重叠的信源,同一条热门新闻(如 Claude Opus 4.6 发布)可能会刷屏。目前的去重机制较为基础:仅在 Prompt 中指示 LLM 若在同一个 Batch 内发现重复内容则进行整合。
- 局限:跨 Batch 的重复内容难以处理。
- 未来改进:理论上可以通过编辑距离或文本向量化(Embedding)进行相似度匹配,从而实现跨批次的语义去重。
6. 输出与展示
项目最终会生成两份 JSON 数据:
dashboard.json:包含过去 24 小时的完整榜单,供网页端使用。top5.json:精简版,专供 Kindle 副屏展示(详见上篇)。
服务端使用 Nginx 托管静态文件,实际上充当了一个定时更新的 API 服务器。前端页面(即开头的 Demo)通过请求该 API 进行渲染。
总结
本项目本质上是利用现代 LLM 极强的语义理解能力,构建了一个单用户推荐系统。其流程完美对应了推荐系统经典的四个阶段:召回(RSS)→ 粗排(Flash-Lite)→ 精排(Flash-Preview)→ 重排(重力算法)。
与传统推荐系统相比,这种方案的特点非常鲜明:
- 优势:不依赖历史行为数据(冷启动友好),完全可控,API 化获取。
- 劣势:语义去重尚不完美;偏好更新依赖手动调整 Prompt(缺乏自动反馈闭环);多用户扩展成本较高。
如果你也希望摆脱算法黑箱,用一种可控、透明的方式构建个性化信息流,这个项目的思路或许能给你带来一些启发。